有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我制作了一个小玩具程序来复制我在一个更大的项目中遇到的一个问题。在下面的代码中,类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实际上存在


共 (3) 个答案

  1. # 1 楼答案

    请注意:当B扩展A时,所有B都是A,但不是相反

    所以在你的例子中,Binstance是一个A,然后不能访问B的printStuff方法

    要使代码正常工作,需要强制BinInstance为B类型;这在java中称为强制转换

    所以这应该行得通:(A(Binstance).printStuff();

    编码快乐

  2. # 2 楼答案

    在编译期间,我们只知道binInstance对象的类型是A,这意味着它对printStuff()方法(您在类B中声明的方法)一无所知,这就是为什么会出现该错误

    现在,你有两个选择:

    1. 你可以用石膏

       public static void main(String[] args) {
           A Binstance = new B("B instance");
      
           ((B)Binstance).printStuff(); //casting Binstance to B
       }
      
    2. 您可以将类A抽象化,并创建一个抽象方法-printStuff()

       abstract class A {
      
           abstract void printStuff();
       }
      
  3. # 3 楼答案

    Binstance被声明为具有类型A,并且printStuff()不是在A中声明的,而是在B中声明的。在这种情况下,只有A的方法可见。方法在那里,但不可见。要使其可见,请将Binstance声明为B

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