我对Java继承有些不了解

我对Java继承有些不了解,java,inheritance,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, ");

它不起作用,我不知道为什么。。。我是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);
    }
}

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

  • 在代码中没有多态性的用处
  • 您的变量是
    A
    变量,因此m2和m3方法不适用于此类型,并且不能在没有强制转换的情况下使用,这违背了OOP的目的
  • 我将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的签名匹配


    编辑
    你在评论中问:


    抱歉是关于继承和继承的。我不知道。。。是保留C类型对象的a类型引用。。。那么c应该知道m3

    您的c变量是引用c对象的类型变量。只有一个方法可用于该变量,除非您显式将其强制转换为其他对象:

    ((C)c).m3("foo");
    
    这是脆弱而丑陋的代码。如果您想演示多态性,那么您的子类方法应该重写父类方法

  • 在代码中没有多态性的用处
  • 您的变量是
    A
    变量,因此m2和m3方法不适用于此类型,并且不能在没有强制转换的情况下使用,这违背了OOP的目的
  • 我将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的签名匹配


    编辑
    你在评论中问:


    抱歉是关于继承和继承的。我不知道。。。是保留C类型对象的a类型引用。。。那么c应该知道m3

    您的c变量是引用c对象的类型变量。只有一个方法可用于该变量,除非您显式将其强制转换为其他对象:

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

    这是脆弱而丑陋的代码。如果要演示多态性,则子类方法应重写父类方法。

    尽管构造了类型为
    C
    的对象,但对该对象的引用类型为
    a


    您可以这样做,因为
    C
    a
    的子类,但是您只能访问
    a

    中声明的方法。尽管您构造了
    C
    类型的对象,但对该对象的引用是
    a
    类型的

    您可以这样做,因为
    C
    a
    的子类,但是您只能访问
    a
    中声明的方法。您的引用是指向
    a
    。因此,即使运行时类型是a
    C
    ,编译器也无法知道这一点。您只能从对
    A
    的引用访问
    A
    上定义的方法。您的引用是对
    A
    的引用。因此,即使运行时类型是a
    C
    ,编译器也无法知道这一点。您只能从对
    A
    的引用访问
    A
    上定义的方法。对不起,是关于继承和。我不知道。。。是保留C类型对象的a类型引用。。。那么c应该知道m3?抱歉是关于继承和。我不知道。。。是保留C类型对象的a类型引用。。。那么c应该知道m3?