Java是一种与方法重写的关系

Java是一种与方法重写的关系,java,Java,} } 在上面的代码中,我有一个类a和一个扩展了类a的类B。在类C中,我创建了类B的对象,它被分配给了类a。当我试图调用ab.m1()时,它调用了类B中的方法。但是当我试图调用ab.m2()时,我得到了编译时错误。我不明白为什么在ab.m1()期间调用类B方法。有人能帮我更好地理解这个概念吗 public class Result { public static void main(String[] args) { // TODO Auto-generated method stub

}

}

在上面的代码中,我有一个类a和一个扩展了类a的类B。在类C中,我创建了类B的对象,它被分配给了类a。当我试图调用ab.m1()时,它调用了类B中的方法。但是当我试图调用ab.m2()时,我得到了编译时错误。我不明白为什么在ab.m1()期间调用类B方法。有人能帮我更好地理解这个概念吗

public class Result {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    /*A a = new A();
    a.m1();

    B b = new B();
    b.m1();
    b.m2();
    */
    A ab = new B();
    ab.m1();
}
创建类型a的引用并将其指向类型B的对象。这是有效和合法的,因为B扩展了a,所以类型B的对象是-a类型a。这就是为什么在调用
ab.m1()时您正在调用在B中定义的方法。您的对象类型是B,因此它将覆盖在A中定义的方法

但是,您不能调用
ab.m2()
,因为该引用是类型A,并且对B中定义的未包含在A中的新方法一无所知。该引用只能访问A中定义的内容(以及它可能从其超类型继承的任何内容,如Object)

因为
ab.m1()
是类的类型,可以通过超级变量访问。
ab.m2()
是B类的类型,不能使用超级类型引用访问,这就是向下转换的原因

尝试:


现在调用B类的两个方法。

.m2()
不存在于对类
A
的引用中,仅存在于分配给
B
引用的
B
的实例中。因此,
ab
A
的一个实例,它没有方法
.m2()
。您的IDE应该非常清楚地显示这一点。如果您键入
ab.
,它应该只显示
A
中的方法
B
A
,但不是相反
A
不知道
B
或它提供了什么。@Feelingwelcome这不是该问题的重复。你链接的那个标题非常宽泛,正文中有一些具体的问题。不应将其用作复制目标。这两个问题都与继承有关,但我的问题与该问题中的问题不同。您是否在问为什么调用
B
m1()
方法而不是
a
m1()
?如果是这样的话,因为
ab
是类
B
的实例,所以它的
m1()
方法优先并覆盖它的所有父类“
m1()
方法。同样,所有对象都有一个<代码> toStrug()/Case>方法,因为对象< /Cuff>类有一个<代码> toStrug()/<代码>方法,但是下层中的任何实现都会覆盖它。因此,我应该考虑对象类型还是引用类型?@ KeErthPrasad,您所显示的代码是一个完美的例子,说明了为什么需要同时考虑这两个问题。你有一个引用和一个对象,它们的类型对你的代码的工作方式有很大的影响。谢谢。但我并不担心向下转换,我只是查看对象创建和引用类型如何工作,以便调用各自的方法。@KeerthiPrasad查看继承B扩展A,这意味着B拥有其超类的所有成员,但private和final除外
A ab=new B()
表示创建了B的对象,而reference
ab
是指向B对象的超类i,ea的类型。使用
ab
我们不能调用任何子类方法或变量,因为超类不知道子类中的任何内容。
public class Result {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    /*A a = new A();
    a.m1();

    B b = new B();
    b.m1();
    b.m2();
    */
    A ab = new B();
    ab.m1();
}
A ab = new B();
B -->A// B is-a A
A ab = new B()//object of B is created and reference variable is type of Super type as A is super class of B
B a = (B)ab;// down casting
a.m1();
a.m2();