小白从内存去理解多态

多态是java的三大特性之一,表面去理解就是一个引用的多种状态,指的是通过一个指向父类的指针,去调用不同子类的方法。
我们可以先来看看怎样才叫多态

Class Parent{
	Parent(){
		System.out.println("我是父类");
	}
	public void useMe(){
		System.out.println("调用父类方法");
	}
}

Class Child{
	Child(){
		System.out.println("我是父类")
	}

	public void useMe(){
		System.out.println("调用父类方法");
	}
}

Class test{
	public staitc void main(Stirng[] args){
		Parent p = new Child();
		p.useMe();
	}
}

以上就是多态的一个体现。Parent的引用指向了Child。而多态的一个很重要的规则就是编译看左,运行看右。

怎么理解编译看左,运行看右?所谓编译看左,运行看右是指在程序编译的时候看左边的类是否拥有你的方法,程序运行的时候看右边的类是否重写了你这个方法,例如上面的程序,你调用了p.useMe()这个方法,在编译的时候会先检查Parent类有没有这个方法,如果没有就直接报错,如果有,那么在运行的时候会看右边的类(子类)有没有重写这个方法,如果有则调用子类的方法,如果没有就调用父类的方法。但是要注意,如果这个方法是静态方法,那么子类是无法重写这个方法的,会发生一种隐藏现象,调用的还是父类的方法。

我来说说我的理解吧。首先我们要明白栈和堆两个概念。JVM的栈区存放的是对象的引用(一个地址,指向堆中的对象),堆区存放的是对象,在编译到Parent p的时候,JVM会把类的信息、静态方法、常量、静态变量都存放到方法区,并且在栈区生成一个引用p,并且这个p指向Parent类的静态方法,这个引用在这时候还没指向一个对象。而在编译的过程中是不会真正new出一个对象来的。当编译到p.useMe()的时候,会检查这个p指向的类中有没有这个代码,由于此时还没有真正new出一个对象,所以只会检查父类的代码中有没有这个方法

而在运行的时候,p会指向堆中new出来的一个Child实例对象,因此在运行的时候看的是Child这个类中的方法。

那为什么会出现隐匿现象呢,因为在编译的时候静态方法会随着Parent p的编译而初始化,也就是说静态方法在编译期间就已经跟Parent类绑定了,而在运行期间new的是子类的对象,这个时候子类的static方法是不会初始化的,所以找p的静态方法只能找到Parent类的静态方法。

以上是我学习中自己总结出来的一点点理解,如果有不对的请多多谅解,感谢指出~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值