Java 子类:覆盖和创建新方法

Java Sub Classing: Overriding and Making New Methods

关于是否可以覆盖父 class 的方法并从子 class 中创建新方法,教授 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 抛出 "cannot find symbol" 错误。有什么我想念的吗?一个人不能同时做这两件事似乎很奇怪,但我似乎无法避免这个错误。

如果您有一个对象的引用,其中 变量被定义为 ABC,那么您只能调用在 [=40] 上定义的方法=] 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 中定义的那些函数。由于 newMethod() 没有在 ABC 中定义,所以不能使用 obj2.

来调用它