我读到Class和Abstract Class之间的主要区别是,抽象类无法实例化,
但我可以为抽象类创建对象
public abstract class Earth {
abstract void sand();
void land() {
}
}
并使用新的关键词我创建了对象,用于抽象
Earth mEarth = new Earth() {
@Override
void sand() {
}
};
我有一些问题在Inet上没有正确答案,
1)是否使用新关键字来实例化该类?
2)实例只是对象吗?
3)是mEarth被称为对象(地球的实例)?
现在我可以调用任何方法(作为回调或值返回) 的 mEarth.sand(); mEarth.land(); 使用地球对象
答案 0 :(得分:5)
您无法创建抽象类:
new Earth(); // <- that's compile time error
但是,您可以像
那样创建非抽象派生类 // New non-abstract (local) class that extends Earth
new Earth() {
// You have to override an abstract method
@Override
void sand() {
...
}
}
问题的答案:
new
关键字会创建新实例。Earth
类的对象,而不仅仅是Object
mEarth
字段声明为Earth
并包含一个扩展类Earth
的对象,因此您可以调用Earth
的任何方法。 答案 1 :(得分:1)
Earth mEarth = new Earth() {
@Override
void sand() {
}
};
mEarth ---参考变量控制,子类对象(地球的匿名子/内部类)
http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
new Earth() {
@Override
void sand() {
}
};
没有名字的班级
1)是否使用新关键字来实例化该类? A)是的
2)实例只是对象吗? A)是
3)mEarth被称为对象(地球的实例)? A)mEarth是引用变量保持子类(匿名实现)对象
答案 2 :(得分:1)
这可以帮到你:
没有好友,你没有在这里创建Abstract Class
的实例。
而是在创建Anonymous Subclass
Abstract Class
的实例。
然后你在抽象类引用上调用指向子类对象的方法。
= new Earth() {};
表示存在匿名实现,而不是对象的简单实例化,对象应该像= new Earth();
一样。抽象类型主要定义为可以&#39 ;创造。我们可以创建它的子类型,但不能创建它本身的子类型。
答案 3 :(得分:1)
1)是的确如此。虽然它并不是最常见的(也是我认为安全的)唯一的方式。
2)据我所知也是。实例意味着您具有类的特殊方面,意味着其实例成员的值(局部变量)等。这些值特定于每个对象的实例。
3)在这里,您要创建一个Earth
的匿名子类的对象(因为Earth
是抽象的,无法实例化)。这意味着您不必专门为您的子类命名,只需提供sand()
的实现,以便具体(并且可以实例化)。