为什么在创建抽象类的引用类型对象和访问自己的成员时存在这种差异?

时间:2013-06-15 04:51:55

标签: java oop abstract-class

考虑我有一个抽象类,其中包含非抽象方法。我尝试创建引用类型对象并访问非抽象方法..它给我一个编译错误。以下程序演示了它。

abstract class A
{
    public void print()
    {
        System.out.println("this is the print method");
    }
}

class test
{
    public static void main(String args[])
    {
        A ob;
        ob.print();
    }
}

然后这是我得到的输出,

  

变量ob可能尚未初始化

如果我假设上述内容为真,那么为什么在以下程序中允许相同的内容。在下面的Applet中,我使用paint()方法作为入口点。所以,在这里我创建一个预定义类Graphics的引用类型对象(一个抽象类),并尝试访问它的drawString()方法,然后没有编译错误..像这样 - >

import java.applet.*;
import java.awt.*;

public class apptest extends Applet
{
    public void paint(Graphics g)// Graphics is an abstract class
    {
        String s="this is an applet";
        g.drawString(s,20,20);
    }
}

这个小程序如何允许我这样做?

2 个答案:

答案 0 :(得分:3)

你理解错了,在下面的代码Graphics是一个方法的参数,即使它是一个抽象类

    public void paint(Graphics g)// Graphics is an abstract class
    {
    String s="this is an applet";
    g.drawString(s,20,20);
    }

要调用此方法,调用者肯定会创建类型为Graphics具体实例。像下面的东西

Graphics g = new TwoDGraphics(); // TwoDGraphics extends Graphics, and a non abstract class
applet.paint(g);

回到你的例子..使用未初始化变量时出错

A ob; --> its not initialized
ob.print();

以下代码应该有效。

A ob = new A() {
  //created an anonymous implementation of abstract A
}
ob.print();

答案 1 :(得分:1)

两件事:

  1. 您无法实例化该课程
  2. 您只为您的abstaract类创建了引用,而不是对象。对于caling任何实例方法,您需要一个对象而不仅仅是引用。但在这种情况下,您将无法创建实例。
  3. 所以总之,你将无法实现你想要做的事情。有两种方法可以调用abstrac类的非抽象方法:

    1. 创建子类并使用其对象可以调用抽象类的非抽象方法。您可以使用子类或父类的引用,如果您没有重写该方法,则调用非抽象方法将始终调用父类方法。

    2. 将方法设为静态,并使用parent clas的引用调用它。