java无法识别我正在声明子类,并且找不到成员方法

mmvthczy  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(308)

这个问题在这里已经有答案了

从超类调用子类方法(5个答案)
“找不到符号”或“无法解析符号”错误是什么意思(15个答案)
21天前关门了。
我做了一个小玩具程序来复制我在一个更大的项目中遇到的问题。在下面的代码中,类 A 是哪个类的父类 B 继承。班级 B 添加一个名为 PrintStuff . 在main方法中,我声明类 B 通过提供它的超类。我之所以这样做是因为与实际用例相关的原因:

package com.company;
import java.lang.String;

class A {
    String x;

    A(String value) {
        x = value;
    }
}

class B extends A {
    B(String value) {
        super(value);
    }

    void printStuff() {
        System.out.println(x);
    }
}

public class test {
    public static void main(String[] args) {
        A Binstance = new B("B instance");

        Binstance.printStuff();
    }
}

但是,由于以下原因,程序无法编译:

C:\Users\me\Desktop\Library\src\com\company\test.java:28:18
java: cannot find symbol
  symbol:   method printStuff()
  location: variable Binstance of type com.company.

为什么java不能认识到实际上我正在示例化一个类的对象 B ? 如何让编译器识别一个方法 printStuff 事实上存在吗?

monwx1rj

monwx1rj1#

在编译期间,我们只知道binInstance对象的类型是a,这意味着它对printstuff()方法(在类b中声明的)一无所知,这就是为什么会出现这种错误。
现在,您有两个选择:
你可以用石膏

public static void main(String[] args) {
     A Binstance = new B("B instance");

     ((B)Binstance).printStuff(); //casting Binstance to B
 }

您可以将类设为抽象类并创建一个抽象方法-printstuff()

abstract class A {

     abstract void printStuff();
 }
7rfyedvj

7rfyedvj2#

Binstance 声明为具有类型 A 以及 printStuff() 未在中声明 A ,但在 B . 唯一的方法 A 在这种情况下是可见的。方法在那里,但不可见。要使其可见,请声明 Binstance 作为 B .

B Binstance = new B("B instance");
Binstance.printStuff();
dgenwo3n

dgenwo3n3#

注意:当b扩展a时,所有b都是a,但不是相反。
所以在您的情况下,binstance是a,然后无法访问 printStuff b方法。
要使代码正常工作,需要强制binstance为b类型;这在java中称为cast。
所以这应该有效: (A(Binstance).printStuff(); 快乐的编码!

相关问题