gpt4 book ai didi

java - 抽象类 : Why newInstance() is not giving compilation error but constructor call gives error?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:52 36 4
gpt4 key购买 nike

编译器知道AbstractDemo是一个抽象类,抽象类不能被实例化。

但是当我调用 newInstance() 方法时,为什么它没有给出编译时错误?

import java.lang.reflect.Constructor;

public abstract class AbstractDemo{
public AbstractDemo(){
System.out.println("Default constructor");
}
public static void main(String args[]){
try{
/* No compilation error for this statement */
AbstractDemo demo = AbstractDemo.class.newInstance();

Constructor[] ctors = AbstractDemo.class.getDeclaredConstructors();
for ( int i=0; i < ctors.length; i++){
System.out.println(ctors[i]);
/* No compilation error for this statement too */
AbstractDemo demo1 = (AbstractDemo) ctors[i].newInstance();
}
/* Compilation error here */
// AbstractDemo demo2 = new AbstractDemo();
}catch(Exception err){
err.printStackTrace();
}
}
}

我运行这个程序时的输出:(我知道会出现错误,因为我无法为抽象类创建实例。但是为什么在编译时没有给出它让我感到惊讶)

D:\Study\Java>java AbstractDemo

java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at AbstractDemo.main(AbstractDemo.java:10)

编辑:

编译器会智能地给出此语句的错误:

AbstractDemo demo2 = new AbstractDemo(); 

但不是为了这个声明

AbstractDemo demo = AbstractDemo.class.newInstance(); 

我是否遗漏了任何关键类(class)?

最佳答案

编译器的工作是检查编译时规则(呃,编译代码)。您调用的方法是 Class#newInstance,与 AbstractDemo 没有任何(直接)相关的内容。 Class#newInstance 会抛出异常(因为您调用它的 Class 实例是针对抽象类的)是一个运行时问题。

虽然从理论上讲,有时可能会在编译时确定对 Class 的特定实例的特定引用是指抽象类(例如as AbstractDemo.class),通常是不可能的,例如:

void someMethodInMyOwnClass(Class c) {
Object o = c.newInstance();
}

即使是这样,我们也需要某种内置规则或注释系统(例如,编译时信息)来说明“如果 Class 实例指的是一个抽象类。"

所以我们谈论的是非平凡的工作,做这些工作没有真正的值(value),有时是编译时错误,有时是运行时错误。

考虑:编译器也可以算出这会抛出 NPE:

String s = null;
if (s.equalsIgnoreCase("foo")) {
// ...
}

或者这个循环体永远不会被执行:

int x = 10;
while (x < 10) {
System.out.println("Never gets here");
}

但我们没有这样做;这些是运行时问题。

关于java - 抽象类 : Why newInstance() is not giving compilation error but constructor call gives error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34618687/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com