我不了解Java继承

时间:2014-06-15 21:15:42

标签: java inheritance

它不起作用,我不知道为什么......我是java世界的新手。

public class Mixed2 {
    public static void main(String[] args) {
        A c = new C();
        c.m1();
        c.m2();
        c.m3("My text");
    }
}
class A {
    void m1() {
        System.out.print("A's m1, ");
    }
}
class B extends A {
    void m2() {
        System.out.print("B's m2, ");
    }
}
class C extends B {
    void m3(Object text) {
        System.out.print("C's m3, " + text);
    }
}

Mixed2.java:5: error: cannot find symbol
        c.m2();
         ^
  symbol:   method m2()
  location: variable c of type A
Mixed2.java:6: error: cannot find symbol
        c.m3("My text");
         ^
  symbol:   method m3(String)
  location: variable c of type A
2 errors

是因为A没有m2和m3方法?如果我放入A m2和m3它可以工作,但是B m2和C m3被调用。我不明白。

2 个答案:

答案 0 :(得分:4)

  1. 您的代码中没有使用多态性。
  2. 您的变量是A变量,因此此类型不存在m2和m3方法,并且无法在不进行强制转换的情况下使用,这会违背OOP的目的。
  3. 我会将B中的方法m2()重命名为m1(),然后您将获得真正的多态性:

    class B extends A {
    
        @Override
        public void m1() {
            // do you want to call the super's method here?
            // if so, then call
            // super.m1();
    
            System.out.print("B's m1, ");
        }
    }
    

    类c的m3方法需要一个参数,因此多态性不会对它起作用,因为它的签名不能与m1的签名相匹配。


    修改
    你在评论中提问:

      

    抱歉是关于继承和。我不知道...是A类型的参考,它保留了C型物体...那么c应该对m3有所了解吗?

    您的c变量是引用C对象的A类型变量。只有A方法可用于该变量,除非您明确地将其转换为其他方法:

    ((C)c).m3("foo");
    

    这是脆弱和丑陋的代码。如果要演示多态,那么子类方法应该覆盖父方法。

答案 1 :(得分:1)

虽然您构建了C类型的对象,但对象的引用属于A类型。
您可以这样做,因为CA的子类,但您只能访问A中声明的方法。