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

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

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

1、子类转换成父类

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

代码:

195a4e3d96424bec897adf6ad0cd1aeb.png

补充:

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

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

即:e29f1a28a63e4e1d3c1c20c14a333232.png

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

即:eff8fa939a6efa7e361a19afb778516f.png

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

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

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

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

Dog b = (Dog)Animal;

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

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

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

Dog b = (Dog)Animal;

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

a46df010cea2142358fc4070038c6b3d.png

fab114981338f08d678ec65624247e7f.png

781d672d905b6ff2e9b572428f2f988b.png

首先介绍一下,此方法是重写了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;

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值