创建一个 Class 其对象无法创建

Create a Class whose object can not be created

我正在攻读学士学位,我的教授给了我一个任务,他说:创建一个 class 不使用任何访问修饰符或接口关键字,其对象无法创建。

我已完成 Google 但找不到解决方案。如何在 Java 中完成?

你试过关键词abstract了吗?

例如:

abstract class Test{}

当然可以改写,所以请查看更简单的设计。

枚举是类(JLS§8.9),不能被实例化,也不能被子类化;只创建一个没有任何值的:

enum Foo {}

其他可能性取决于解释:

JonK and T.J. Crowder 考虑从构造函数中抛出异常:

final class Example {
    Example() {
        throw new Exception();
    }
}

但是 nick zoum 指出在异常发生之前,实例仍然被创建并存在,即使它不能(在上面的示例中)被保留。

nick zoum 认为 abstract:

abstract class Example {
}

...但是T.J. Crowder指出abstract类可以被子类化(他们不能是final),一个子类实例"is a"超类实例。

我不是 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 ;
    }
}

Try it on ideone

我很确定没有办法制作 Problematic 并幸存...

(请注意,当我在静态初始化程序中尝试 throw new Exception(); 时,它不会编译)

匿名内心class应该是答案

示例:

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(); 
    } 
}

创建了一个 class,但它的名称由扩展 HelloWorld class 并提供 x() 方法的实现的编译器决定。

如果没有听清楚您教授的措辞,"without using any access-modifier" 可能意味着他们正试图教您 "default" 访问修饰符的工作原理?

在这种情况下:

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
    }
}

您可能会争辩说 - 至少在源代码中 - 它没有使用任何访问修饰符:)