1

考虑我有一个带有非抽象方法的抽象类。我尝试创建引用类型对象并访问该非抽象方法..它给了我一个编译错误。下面的程序演示了它。

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);
    }
}

这个小程序如何让我做同样的事情?

4

2 回答 2

3

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

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

要调用此方法,调用者绝对应该创建一个type 的具体实例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();
于 2013-06-15T04:56:38.297 回答
1

两件事情:

  1. 你不能实例化类
  2. 您只为抽象类而不是对象创建了引用。要调用任何实例方法,您需要有一个对象而不仅仅是引用。但在这种情况下,您将无法创建实例。

所以简而言之,你将无法实现你想要做的事情。有两种方法可以调用抽象类的非抽象方法:

  1. 创建一个子类并使用它的对象,您可以调用抽象类的非抽象方法。您可以使用您的子类或父类的引用,如果您没有覆盖该方法,那么对非抽象方法的调用将始终调用父类方法。

  2. 将方法设为静态并使用父类的引用调用它。

于 2013-06-15T04:56:33.067 回答