Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在创建抽象类的引用类型对象和访问它自己的成员时会有这种差异?_Java_Oop_Abstract Class - Fatal编程技术网

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

Java 为什么在创建抽象类的引用类型对象和访问它自己的成员时会有这种差异?,java,oop,abstract-class,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

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

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可能尚未初始化

如果我假设上述为真,那么为什么在下面的程序中允许同样的情况。在下面的小程序中,我使用paint方法作为入口点。因此,这里我创建了一个预定义类Graphicsan抽象类的引用类型对象,并尝试访问它的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);
    }
}
这个小程序如何允许我做同样的事情?

两件事:

不能实例化该类 您只为Abstract类创建了引用,而不是对象。为了校准任何实例方法,您需要一个对象,而不仅仅是引用。但是在这种情况下,您将无法创建实例。 因此,简而言之,你将无法实现你正在努力做的事情。有两种方法可以调用abstrac类的非抽象方法:

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

将该方法设为静态,并使用父类的引用调用它

两件事:

不能实例化该类 您只为Abstract类创建了引用,而不是对象。为了校准任何实例方法,您需要一个对象,而不仅仅是引用。但是在这种情况下,您将无法创建实例。 因此,简而言之,你将无法实现你正在努力做的事情。有两种方法可以调用abstrac类的非抽象方法:

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

将该方法设为静态,并使用父类的引用调用它


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

    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 = new A() {
  //created an anonymous implementation of abstract A
}
ob.print();

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

    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 = new A() {
  //created an anonymous implementation of abstract A
}
ob.print();

我尝试创建引用类型对象并访问非抽象方法,但我在代码中没有看到。您刚刚为该对象创建了一个占位符。@CodeIgnoto ohh。。我想我需要让“ob”指向一些具体的实例类型……你把“抽象”和“未初始化”混淆了。抽象意味着您不能实例化该类,但抽象类的参数或字段仍然可以实例化非抽象的子类。可能是因为您没有正确格式化代码。可能是因为不相关的C标签。可能是因为标点不好。可能是因为这两个程序明显不同,而您正在访问的内容显然根本不是成员。也许上述因素的结合足以让人想到垃圾问题。。。投反对票。或者他们只是觉得脾气暴躁。。。我尝试创建引用类型对象并访问非抽象方法,但我在代码中没有看到。您刚刚为该对象创建了一个占位符。@CodeIgnoto ohh。。我想我需要让“ob”指向一些具体的实例类型……你把“抽象”和“未初始化”混淆了。抽象意味着您不能实例化该类,但抽象类的参数或字段仍然可以实例化非抽象的子类。可能是因为您没有正确格式化代码。可能是因为不相关的C标签。可能是因为标点不好。可能是因为这两个程序明显不同,而您正在访问的内容显然根本不是成员。也许上述因素的结合足以让人想到垃圾问题。。。投反对票。或者他们只是觉得脾气暴躁。。。