我正在攻读本科学位,我的教授给了我一个任务,他说:创建一个没有使用任何访问修饰符或接口关键字的类,该类的对象无法被创建。
我在谷歌上查找,但找不到解决方案。这个问题如何在Java中实现?
我正在攻读本科学位,我的教授给了我一个任务,他说:创建一个没有使用任何访问修饰符或接口关键字的类,该类的对象无法被创建。
我在谷歌上查找,但找不到解决方案。这个问题如何在Java中实现?
枚举是类(JLS§8.9),不能实例化和子类化;只需创建一个没有任何值的枚举:
enum Foo {}
其他可能性根据不同的解释而异:
JonK 和 T.J. Crowder 考虑从构造函数中抛出异常:
final class Example {
Example() {
throw new Exception();
}
}
但是 nick zoum 指出,一个实例在异常之前仍然会被创建并存在于系统中,即使在上面的例子中无法保留该实例。
nick zoum 考虑使用 abstract
:
abstract class Example {
}
... 但是T.J. Crowder 指出,abstract
类可以被子类继承(它们不能是 final
), 而一个子类实例"是一个"超类实例。
new
与它们,并且唯一的实例是它们的值。因此,没有值的枚举是一个无法实例化的类(除非可能通过操作字节码,我认为任何合理的人都会同意这是超出界限的)。 - T.J. Crowder我不擅长Java,但是其他答案给了我这个想法:
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Object o = new Problematic();
// unreachable
}
}
class Problematic
{
static
{
int i = 1 / 0 ;
}
}
我相信没有办法使一个叫做Problematic
的东西能够幸存...
(注意,当我在静态初始化程序中尝试使用throw new Exception();
时,它无法编译)
throw new RuntimeException();
应该在静态初始化程序中起作用。 - kapexException
一样。 - AakashMTest
。 - T.J. Crowderfinal abstract
类将无法编译。 - T.J. Crowdernew Test() {} instanceof Test
是正确的。使用 abstract
并不是这个问题的有效答案。 - Andy Turner匿名内部类应该是答案。
示例:
public abstract class HelloWorld{
abstract void x();
public static void main(String []args){
System.out.println("Hello World");
HelloWorld h = new HelloWorld(){
void x(){
System.out.println(" ");
}
};
h.x();
}
}
HelloWorld
类,并提供了x()
方法的实现。没有听到您的教授具体说法,"不使用任何访问修饰符"可能意味着他们试图教您如何使用"默认"访问修饰符?
如果是这样的话:
package mypackage.nocreate;
class MyClass {
}
然后:
package mypackage;
import mypackage.nocreate.MyClass;
public class Test {
public static void main(String[] args) {
new MyClass(); // not allowed - in a different package
}
}
enum Foo {}
。 - Andy Turner