关于Java多态引用和this的问题,希望大家能帮我解答一下,困扰好久了

public class Test {
public static void main(String[] args) {
A a = new B();
a.show();

}
}

class A {
int x = 50;

public void show() {
System.out.println(this.x);
}


}

class B extends A {
int y = 100;

@Override
public void show() {
this.y = 200;
this.showB();
System.out.println(this.y);
}

public void showB() {
System.out.println("我是子类的showB方法");
}
}

输出的结果就是
我是子类的showB方法
200

问题来了,a.show()此时a调用的是在子类中重写过的show方法。dan在类B里的show方法中,this表示调用此方法的对象,那么此时this是a,可是a此时是A类声明但指向B类,也就是转型,应该只保留父类A里的方法和属性才对,为什么此时还是输出子类B中独有的属性y和方法showB呢。
...全文
447 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
见青山 2018-04-09
  • 打赏
  • 举报
回复
引用变量分为编译时类型和运行时类型, A a = new B();说明变量a的编译时类型为A,运行时类型为B,调用方法时会优先调用运行时类型B中的方法,如果B中没有重写此方法,则调用A中对应的方法。也就是说,同样类型(编译时类型)调用同样的方法,可能呈现不同的结果,这就是多态。例如,A a = new B(); a.show();和A a = new A(); a.show();中,同样的a.show();会调用不同的方法。
qq_41737565 2018-04-09
  • 打赏
  • 举报
回复
引用 3 楼 m0_37652657 的回复:
[quote=引用 2 楼 qq_41737565 的回复:] 楼主的理解有误,多态中A父类引用指向B子类对象后,A引用是只能调用本身声明的方法,并不代表A引用指向的B对象中没有其他方法,不是楼主所理解的只保留A引用的方法和属性。类比,一只狗在你 面前,你只知道它是一只动物,也只会调用它身为动物该有的方法和属性,但这只狗就真的不会“汪汪汪”?
原来是这样,那我是理解错了,也就是说此时B里面的属性和方法都还在并不是丢失了,只是a只能用它们共同的方法show,这里a.show()里面的调用showB()方法,本来a是不能直接调用的,但是通过show方法,让show方法去调用到showB的方法从而达到a可以调用showB,我这样理解对吗[/quote] 对。就这个意思。
Defonds 2018-04-09
  • 打赏
  • 举报
回复
你用了 this,肯定用 B 自己的。想用 A 的用 super 指针
oyljerry 2018-04-08
  • 打赏
  • 举报
回复
多态就是a调用方法的时候要看它真实的类型对应的函数。
Ai_SH 2018-04-08
  • 打赏
  • 举报
回复
我是个菜鸟. 我只知道this不就是代表当前对象吗?谁指向它无所谓啊, this.show不就是调用当前这个对象里首先显现出来的show方法吗
引用 2 楼 qq_41737565 的回复:
楼主的理解有误,多态中A父类引用指向B子类对象后,A引用是只能调用本身声明的方法,并不代表A引用指向的B对象中没有其他方法,不是楼主所理解的只保留A引用的方法和属性。类比,一只狗在你 面前,你只知道它是一只动物,也只会调用它身为动物该有的方法和属性,但这只狗就真的不会“汪汪汪”?
原来是这样,那我是理解错了,也就是说此时B里面的属性和方法都还在并不是丢失了,只是a只能用它们共同的方法show,这里a.show()里面的调用showB()方法,本来a是不能直接调用的,但是通过show方法,让show方法去调用到showB的方法从而达到a可以调用showB,我这样理解对吗
qq_41737565 2018-04-08
  • 打赏
  • 举报
回复
楼主的理解有误,多态中A父类引用指向B子类对象后,A引用是只能调用本身声明的方法,并不代表A引用指向的B对象中没有其他方法,不是楼主所理解的只保留A引用的方法和属性。类比,一只狗在你 面前,你只知道它是一只动物,也只会调用它身为动物该有的方法和属性,但这只狗就真的不会“汪汪汪”?
考拉一枚 2018-04-08
  • 打赏
  • 举报
回复
A a = new B(); 这时在堆上分配的对象本质上是B类的对象,只不过现在是通过它的父类A类的句柄去持有它,所以调用a.show时依据多态(通过动态绑定实现)会调用B类对象的show方法

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧