考虑我有一个抽象类,其中包含非抽象方法。我尝试创建引用类型对象并访问非抽象方法..它给我一个编译错误。以下程序演示了它。
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);
}
}
这个小程序如何允许我这样做?
答案 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)
两件事:
所以总之,你将无法实现你想要做的事情。有两种方法可以调用abstrac类的非抽象方法:
创建子类并使用其对象可以调用抽象类的非抽象方法。您可以使用子类或父类的引用,如果您没有重写该方法,则调用非抽象方法将始终调用父类方法。
将方法设为静态,并使用parent clas的引用调用它。