教授Java的资源似乎对是否可以同时覆盖父类的方法并从子类中创建新方法有相互矛盾的答案。当我尝试以下操作时:
class ABC{
//Overridden Method
public void disp(){
System.out.println("disp() method of parent");
}
}
class DEF extends ABC{
//Overriding Method
public void disp(){
System.out.println("disp() method of child");
}
//new method in the subclass
public void newMethod(){
System.out.println("new method of child class");
}
public static void main(String args[]){
ABC obj = new ABC();
obj.disp();
ABC obj2 = new DEF();
obj2.disp();
obj2.newMethod();
}
}
Java 抛出"找不到符号"错误。我错过了什么吗?奇怪的是,一个人不能同时做这两件事,但我似乎无法逃脱这个错误。
如果你有一个对对象的引用,其中变量定义为ABC
,那么你只能调用在类ABC
上定义的方法。即使底层对象是DEF
类型,变量本身也被定义为保存一个ABC
。
尝试从下面更改代码:
ABC obj2 = new DEF();
对此:
DEF obj2 = new DEF();
它将起作用,因为您将obj2
定义为类型DEF
。
下面是另一个显示字符串创建的示例,首先为类型String
定义变量,另一个类型定义为Object
。
String s = new String();
s.charAt(99); <-- this is valid on a String
Object o = new String();
o.charAt(99); <-- same thing, but not allowed on Object
解决方法是使用instanceof
检查obj2
是否实际上是DEF
的实例,如果是,请通过强制转换它暂时像DEF
一样使用它,如下所示:
if (obj2 instanceof DEF) {
((DEF) obj2).newMethod();
}
这里ABC是超类,DEF是子类。 所以当你做ABC obj2 = new DEF();
时,obj2 只能访问 ABC 中定义的那些函数。由于 ABC 中未定义newMethod()
,因此不能使用 obj2 调用它。