4、继承
4.1、概念
当多个类中都存在相同属性和行为时,可以将这些共有的属性和行为定义到一个新的类中,让其他类服用个新类的属性和行为,这种关系就是继承关系
当满足XXX是一个XXX的时候,也是继承关系,例如 苹果是一种水果,其中水果就是父类,苹果就是子类,水果有多种水果,而苹果只是水果的一种,所以苹果继承水果
其中被继承的类是父类(超类、基类),继承父类的类就是子类(新类、派生类)
4.2、继承的语法
先定义父类
public class 父类{
}
再定义子类
public class 子类 extends 父类{
}
2.1子类继承父类,子类拥有父类那些属性和方法?
子类拥有父类的共有的属性和方法,同包下面的属性和方法,不同包下受保护的也可以访问
其中子类不能继承父类的私有的属性和方法,不同包的默认属性和方法,不能继承父类的构造器
2.2子类继承父类,子类如何访问父类属性和方法
属性:子类通过super关键字访问父类属性,子类通过this关键字访问自己的属性
方法:之类通过super挂件自方法父类的方法,子类通过this关键字访问自己的方法
注意:这里的this和super可以省略,省略后子类通过“就近原则”访问属性和方法(子类存在就访问子类的,子类不存在,就访问父类)
super.属性
super.方法(参数)
构造器:子类通过super([参数]) 调用父类的构造器, 子类通过this([参数])调用 自己类的其他构造器,其中 super(参数[]) 必须写在子类构造器的第一行
通过在子类构造器手动调用父类的有参构造器给父类的属性赋值
public class Employee {public class Employee {
String ename="王麻子";//员工姓名
double sal=5000 ; // 员工薪资
public Employee(String ename,double sal){
this.ename = ename;
this.sal = sal;
}
}
public class Manager extends Employee{
// 奖金
private double comm;
public Manager(String ename ,double sal ,double comm){
// 如何覆盖父类的无参构造器 ,手动调用父类的有参构造
super(ename ,sal); // 只能写在第一句
this.comm = comm;
}
}
注意: 子类构造器中默认调用父类的无参构造器
2.3 Java中只能是单继承,一个类只能有一个直接父类的父类,可实现多层次继承
子类 -》 父类 -》 父类的父类
pupil -> Student-》 People
创建子类对象时,优先创建父类对象,再创子类对象, 执行顺序 最上层父类的构造器 -》 父类构造器 -》子类构造器。
扩展问题:当一个类中存在static元素时,它们的执行顺序是如何?
顺序: 最上层父类的静态块 - 》 父类的静态块-》 子类的静态块- 》最上层 父类的构造块和构造方法
-》父类的构造块和构造方法- 》 子类的构造块和构造方法
public class People {
static{
System.out.println("People的静态语句块");
}
public People(){
System.out.println("People类的无参构造器");
}
{
System.out.println("People的构造语句块");
}
}
public class Student extends People{
static{
System.out.println("Student 的静态语句块");
}
public Student(){
// 默认调用父类的构造器
System.out.println("Student的无参构造器");
}
{
System.out.println("Student的构造语句块");
}
}
public class Pupil extends Student {
static{
System.out.println("Pupil的静态语句块");
}
public Pupil(){
// 调用它父类的无参构造器
System.out.println("Pupil类的无参构造器");
}
{
System.out.println("pupil的构造器语句块");
}
}
public static void main(String[] args) {
//创建Pupil对象
Pupil pupil = new Pupil();
}
结果:
People的静态语句块
Student 的静态语句块
Pupil的静态语句块
People的构造语句块
People类的无参构造器
Student的构造语句块
Student的无参构造器
pupil的构造器语句块
Pupil类的无参构造器
4.3、重写
子类可以继承父类的方法,但是当父类的方法不能满足子类的需要时,子类可以重写父类的方法
重写的必要条件:
1、两个方法名必须相同,且存在不同类中(父子关系的类)
2、子类重写的父类的方法,其方法的参数的返回值必须完全一样,方法的具体实现可不一样
3、访问修饰符必须大于或等于父类的修饰符
注意: 子类的对象 调用父类方法时,如果子类重写了父类的方法,则执行子类的方法,没有重写执行父类的方法。
面试题
说一下方法的重写与重载的区别?
1、重写重载与父子关系中不同类,重载存在同类中
2、重写必须满足方法名相同,且参数相同,返回值相同,重载满足方法名相同,参数不同,与返回值无关
3、重写的访问修饰符必须 子类大于等于父类, 重载没有要求