问题:为什么可以声明抽象类的变量,然后将该变量设置为null,然后无法访问任何方法。这个抽象类概念背后的原因是什么?
类:
package ReadWriteFile;
public abstract class GraphicObject {
int home = 100;
final int score = 0;
abstract void draw();
abstract String meMethod1();
abstract void meMethod2();
void meMethod3() {
System.out.println("test");;
}
public static void main(String[] i){
GraphicObject o = null;
o.meMethod3();
}
}
答案 0 :(得分:7)
您必须了解两个不同的概念,变量和实例。
您可以将变量视为某事物的持有者,因此您可以创建一个抽象类型的变量,如GraphicObject。
当你这样做时:
GraphicObject myVar = null;
你说,myVar是GraphicObject类型的持有者,它什么也没有。
所以当你这样做时:
myVar.meMethod3();
你告诉'没有人'做我方法3();
但如果你这样做:
GraphicObject myVar = new GraphicObjectImpl();
myVar.meMethod3();
然后你告诉'oneoneone'做meMethod3();
为此,您需要创建一个“非抽象”,可实例化的类,它继承(或扩展)GraphicObject,在本例中为GraphicObjectImpl:
public class GraphicObjectImpl extends GraphicObject {
void draw()
{
}
String meMethod1()
{
return null;
}
void meMethod2()
{
}
}
从父抽象类实现所有抽象方法也是必需的。
答案 1 :(得分:2)
您可以稍后重复使用“o”并将其设置为GraphicObject的一些具体实现。
答案 2 :(得分:2)
我们只能为抽象类声明一个处理程序,它可以用来保存派生的具体类的对象。这样做是为了促进运行时多态性。
答案 3 :(得分:2)
为了回答这个问题,我首先要确保你知道抽象类是什么。当我第一次学习如何编程时,我就被告知如何考虑抽象类的概念。
假设您正在编写动物园模拟器,并且因为您喜欢使用良好的OOP类结构,您决定制作一些类来代表您的动物。所以你制作Lion,Tiger和Bear课程(哦,我的),并意识到他们的代码是相同的。因此,您决定创建一个无法实例化的抽象动物类。现在,抽象类的重点在于你无法像这样建立一个新的实例:
Animal animal = new Animal();
您认为这适用于您的模拟器,因为您不想将一般动物添加到您的动物园,您想要将特定的动物添加到您的动物园等等抽象类是正确的想法。因此,抽象类的概念是:当您需要特定类扩展的通用类时,将使用抽象类。
现在,在您的方案中,您执行了此操作:
GraphicObject o = null;
那么为什么我们不能实例化一个抽象类呢?因为没有,所以当您将o
设置为null时,您不会创建新对象,因此这是有效的代码。最后你的行看起来像这样:
o.meMethod3();
我们可以看到这是有效的代码,这意味着它编译得很好,但我敢打赌,如果你要运行它,你会得到一个NullPointerException
,因为你试图对一个没有的变量做一些事情价值。
所以再次总结一下:抽象类概念背后的原因是有时你想编写将在很多其他类中重用的代码,但是你不想创建一个这样的实例因为它应该是一般的。