我对Java继承有些不了解
它不起作用,我不知道为什么。。。我是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, ");
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的目的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的目的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
。因此,即使运行时类型是aC
,编译器也无法知道这一点。您只能从对A
的引用访问A
上定义的方法。您的引用是对A
的引用。因此,即使运行时类型是aC
,编译器也无法知道这一点。您只能从对A
的引用访问A
上定义的方法。对不起,是关于继承和。我不知道。。。是保留C类型对象的a类型引用。。。那么c应该知道m3?抱歉是关于继承和。我不知道。。。是保留C类型对象的a类型引用。。。那么c应该知道m3?