继承

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、重写的访问修饰符必须 子类大于等于父类, 重载没有要求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值