Java 基础知识第三部分。
面向对象特征 - 继承性
继承是多态的前提。
继承解决的主要问题:共性抽取。
继承关系当中的特点:
- 子类可以拥有父类的“内容”
- 子类还可以拥有自己专有的内容
在父子类的继承关系当中,如果成员变量重名,则创建子类时,访问有两种方式:
- 直接通过子类对象访问成员变量 : 等号左边是谁,就优先用谁,没有则向上找。
- 间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则向上找。
区分三种变量
局部变量:直接写局部变量名
本类的成员变量:this.成员变量名
父类成员变量:super.成员变量名
继承中成员方法访问规则 :
在父子类的继承关系中欧给你,创建子类对象,访问成员方法规则是
创建的对象是谁,就优先用谁,如果没有则向上找。、
注意事项:无论是成员方法还是成员变量,如果没有都是向上找父类,不会向下找子类。
继承中方法的重写(override)/覆盖 :
在继承关系中,方法的名称一样,参数列表也一样。
方法覆盖重写特点 :创建的是子类对象,则优先用子类方法
注意事项:
必须保证父子类之间方法的名称相同,参数列表也相同。
@override
:写在方法前面,用来检测是不是有效的正确覆盖重写。写上保证更加的安全。可以不写。
子类方法的返回值必须小于等于父类方法的返回值范围。
子类方法权限必须大于等于父类方法权限修饰符
public > protected > (default) > private
注:(default)不是关键字default, 而是什么都不写,留空。
设计原则:对于已经投入使用的类,尽量不要修改。推荐定义一个新的类,来重复利用其中共性内容,并且添加改动新内容。
继承中构造方法访问特点
子类构造方法中有一个默认隐含的"super()“调用,所以一定是先调用的父类构造,后执行的子类构造。
子类构造可以通过super关键字来调用父类重载构造
super的父类构造调用,必须是子类构造方法的第一个语句。不能子类构造调用多次super构造。
super关键字的用法 - 3种
- 在子类的成员方法中,访问父类成员变量
- 在子类成员方法中,访问父类成员方法。
- 在子类构造方法中,访问父类构造方法。
this关键字的用法
在本类成员方法中,访问本类成员变量
在本类成员方法中,访问本类的另一个成员方法
在本类构造方法中,访问本类另一个构造方法。
在第三种构造中注意:this(…)调用也必须是构造方法的第一个语句。唯一一个。
super和this两种构造调用,不能同时使用,只能使用一个。
this和super内存图解
java继承的3个特点
- java语言是单继承的。一个类的直接父亲只能有唯一一个。
- java语言可以多级继承。父亲有父亲。
- 一个子类的直接父类唯一,但是一个父类可以有很多子类。
抽象
抽象方法定义与抽象类定义
抽象类和抽象方法的使用:
- 不能直接创建new抽象类对象
- 必须用一个子类来继承抽象父类。
- 子类必须覆盖重写抽象父类当中所有的抽象方法。 覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上大括号和方法体。
- 创建子类对象进行使用。
接口
- 接口就是一种公共规范标准。
- 接口是多个类的公共规范,接口是一种引用数据类型。
- 接口最重要的内容就是:抽象方法。
接口定义基本格式:
public interface 接口名称 {
// 接口内容
}
接口的抽象方法定义:
- 在任何版本java中,都可以定义抽象方法
- 接口中的抽象方法,修饰符必须是:
public abstract
, 但是这两个关键字可以进行省略
接口使用步骤:
- 接口不能直接使用,必须有一个“实现类”来实现该接口。
public class 实现类名称 implements 接口名称 { // ... }
- 接口的实现类必须覆盖重写接口中的所有抽象方法。 覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上大括号和方法体。
- 创建实现类的对象,使用。
接口的静态方法定义:
接口静态方法使用 :
- 不能通过接口实现类的对象来调用接口当中的静态方法
- 用法 : 通过接口名称调用静态方法
- 格式:接口名称.静态方法名(参数)
接口的私有方法定义:
接口常量定义和使用
一旦使用final关键字,说明不可改变。
注意
- 接口中的常量,可以省略
public static final
,但是不写也照样是这样。
- 接口中的常量,必须进行赋值。
- 接口中常量的名称,完全使用大写字母,用下划线进行分隔。(推荐命名规则)
使用接口时注意:
- 接口不能有静态代码块
- 接口不能有构造方法(因为它是不能new的)
- 一个类直接父类唯一,但是一个类可以实现多个接口
public class MyInterfaceImpl implements InterfaceA, InterfaceB { // .... }
- 如果实现类所实现的多个接口中,存在重复的抽象方法,只需要覆盖重写一次即可。
- 如果实现类没有覆盖重写所有接口中的所有抽象方法,那么实现类必须是抽象类。
- 如果实现类实现的多个接口中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
- 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。
接口之间的多继承
- 类与类之间是单继承的。直接父类只有一个
- 类与接口之间是多实现的。一个类可以实现多个接口。
- 接口与接口直接是多继承的
注意:
- 多个父接口中的抽象方法如果重复,没关系
- 多个父接口中的默认方法如果重复,子接口必须进行默认方法的覆盖重写。(default不能省去)