为什么要创建抽象类的变量?

问题:为什么可以声明抽象类的变量,然后将该变量设置为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(); } 

}

您必须了解两个不同的概念,变量和实例。

您可以将变量视为某事物的持有者,因此您可以创建一个抽象类型的变量,如GraphicObject。

当你这样做时:

 GraphicObject myVar = null; 

你说,myVar是GraphicObject类型的持有者,它什么都没有。

所以当你这样做时:

 myVar.meMethod3(); 

你告诉’没有人’做我方法3();

但如果你这样做:

 GraphicObject myVar = new GraphicObjectImpl(); myVar.meMethod3(); 

然后你告诉’有人’做meMethod3();

为此,您需要创建一个“非抽象”,可实例化的类,它inheritance(或扩展)GraphicObject,在本例中为GraphicObjectImpl:

 public class GraphicObjectImpl extends GraphicObject { void draw() { } String meMethod1() { return null; } void meMethod2() { } } 

从父抽象类实现所有抽象方法也是必需的。

您可以稍后重用“o”并将其设置为GraphicObject的一些具体实现。

我们只能为抽象类声明一个处理程序,它可以用来保存派生的具体类的对象。 这样做是为了促进运行时多态性。

为了回答这个问题,我首先要确保你知道抽象类是什么。 这是我第一次学习如何编程时被告知如何考虑抽象类的概念。

让我们假设您正在编写一个动物园模拟器,并且因为您喜欢使用良好的OOP类结构,所以您决定制作一些类来代表您的动物。 所以你制作Lion,Tiger和Bear课程(哦,我的),并意识到他们的代码是相同的。 因此,您决定创建一个无法实例化的抽象动物类。 现在抽象类的重点是你不能像这样创建一个新的实例:

 Animal animal = new Animal(); 

您决定这适用于您的模拟器,因为您不想将常规动物添加到您的动物园,您想要将特定动物添加到您的动物园,因此抽象类是正确的想法。 因此,抽象类的概念是:当您需要特定类扩展的通用类时,将使用抽象类。

现在在你的场景中你做到了:

 GraphicObject o = null; 

那么,当我们无法实例化抽象类时,为什么我们可以这样做呢? 因为我们没有 ,当你将o设置为null时,你不是在创建一个新对象,因此这是有效的代码。 最后你的行看起来像这样:

 o.meMethod3(); 

我们可以看到这是有效的代码,这意味着它编译得很好,但我敢打赌,如果你要运行它,你会得到一个NullPointerException因为你试图对没有值的变量做一些事情。

所以再次总结一下:抽象类概念背后的原因是有时你想要编写将在许多其他类中重用的代码,但是你不想创建该类的实例,因为它应该是一般的。