接口和抽象类能被实例化吗?
查看完整题解
参考回答
直接回答
接口与抽象类都不能被直接实例化。可以创建实现它们的具体类,也可以用匿名类创建一个具体实现。看到 new 接口名() { ... } 或 new 抽象类名() { ... },不代表限制被绕过,而是编译器在定义并实例化一个匿名子类型。
讲清原理
抽象类型可以声明尚未完成的行为,因此不能直接保证新对象拥有全部所需实现。具体子类必须满足相关要求;如果仍有未实现的抽象方法,就要继续保持 abstract。
函数式接口还可以作为 lambda 的目标类型,但不是所有接口都能这样使用。是否属于函数式接口,需要按抽象方法的规则判断,不能看到 interface 就认为可以写一个箭头函数替代。
例子与易错点
abstract class Greeting { abstract String text(); }
Greeting greeting = new Greeting() {
String text() { return "你好"; }
};
System.out.println(greeting.text()); // 你好
System.out.println(greeting.getClass() == Greeting.class); // false
创建的是匿名子类实例,而变量仍按 Greeting 使用。new Greeting() 后面没有实现类体则不成立。抽象类有构造器并不矛盾:它的构造器负责初始化具体子类对象中的父类部分。
相关题:第 9 题、第 21 题、第 28 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。