java - 我不明白Java继承的一些内容

标签 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被调用。我不明白。

最佳答案

  1. 您的代码中没有使用多态性。
  2. 您的变量是一个 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 的签名匹配。

<小时/>

编辑
您在评论中询问:

sorry is about Inheritance and . i dont know ... is a reference of type A who keep an object of type C ... then c should have idea about the m3?

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

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

这是脆弱且丑陋的代码。如果您想演示多态性,那么您的子类方法应该重写父方法。

关于java - 我不明白Java继承的一些内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24234185/

相关文章:

Java - 扩展整个类层次结构

Java - 突破物理学?

Java泛型继承 "unchecked cast"

java - 如何从数据库 Arraylist 在 Google map 上添加标记

java - testng 中数据提供者的延迟加载

java - 在子类中隐藏方法

c++ - 将抽象类(所有虚拟的,因此接口(interface))传递到另一个类的构造函数中并具有默认值

inheritance - Salesforce Apex 是否支持静态方法的继承?

java - 如何按GMT时区获取货币名称?

java - 来自android的通货膨胀异常错误