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
实际上存在
# 1 楼答案
请注意:当B扩展A时,所有B都是A,但不是相反
所以在你的例子中,Binstance是一个A,然后不能访问B的
printStuff
方法要使代码正常工作,需要强制BinInstance为B类型;这在java中称为强制转换
所以这应该行得通:
(A(Binstance).printStuff();
编码快乐
# 2 楼答案
在编译期间,我们只知道binInstance对象的类型是A,这意味着它对printStuff()方法(您在类B中声明的方法)一无所知,这就是为什么会出现该错误
现在,你有两个选择:
你可以用石膏
您可以将类A抽象化,并创建一个抽象方法-printStuff()
# 3 楼答案
Binstance
被声明为具有类型A
,并且printStuff()
不是在A
中声明的,而是在B
中声明的。在这种情况下,只有A
的方法可见。方法在那里,但不可见。要使其可见,请将Binstance
声明为B