创建一个无法创建其对象的类

时间:2016-10-25 08:04:24

标签: java class object access-modifiers

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

我通过谷歌但无法找到解决方案。如何在Java中完成?

5 个答案:

答案 0 :(得分:12)

枚举是类(JLS§8.9),无法实例化且无法进行子类化;只需创建一个没有任何值的文件:

enum Foo {}

取决于解释的其他可能性:

JonKT.J. Crowder考虑​​从构造函数中抛出异常:

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

nick zoum指出在异常之前仍然创建并暂时存在一个实例,即使它不能(在上面的例子中)保留。

nick zoum考虑​​abstract

abstract class Example {
}

...但是T.J. Crowder指出abstract类可以是子类(它们不能是final),而子类实例"是"超类实例。

答案 1 :(得分:6)

我不是一个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();时,它将无法编译)

答案 2 :(得分:3)

您是否尝试过关键字abstract

例如:

abstract class Test{}

当然这可以被覆盖,所以请查看this answer以获得更加简单的设计。

答案 3 :(得分:0)

匿名内部课程应该是答案。

示例:

$date = DateTime::createFromFormat('mY', $data->month.$data->year);
$curdate = new DateTime(date('mY'));

$diff = $curdate->diff($date);
echo('days:' .$diff->days);
echo('months:' .$diff->m); 

创建一个类,但它的名称由扩展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方法的实现。

答案 4 :(得分:0)

没有准确地听到你的教授如何措辞,"没有使用任何访问修饰符"可能意味着他们正在试图教你如何"默认"访问修饰符有效吗?

在哪种情况下:

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

你可以说 - 至少在源代码中 - 没有使用任何访问修饰符:)