Java子分类:重写并创建新方法

-1 java overriding extend subclassing

教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();
     }
}
Run Code Online (Sandbox Code Playgroud)

Java引发“找不到符号”错误。有什么我想念的吗?一次不能同时做这两项似乎很奇怪,但我似乎无法逃脱这一错误。

kaa*_*aan 6

如果您引用了将变量定义为的对象,ABC则只能调用在类上定义的方法ABC。即使基础对象是类型的DEF,变量本身也被定义为保存一个ABC

尝试从中更改代码:

ABC obj2 = new DEF();
Run Code Online (Sandbox Code Playgroud)

对此:

DEF obj2 = new DEF();
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为您要定义obj2为type DEF

这是另一个显示字符串创建的示例,首先创建一个为type定义的变量String,然后另一个为type定义的变量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
Run Code Online (Sandbox Code Playgroud)

一种解决方法是使用instanceof来检查obj2实际上是否是的实例DEF,如果是,则DEF通过强制转换将其暂时用作a 的实例,如下所示:

if (obj2 instanceof DEF) {
    ((DEF) obj2).newMethod();
}
Run Code Online (Sandbox Code Playgroud)