继承:
继承的概述
现实生活中继承:子承父业,用来描述事物之间的关系
代码中继承:就是用来描述2个类之间的关系,并且子类拥有父类的成员变量和成员方法
继承的格式:
public class 类A extends 类B{
}
特点:类A继承类B,类A是子类,类B是父类
好处:
- 提高代码的复用性
- 可以让类与类之间产生关系,形成多态的条件
继承的特点:
- 子类拥有父类的成员变量和成员方法
- 子类只能直接访问父类的非私有成员,不能直接访问私有成员(成员变量和成员方法)
- java中的继承只能单继承,不能多继承(相当于我们人只能有一个亲爹)
- java中可以多层继承(儿子有爸爸,儿子有爷爷)
继承后如何访问成员变量
- 父子类中不同名的成员变量: 正常访问,无影响
- 父子类中同名的成员变量: 遵守就近原则
- 优先在局部位置找,如果局部位置有该变量,就直接使用,如果没有,就去本类成员位置找,如果有,就直接使用
如果本类成员位置没有,那么就去父类的成员位置找,如果有就直接使用,如果没有就报错
super:关键字,代表父类的引用
继承后如何访问成员方法:
- 父子类未出现同名的方法:正常访问
- 父子类中出现同名的方法: 优先调用子类中的方法(构造方法除外)
方法的重载:在同一个类中,出现多个同名的方法,参数列表不同,与返回值类型,修饰符无关
方法的重写:子类中出现和父类中一模一样的方法(包括返回值类型,方法名,参数列表)
方法重写的注意事项:
- 重写的方法必须要和父类一模一样(包括返回值类型,方法名,参数列表)
- 重写的方法可以使用@Override注解来标识
- 子类中重写的方法的访问权限不能低于父类中方法的访问权限
权限修饰符 : private < 默认(什么都不写) < protected < public
为什么要重写方法:
- 当父类中的方法无法满足子类需求的时候,需要方法重写
- 当子类具有特有的功能的时候,就需要方法重写
继承后如何访问构造方法:
- 访问父类的空参构造方法: super();
- 访问父类的有参构造方法: super(实际参数);
注意事项:
- 构造方法不能被子类继承,但是可以使用
- 子类的空参构造方法会默认调用父类的空参构造方法
- 子类的有参构造方法也会默认调用父类的空参构造方法
- 在子类中使用super()访问父类的空参构造方法必须放在第一行,先调用父类的构造方法
- 在子类中使用super(实参)访问父类的有参构造方法必须放在第一行,先调用父类的构造方法
补充: java中所有的类都是直接或者间接继承Object类
Object:
概述:类 Object 是类层次结构的根类
构造方法:
- Object()
成员方法:
- String toString() 返回该对象的字符串表示(可以遍历数组)
super关键字的三种用法:(访问父类的成员变量和成员方法)
-
访问父类的成员变量:super.父类成员变量名
-
访问父类的成员方法:super.父类成员方法名(实参);
-
访问父类的构造方法:
-
访问父类的空参:super();
-
访问父类的有参:super(实参);
-
this关键字的三种用法:(访问本类的成员变量和成员方法)
-
访问本类的成员变量: this.本类成员变量名 常用
-
访问本类的成员方法: this.本类成员方法名(实参); 不常用
-
访问本类的构造方法: 不常用
-
访问本类的空参: this();
-
访问本类的有参: this(实参);
-
注意:
- 访问本类的空参或者有参都需要放在第一行
- 不能同时有参调用空参,空参再调用有参
this和super的使用区别
- A:调用成员变量
- this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
- super.成员变量 调用父类的成员变量
- B:调用构造方法
- this(…) 调用本类的构造方法
- super(…) 调用父类的构造方法
- C:调用成员方法
- this.成员方法 调用本类的成员方法,也可以调用父类的方法
- super.成员方法 调用父类的成员方法
抽象类:
抽象方法的概述:没有方法体的方法,并且使用abstract关键字修饰的方法
抽象类的概述:使用abstract修饰的类就是抽象类
抽象方法的格式
- 权限修饰符 abstract 返回值类型 方法名(形参);
抽象类的格式
public abstract class 类名{
}
抽象类的特点:
- 有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法
- 抽象类是不可以直接创建对象的,但是可以通过其子类来创建对象
- 抽象类中有构造方法,但是不可以用来创建对象,但是可以供子类初始化父类的成员变量
- 抽象类的子类如果是普通类,那么必须实现抽象类中的抽象方法
- 抽象类的子类如果是抽象类,那么就可以不用实现抽象类中的抽象方法
抽象类也是一个类,和普通类的区别:
- 抽象类可以定义抽象方法,而普通类不可以
- 抽象类不可直接创建对象,但是普通类可以
- 抽象类的子类如果是普通类,必须重写抽象类中的抽象方法,如果子类是抽象类,可以不用重写