一、继承
1、继承的概述:
继承是多态的前提,如果没有继承就没有多态。继承主要解决的问题就是:共性抽取。
2、继承的格式
在继承的关系中,子类可以被当作父类看待。
例如:父类是员工,子类是讲师,那么“讲师就是一个员工”
定义父类的格式:(一个普通的定义)
pubilc class 父类名称{
//...
}
定义子类的格式:
public class 子类名称 extends 父类名称{
//...
}
3、继承中成员变量的访问特点。
(1)创建父类对象只能访问父类对象的内容,创建的子类对象除访问自己本身的内容外还可访问父类当中的内容。
(2)在父子类的继承关系当中,如果成员变量重名,则创建子类对象时访问有两种格式:
01、直接通过子类对象访问成员变量:等号左边是谁,就优先使用谁,没有则向上查找。
02、间接通过成员方法访问成员变量:方法属于谁,就有先用谁,没有则向上查找。
(3)如何区分三种变量的重名问题
局部的变量:直接写
本类当中的成员变量:this.变量名
父类当中的成员变量:super.变量名
4、继承中成员方法的访问特点:
创建的对象是谁。就优先用谁,如果没有则向上找。无论是成员方法还是成员变量,如果没有都是向上找父类,不会向下找子类。
5、继承中方法的覆盖重写
(1)概念与特点
01、定义:在继承关系当中,方法的名称一样,参数的列表一样。重载当中方法的名称一样,但参数的列表不一样。
02、特点:创建的是子类对象,则优先用子类方法。
(2)注意事项
01、必须保证父子类之间方法的名称相同,参数的列表也相同。
@Override:写在方法前面用来检测是不是有效的正确覆盖重写。
02、子类方法的返回值必须小于等于父类方法的返回值范围。
Object类是所有类的公共最高父类。
03、子类方法的权限必须大于等于父类方法的权限修饰符。
public>protected>(default即什么都不写)>private
(3)应用场景
6、继承中构造方法的访问特点
(1)子类构造方法当中有一个隐含的super()调用(只能调用无参的构造方法),所以一定先执行父类构造方法,再执行子类的构造方法。
(2)子类构造可以使用super关键字来调用父类重载构造。
(3)super的父类构造调用,必须是子类构造方法的第一个语句。也就是不能一个子类构造调用多次super构造。
(4)子类必须调用父类构造方法,不写则赠送super();写了则用写的指定super调用,super只能有一个还必须是第一个。
7、super关键字三种用法
(1)在子类的成员方法中,访问父类的成员变量。
(2)在子类的成员方法中,访问父类的成员方法
(3)在子类的构造方法中,访问父类的构造方法。
8、this关键字的用法
(1)在本类的成员方法中,访问本类的成员变量。
(2)在本类的成员方法中,访问本类的另一个成员方法。
(3)在本类的构造方法中,访问本类的另一个构造方法。
注意:01、在第三种方法当中,this调用也必须是构造方法的第一个语句,唯一一个。
02、super和this两种构造调用不能同时使用
9、super与this关键字的内存图解
10、Java继承的三个特点
(1)Java语言是单继承的:一个类的直接父类只能有一唯一个。
(2)Java语言可以多级继承。
java.lang.Object类为最高类
(3)一个子类的直接父类是唯一的,但是一个父类可以拥有很多子类。
二、抽象
1、抽象的概述
如果父类当中的方法不确定如何进行{}方法体实现,那么这应该就是一个抽象方法。
2、抽象方法和抽象类的格式
(1)抽象方法:加上abstract关键字,然后去掉大括号,直接分号结束。
(2)抽象类:抽象方法所在的类,必须是抽象类才行,在class前加上abstract就可以。
3、抽象方法和抽象类的使用
(1)不能直接创建new抽象类对象。
(2)必须用一个子类来继承抽象类。
(3)子类必须覆盖重写抽象父类当中的所有抽象方法
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
(4)创建子类对象进行使用。
(5)注意:
01、抽象不能直接创建对象。
02、抽象类中可以有构造方法,是供子类创建对象时,初始化父类使用的。
03、抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊场景下有用途。
04、抽象类的子类必须重写抽象父类中所有的抽象方法。
注意Alt+Enter的使用
三、接口
1、接口的概述
接口就是一种公共的规范标准。只要符合规范标准,就可以大家通用。
2、接口定义的基本格式
(1)接口就是多个类的公共规范,接口是一种引用数据类型。接口中最重要的内容就是其中的抽象方法。
(2)接口格式:
public interface 接口名称{
//接口内容
}
注意:换成关键字interface之后,编译生成的字节码文件仍然是:.java - ->.class
(3)包含内容:
常量、抽象方法、默认方法、静态方法、私有方法等等。
(4)接口当中抽象方法的定义
创建时将种类改为接口即可。
格式:
public abstract 返回值类型 方法名称 (参数列表);
注意:
01、接口当中的抽象方法,必须是两个固定的关键字:public abstract
02、这两个关键字修饰符可以选择性的省略
03、方法的三要素可以随意定义。
(5)接口的抽象方法使用
01、接口不能直接使用,必须有一个“实现类”(类似于子类)来“实现”该接口。
格式:
public class 实现类名称 implements 接口名称{
//...
}
02、接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
去掉 abstract 关键字,加上方法体大括号。
03、创建实现类的对象,进行使用。不能直接new接口对象进行使用。
注意:如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。
(6)接口的默认方法
01、定义
格式:
public default 返回值类型 方法名称(参数列表){
方法体;
}
注意:接口当中的默认方法可以解决接口升级的问题。其中的public可以省略。
接口升级:新增加抽象方法。
02、使用
- 默认方法会被实现类继承下去。调用默认方法时,如果实现类当中没有,向上寻找接口。
- 接口的默认方法,可以通过接口实现类对象,直接调用
- 接口的默认方法,也可以被接口实现类进行覆盖重写。
(7)接口的静态方法
01、定义
格式:
public static 返回值类型 方法名称 (参数列表){
方法体
}
02、使用
- 不能通过接口实现类的对象来调用静态接口中的静态方法。
- 正确用法:通过接口名称,直接调用其中的静态方法。
- 格式:静态方法名(参数);
(8)接口的私有方法
01、定义:分为两类
1、普通私有方法:解决多个默认方法之间重复代码问题。
格式:
private 返回值类型 方法名称(参数列表){
方法体
}
2、静态私有方法:解决多个静态方法之间重复代码问题
格式:
private static 返回值类型 方法名称(参数列表){
方法体
}
02、使用
接口的私有方法只能在接口当中使用,若果需要使用私有方法,直接进行调用即可。
(9)接口的常量(‘ 成员变量 ’)
01、定义:
格式:
public static final 数据类型 常量名称=数据值;
注意:1、接口当中的常量一旦赋值后,不可以修改,一旦使用final关键字进行修饰,说明不可改变。接口当中的常量可以省略public static final 。
2、接口当中的常量必须进行赋值,不能不赋值。
3、接口中常量的名称使用完全大写的字母,用下划线进行分隔。
02、使用
访问接口当中的常量:接口名称.常量
(10)使用接口的注意事项
01、接口不能有静态代码块和构造方法
02、一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式:
public class 类名称 implements 接口名称1,接口名称2...{
覆盖重写所有的抽象方法(Alt+Insert+Enter)
}
03、如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需覆盖重写一次即可。
04、如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是抽象类。
05、如果实现类所实现的多个接口中,存在重复的默认方法,那么实现类就必须对冲突的默认方法覆盖重写。
06、一个类如果直接父类当中的方法,和接口当中的默认方法产生冲突,那么它会优先使用父类当中的方法。继承优先于接口实现。
(11)接口之间的多继承
01、类与类之间是单继承的。直接父类只有一个。
02、类与接口之间是多实现的。一个类可以实现多个接口。
03、接口与接口之间是多继承的。
public Interface 子接口名称1 extends 父接口名称1,父接口名称2......{
接口内容
}
04、注意事项:
1、多个父接口之间的抽象方法如果重复,没有影响。
2、多个父接口之间的默认方法如果重复,则需要在子接口必须进行默认方法的覆盖重写。而且需要default关键字。