今日重点:
目录
一、Java面向对象的特点之一:继承
类与类之间的关系:
* 1.属性关系
* 2.参数关系
* 3.继承关系
1.继承的实现
(1)概念:
继承是面向对象三大特性之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义以及追加属性和方法,继承通过extends实现。在Java中,继承是单继承,一个子类只能有一个直接父类,但是可以有多个间接父类,extends后面只能写一个类。
父类(超类superclass)
子类(基类 subclass)
(2)实现格式:
- 格式:class 子类 extends 父类 { }
- 举例:class Cat extends Animal { }
(3)继承的注意事项
1.子类不是无限继承父类中的内容,它只能继承父类中非私有(非private修饰)的代码,也不能继承构造方法,也不能继承不同包中,默认修饰的内容。
2.只能继承父类中非私有(非private修饰)的代码:private修饰的内容是私有的,只能在本类中使用。(话糙理不糙:你爸爸的闺女 不是你的闺女 你是无法继承这关系)3.不能继承构造方法:构造方法是用来初始化对象(对象创建),它是给父类创建对象用的。(话糙理不糙:生你爸爸的人 不能生你)
访问权限修饰符:
* 1.public
* 2.protected 受保护的,不同包的子类可以访问
* 3.default 默认的
* 4.private(4)继承能干什么
* 1.子类可以继承父类的属性
* 2.子类·可以继承了父类的方法
* 3.创建子类对象时(创建对象的过程就是实例化的过程),执行了父类的构造器,父类先被实例化,再去实例化子类。
* 4.当一个类被实例化时,一定会先实例化它的间接父类,再直接父类,再实例化它自己(先有爷爷再有爸爸再有自己)
*注意:子类的构造器可以有多个,但是必须和父类的构造器形式上统一。
2、继承中成员访问的特点
(1)构造方法访问特点
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
注意:子类中所有的构造方法默认都会访问父类中无参的构造方法,如果父类中只有带参构造方法,我们又需要使用无参构造方法时,一般自己给出无参构造方法(2)变量和成员方法的访问特点
1.变量
①子类局部范围找
②子类成员范围找
③父类成员范围找
④如果都没有就报错(不考虑父亲的父亲…)2.成员方法
①子类成员范围找
②父类成员范围找
③如果都没有就报错(不考虑父亲的父亲…)
(3)super和this关键字的区别
1.定义:
this:代表本类对象的引用,代表当前对象的引用,谁来调用我,我就代表谁
super:代表父类存储空间的标识,代表当前对象父类的引用
2.使用区别:
①调用成员变量
this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
super.成员变量 调用父类的成员变量
②调用构造方法
this(…) 调用本类的构造方法
super(…) 调用父类的构造方法
③调用成员方法
this.成员方法 调用本类的成员方法,也可以调用父类的方法
super.成员方法 调用父类的成员方法
面试题:this和super的区别?
* 在子类中当使用super调用父类的构造器时,super(age)必须是第一句话
* 在当前类中使用this调用本类的构造器时,this(name)必须是第一句话
* 在构造器中,如果需要使用super或this调用其他(子类或者父类)构造器,只能二选一,而且还必须是第一句话
* super指向的父类,不代表任何对象。
* this指向的本类,代表当前类的对象,方法的调用者。
3、方法重写
(1)定义:
子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
①子类可以重写父类的方法
②方法的重写,我们可以利用到父类中方法已经运算过的结果,在结果的基础上进行扩展
③方法的重写,体现的就是继承的核心,就是为了扩展父类的功能。
④开发中,如果要重写,基本就是一模一样,我们只变方法体⑤重写的方法的返回值可以是被重写方法的返回值的子类。
(2) 方法的重写的规则---前提,继承与被继承的关系(父类与子类):
①.访问权限:重写的方法的权限不能低于被重写的方法。开发中一般都是等于。
②返回值类型:重写的方法的返回值可以和被重写的方法不同,但是必须是被重写方法的返回值的子类。开发中,一般就是一样。
③.方法名:必须相同
④.参数列表:参数类型,参数个数必须相同。
⑤抛出异常:重写的方法不能抛出比被重写的方法更大的异常
(3)应用场景
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
(4)方法重写和方法重载的区别: