彻底理解java父子类之间的转换

先写文档后吐槽,先解决问题后发牢骚,我一贯的行事风格。

注:最下面有代码,可去根据我的说明除注释进行灵活测试。

1、子类转换成父类

一句话,子类的实例用父类来接收(父类的引用指向子类的实例)

代码:

补充:

前提:子类转成父类后(子类的实例赋给父类的引用后)

A):子类转成父类后(子类的实例赋给父类的引用后),如果子类重写了父类的方法,那么父类的引用默认调用的是子类的重写的方法。如果不存在重写方法,他默认调用的为父类的方法。(其实默认的是先调用了父类的方法,如果存在重写方法,就调用子类的方法,因为其将父类的方法覆盖,如果不存在,那么调用的就是父类的方法。

即:

B):子类转成父类后(子类的实例赋给父类的引用后),因为属性不存在重写,那么父类的引用调用的为父类的属性,因为子类实例的数据类型为父类的类型。

即:

2、父类转换成子类(重点

其实父类转换成子类有两种方式,但是第一种方式没有多大的意义。第二种方式才是重点。

A):第一种方式就是:强制转换。

(举例)即:Animal a = new Animal();       //Dog为子类,Animal为父类

                      Dog b = (Dog)Animal;

此种方法,编译没有什么问题,但是运行就会报错,没法应用也没有意义。具体原因不做赘述。

B):第二种方式:父类转换成子类需要前提的,这个大前提是什么呢?就是,必须要存在父类的引用指向子类的实例(即子类转换成父类)

即:Animal a = new Dog();     //Dog为子类,Animal为父类

       Dog b = (Dog)Animal;

这里给大家分享一段小小的代码,以作应用:

首先介绍一下,此方法是重写了Object的equal方法来比较两个对象是否相等。

首先执行s.equals(s1);s1代表new Student();因为Object为所有类的父类,可以接收任何对象。

所以实际传入的参数为:new Student(),即Object obj = new Student();

相当于子类转换成父类的A):补充,没有重写方法默认调用的为父类的方法,

但是如果想调用子类的方法,要进行类型的转换,转换成子类即可。

为了类型的统一,防止出现异常,所以进行obj instanceOf Student 。

obj instanceOf Student的含义为new Student()属于Student的实例。成立。

此时必须进行类型的转换才可进行调用是子类的对象方法。

需要进行转换即进行Student student = (Student)obj;

说的够明白了吧,附上代码。

class Animal {
	public static int age = 14;

	public void eat() {
		System.out.println("正在吃饭");
		System.out.println("刚吃完");
	}

}

class Dog extends Animal {
	public static int age = 15;
	private String name;

	String getName() {
		return name;
	}

	void setName(String name) {
		this.name = name;
	}

	public void eat() {
		System.out.println(getName() + "正在吃饭");
	}

}

public class FZLZH {
	public static void main(String[] args) {

		Animal animal = new Dog();
		//dog.setName("泰迪狗");
		//animal.eat();
		//输出null正在吃饭
		
		//int age = animal.age;
		//System.out.println(age);
		//输出14
		
		/*强制转换
		 * Animal animal1 = new Animal();
		 * Dog dog = (Dog)animal;
		 */
		
		/*第二种转换
		 * Animal animal1 = new Dog();
		 * Dog dog = (Dog)animal;
		 */
		
		
		

	}

}

 

开始吐槽大会:为了弄明白这个东西真的是拼上了老命,跟老师切磋了一下午,好歹弄明白了。

附上我的QQ:3030363140;验证问题除了备注随便写就OK;

有问题联系我就好了,免费答疑,哈哈,若果觉得满意,动动你的灵魂的小手,给我点个关注。

 

  • 21
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值