【JAVA进阶】继承

Java继承详解

📃个人主页:个人主页

🔥系列专栏:JAVASE基础

目录

1.继承概述、使用继承的好处

2.继承的设计规范、内存运行原理、继承的特点 

3.继承后:成员变量、成员方法的访问特点

4.方法重写

5.子类构造器的特点

6.子类构造器访问父类有参构造器

7.this、super使用总结


1.继承概述、使用继承的好处

什么是继承?

  • Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。
public class Student extends People {}
  • Student称为子类(派生类),People称为父类(基类 或超类)。
  • 作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了

使用继承的好处 

  • 可以提高代码的复用性。

 

2.继承的设计规范、内存运行原理、继承的特点 

继承设计规范:

  • 子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的的属性和行为应该定义在子类自己里面。

为什么?

  • 如果子类的独有属性、行为定义在父类中,会导致其它子类也会得到这些属性和行为,这不符合面向对象逻辑。

继承的设计规范

需求: 教学资源管理系统中,存在学生、老师角色会进入系统。

分析:

  • 学生信息和行为(名称,年龄,所在班级,查看课表,填写听课反馈)
  • 老师信息和行为(名称,年龄,部门名称,查看课表,发布问题)
  • 定义角色类作为父类包含属性(名称,年龄),行为(查看课表)
  • 定义子类:学生类包含属性(所在班级),行为(填写听课反馈)
  • 定义子类:老师类包含属性(部门名称),行为(发布问题)

内存运行原理

继承的特点

  • 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
  • Java是单继承模式:一个类只能继承一个直接父类。
  • Java不支持多继承、但是支持多层继承。
  • Java中所有的类都是Object类的子类。

1.子类是否可以继承父类的构造器?

  • 不可以的,子类有自己的构造器,父类构造器用于初始化父类对象

2.子类是否可以继承父类的私有成员?

  • 可以的,只是不能直接访问。

 3.子类是否可以继承父类的静态成员?

  • 有争议的知识点。
  • 子类可以直接使用父类的静态成员(共享)
  • 但个人认为:子类不能继承父类的静态成员。(共享并非继承)

4.Java能否支持多继承?

  • Java只支持单继承,不支持多继承。
  • 单继承:子类只能继承一个直接父类
  • 不支持多继承:子类不能同时继承多个父类

5.Java支持多层继承 

  • 子类 A 继承父类 B ,父类B 可以 继承父类 C

6.Object特点

  • Java中所有类,要么直接继承了Object , 要么默认继承了Object , 要么间接继承了Object, Object是祖宗类。

3.继承后:成员变量、成员方法的访问特点

在子类方法中访问成员(成员变量、成员方法)满足:就近原则

  • 先子类局部范围找
  • 然后子类成员范围找
  • 然后父类成员范围找,如果父类范围还没有找到则报错。

如果子父类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

  • 可以通过super关键字,指定访问父类的成员。
  • 格式:super.父类成员变量/父类成员方法

4.方法重写

什么是方法重写?

  • 在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

方法重写的应用场景

  • 当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。
  • 子类可以重写父类中的方法。

@Override重写注解

  • @Override是放在重写后的方法上,作为重写是否正确的校验注解。
  • 加上该注解后如果重写错误,编译阶段会出现错误提示。
  • 建议重写方法都加@Override注解,代码安全,优雅!

方法重写注意事项和要求

  • 重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
  • 私有方法不能被重写。
  • 子类重写父类方法时,访问权限必须大于或者等于父类 (暂时了解 :缺省 < protected < public)
  • 子类不能重写父类的静态方法,如果重写会报错的。

案例演示:

  • 旧手机的功能只能是基本的打电话,发信息
  • 新手机的功能需要能够:基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。

public  class base{
    /**
     * 旧手机的功能只能是基本的打电话,发信息
     * 新手机的功能需要能够:基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。
     */
    public static void main(String[] args) {
        newPhone newPhone = new newPhone();
        newPhone.call();
        newPhone.message();

    }
}

class phone{
        public void call(){
            System.out.println("打电话");
        }

        public void message(){
            System.out.println("发短信");
        }
    }
    
    class newPhone extends phone{
        
        @Override
        public void call(){
            super.call();
            System.out.println("视频通话");
        }

        @Override
        public void message(){
            super.message();
            System.out.println("发送图片");
        }
    

    }




5.子类构造器的特点

子类继承父类后构造器的特点:

  • 子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。

为什么?

  • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
  • 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

怎么调用父类构造器的?

  • 子类构造器的第一行语句默认都是:super(),不写也存在。

案例:

public  class base{

    public static void main(String[] args) {
        newPhone newPhone = new newPhone();
        System.out.println("----------------");
        newPhone newPhone2 = new newPhone("1");



    }
}

class phone{
    public phone() {
        System.out.println("父类无参构造器");
    }
}

    class newPhone extends phone{
        public newPhone() {
            System.out.println("子类无参构造器");
        }
        public newPhone(String  name){
            System.out.println("子类有参构造器");
        }

    }





6.子类构造器访问父类有参构造器

super调用父类有参数构造器的作用:  

  • 初始化继承自父类的数据。

如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?

  • 会报错。因为子类默认是调用父类无参构造器的。

如何解决?

  • 子类构造器中可以通过书写 super(…),手动调用父类的有参数构造器

public  class base{

    public static void main(String[] args) {
        newPhone newPhone = new newPhone("滴滴");
        System.out.println(newPhone.getName());


    }
}

class phone{
    public String name;

    public phone() {
        System.out.println("父类无参构造器");
    }

    public phone(String name) {
        this.name = name;
    }
    

    public String getName() {
        return name;
    }
}


    class newPhone extends phone{
        public newPhone(String name) {
            super(name);
        }
    }

7.this、super使用总结

this和super详情

  • this:代表本类对象的引用;super:代表父类存储空间的标识。

关键字

访问成员变量

访问成员方法

访问构造方法

this

this.成员变量

访问本类成员变量

this.成员方法(…)

访问本类成员方法

this(…)

访问本类构器

super

super.成员变量

访问父类成员变量

super.成员方法(…)

访问父类成员方法

super(…)

访问父类构造器

评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值