假设我有一个抽象类,其中有一个非抽象方法。我尝试创建引用类型对象并访问该非抽象方法。它给了我一个编译错误。下面的程序对此进行了演示。
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();
}
}
这就是我得到的输出,
Variable ob might not have been initialized
如果我假设以上内容为真,那么为什么在下面的程序中允许相同的内容。在下面的 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);
}
}
这个 Applet 如何允许我做同样的事情?
最佳答案
你理解错了,在下面的代码中 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();
关于java - 为什么在创建抽象类的引用类型对象和访问其自己的成员时存在这种差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17120294/