java继承, super,重写

java继承

首先要明白java没有多继承,只有单继承和多重继承(即A继承B,B继承C)
原因是java的继承可以让他调用父类的参数以及方法,但是如果多继承的话,两个父类参数又一样的话就会冲突会报错,因此java拒绝了这种继承的实现。同时实例化顺序是先去父类看构造方法,如果父类没有再返回子类寻找构造方法

这里要注意⚠️: 子类必须满足父类的至少一种构造方法。因为创建对象的时候,子类需要先调用父类的构造方法(super),然后再回来调用子类自己的构造方法完成对象创建。如果父类为默认构造方法,那么子类可以不需要特别申明,因为java自动配上super();但是如果父类没有无参构造,那么子类必须符合父类的构造方法至少一种,且不能申明自己额外的构造方法

例子:
这里如果abc不申明构造方法会报错❌
如果abc申明额外构造方法会报错❌
abc申明至少一种父类构造方法才正确☑️
在这里插入图片描述
他的逻辑是这样的,当你申明Student s = new Student()之后,会在栈里有student这个变量,此时在堆里创建了Student对象。因为Student继承于Person,所以同时也会创建Person对象。(会一直向上创建)。在Student里,其实有一个super();,这里的super会指向父类地址。
当你用s.setName的时候会先去寻找Student的setName方法,如果Student有则不会继续向上寻找,如果没有就会向上寻找,这时候找到Person。其实这里调用的方法是s.super().setName(); (可以这么理解)。
如果你直接Student s = (Student) new Person() 也是对的。这里需要强制转换,不然的话会报错。原理和int = (int) double一样。但这里其实没有创建Student这个对象,所以如果你去调用Student里的属性或者方法就会报错!!但是Person的不会.
(更多细节在多态里讲)
在这里插入图片描述

super

可以通过super访问父类的构造方法、属性、方法;
如果子类里没有写super,则自动调用父类的无参构造方法(java默认调用super())。如果父类没有无参构造方法也没有加super则会报错。如果Person的构造方法只有Person(String name, int age){}这一种构造方法,那么在子类的构造方法里需要写明:

子类Student: //子类可以在无参构造方法里super父类的构造方法
Student(){
super(“默认名字”, 1);
}

//注意这里是super()和this(),调用方法的。可以只用this.属性 和super.属性

同样super(…)和this(…)是不能同时存在的,因为两个关键字都是要放在第一行。同时也不符合逻辑。因为this()是调用当前类的其他构造方法,而super是调用父类的构造方法,这样必然会导致冲突,所以不行

重写

重写是涉及到继承的机制。重载是在同一类中修改方法的机制。
但是一定要注意重写的时候子类不能向下修改父类权限或修改返回值类型和传参
在这里插入图片描述

重写(override)和重载(overload)的区别

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值