面向对象三大特性02-继承详解
2. 继承
2.1 继承概念及代码示例
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extends的意思是“扩展”。子类是父类的扩展。
package oop.Demon05;//子类 也叫派生类public class Student extends Person{}
JAVA中类只有单继承,没有多继承
继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等。
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
代码示例:
import oop.Demon05.Student;public class Application { public static void main(String[] args) { Student student = new Student(); student.say(); //父类的方法 System.out.println(student.money); }}
上述有个前提,首先都是public 如果是父类私有的子类能用么?显然私有的东西是无法继承的。
修饰符除了private public还有么?
*************************** 一般属性才是私有的。!---如下所示:
也就是你无法直接操作这个money,你必须利用接口方法也就是get/set来操作money。
public class Application { public static void main(String[] args) { Student student = new Student(); student.say(); System.out.println(student.getMoney()); }}
=======================ctrl+h快捷键
2.1 object类
如下图所示,我们在Person类中并没有定义下述这么多方法,这是怎么回事?猜测是否有一个类,类似于无参构造一样,存在但是看不见。
**在JAVA中,所有的类,都默认直接间接继承Object类
例如:String类
查看Object类
2.2 super 可以和之前学习的this进行对比,
this输出的是当前这个类,而super是父类的东西,如下所示:
上述为子类调用父类的属性
那么子类调用父类的方法呢?其实也是一样的,具体如下:
那么如果父类的方法由public---->private? 私有的东西无法被继承
------------------------------
new student
执行结果:
高级用法:
super() //调用父类的构造器,必须要在子类构造器的第一行,如果不在第一行就会报错。具体如下;
this也是一样;在子类中在定义一个有参构造,
发现报错:报错信息如下;
意思是需要将this和 super一样也放在第一行。
具体如下:发现还是有报错,
调用构造器的话,要么调用父类的要么调用子类的,且只能在构造器的第一行。
正常情况下,super()不写也是没事的,是默认调用父类的无参构造器,如果父类定义了有参构造,那么父类的无参构造就会被干掉,那么子类无法调用父类的无参构造,会报错。
--------------
super总结(注意点)
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或构造方法中
- super和this 不能同时调用构造方法
和VS对比:
代表的对象不同:
this:本身调用的是这个对象,指代当前这个类
super:代表父类对象的应用
前提:
this:,没有继承也可以使用
super 只能在继承条件才可以使用
构造方法:
this():本类的构造
super() 父类的构造
---------------------------------------------------------------------------------------------------------------------
2.3方法重写(重写都是方法的重写和属性没关系)
总结:
首先:重写需要有继承关系,子类重写父类的方法!
1:方法名必须相同
2:参数列表必须相同
3:修饰符:范围可以扩大但不可以缩小。
public>protected>default>private
4:抛出的异常:范围,可以被缩小,但是不能扩大:
ClassNotFoundException---------->Exception(范围大)
重写:子类的方法和父类的方法必须要一致,方法体不同
思考:
为什么需要重写?
1:父类的功能,子类不一定需要,或者不一定满足,所以就存在一个需求:子类重写父类的方法。
方法重写的快捷键 alt+insert :override
------------------------------------------------------------------------------------------------------------------------
都是new A为何结果不同?
public class Application { public static void main(String[] args) { //方法的调用只和左边,定义的数据类型有关 A a = new A(); A.test();// A==》test() //父类的引用指向了子类 B b =new A(); B.test(); //B==>test() }}
将static关键字去掉:
静态的方法和非静态的方法区别是很大的
静态方法 方法的调用只和左边,定义的数据类型有关
非静态方法:重写
区分重载和重写 ??
--------------------------------------