创建一个 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 ;
}
}
我很确定没有办法制作 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
}
}
您可能会争辩说 - 至少在源代码中 - 它没有使用任何访问修饰符:)
我正在攻读学士学位,我的教授给了我一个任务,他说:创建一个 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 ;
}
}
我很确定没有办法制作 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
}
}
您可能会争辩说 - 至少在源代码中 - 它没有使用任何访问修饰符:)