java父子类实例强制转化后 各实例之间的关系

子类实例转化为父类实例后 是否还从属(instanceof)于子类?

这个被转化得来的父类实例是否能访问子类重写的方法、子类新添加的方法、子类新添加的成员属性、是否还能转化为子类实例?以下测试:

创建一个父类和一个子类,父类拥有成员变量a、方法fun(),子类拥有继承的成员变量a、新定义的成员变量b、重写的方法fun()、新定义的方法fun2()

class Father
{
	public int a;
	public Father(int a){
		this.a = a;
	}
	public Father(){
	}
	public void fun(){
		System.out.println("父类方法fun已经执行");
	}
}

class Son extends Father
{
	public int b;//b为子类新增加的成员变量
	public Son (int a,int c){
		super(a);
		this.b = c;
	}
	public void fun(){
		System.out.println("子类重写父类方法fun已经执行");
	}
	public void fun2(){
		System.out.println("子类新增加的方法fun2已经执行");
	}
}

再main函数创建子类实例s,强制转化为f,再把f强制转化为s1

Son s = new Son(1, 2);
Father f = (Father)s;
Son s1 = (Son)f;

测试以上三个实例能否访问子类新定义的成员变量,重写的方法,新定义的方法

		System.out.println(s.b);
//		System.out.println(f.b);子类转换为父类就不能访问子类自定义的属性了
		System.out.println(s1.b);//但是再强转回来子类原本的自定义属性和方法又“失而复得”
		s.fun();
		f.fun();
		s1.fun();
//		f.fun2();子类转换为父类就不能访问子类自定义的方法了
		s1.fun2();//但是再强转回来子类原本的自定义属性和方法又“失而复得”

得到如下结果

2
2
子类重写父类方法fun已经执行
子类重写父类方法fun已经执行
子类重写父类方法fun已经执行
子类新增加的方法fun2已经执行

说明:子类转化为父类实例后,这个实例就不能访问子类新增加的成员变量和新增加成员方法了,值得一提的是,这个父类实例虽然被转换为一个父类实例,但调用重载方法,执行的仍是子类重写过的内容。

但是再由这个父类实例转换为子类实例,则这个子类实例s1和之前初始化的子类实例s没有区别,不会因为转换过程而丢失成员变量和成员方法

那么,这三个实例属于(instanceof)父类或子类么?测试结果为既属于父类实例,也属于子类实例

		if(s instanceof Father){
			System.out.println("子类的实例s 属于父类实例");
		}
		if(f instanceof Father){
			System.out.println("父类的实例f 属于父类实例");
		}
		if(s1 instanceof Father){
			System.out.println("子类的实例s1  属于父类实例");
		}
		if(s instanceof Son){
			System.out.println("子类的实例s 属于子类实例");
		}
		if(f instanceof Son){
			System.out.println("父类的实例f 属于子类实例");
		}
		if(s1 instanceof Son){
			System.out.println("子类的实例s1  属于子类实例");
		}

结果:

子类的实例s 属于父类实例
父类的实例f 属于父类实例
子类的实例s1  属于父类实例
子类的实例s 属于子类实例
父类的实例f 属于子类实例
子类的实例s1  属于子类实例

再那么,普通new出的父类实例是不是也属于(instanceof)子类的实例呢?

		Father father = new Father(1);
		if(father instanceof Son){
			System.out.println("父类实例竟然属于自己的子类?No不属于");
		}else{
			System.out.println("什么也没发生");
		}

得到结果:

什么也没发生
所以new得到的父类实例不属于自己的子类,子类实例必然属于父类(这点就不用证明了,任何类对象都属于object)。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/banichailemai/article/details/80696802
个人分类: java
想对作者说点什么? 我来说一句

接口,父子类的转换关系

2009年03月05日 22KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭