java对象中的表面类型与实际类型

本文探讨了Java中继承关系下方法的执行原理,详细解释了非静态方法与静态方法在子类与父类之间的调用差异。通过具体代码示例,展示了非静态方法按实际类型执行,而静态方法则依据表面类型执行的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表面类型:对象声明时的类型;

实际类型:对象产生时的类型;

Base[表面类型]base=new Sub[实际类型]();

那么在继承关系中,方法时如何执行的呢?例子如下:

public class StaticTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Base  base=new Sub();
        base.doSomeThing1();
        base.doSomeThing();
	}
	
	

}
class Base{
	public static void doSomeThing()
	{
		System.out.println("Base method---doSomeThing");
	}
	
	public void doSomeThing1()
	{
		System.out.println("Base method---doSomeThing1");
	}
}
class Sub extends Base{
	
	public static void doSomeThing()
	{
		System.out.print("Sub method---doSomeThing");
	}
	@Override
	public void doSomeThing1()
	{
		System.out.print("Sub method---doSomeThing1");
	}
}
------------------
Sub method---doSomeThing1
Base method---doSomeThing

我们发现静态方法竟然执行的不是子类中的方法,这是由于:

  • 非静态方法是按照实际类型执行的;

  • 静态方法是按照表面类型来执行的;

但是,通过子类构建与父类完全相同的静态函数,这中行为叫做“隐藏”,其目的就是抛弃父类的静态方法,重显子类方法。


转载于:https://my.oschina.net/u/2452051/blog/527096

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值