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

标签 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();
    }
}

这就是我得到的输出,

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/

相关文章:

java - 如何将用户定义的对象从 angularjs 传递到 REST 服务

java - 为什么 BFS 在这种情况下不保证最小成本路径?

java - 无法解析方法ComputeDistanceBetween

c# - 如何停止并确保 OOP 代码正常工作?

JavaScript 原型(prototype)继承 - 函数未呈现正确的警报

java:传递一个对象并返回相同对象的类型

java - 如何在 Apache Spark Pipeline 中打印最佳模型参数?

c# - 内部抽象类 : how to hide usage outside assembly?

design-patterns - 是否建议从该抽象类中的方法调用抽象方法

c++ - 在C++中,为什么使用静态类函数而不是常规函数?