• 第六章 继承


    1、继承的基本语法

    **【简介】:**在Java中使用extends关键字来表示一个类继承另外一个类。

    【语法】:

    public class Sub extends Base{}
    
    • 1

    【案例演示】:

    public class Base {
        public int a;
        private int b;
        int c;
        protected int sum(int a, int b) {
            return a + b;
        }
    }
    
    public class Sub extends Base {
        public void sub() {
            a = 2;
            b = 2;
            c = 2;
            sum(1, 2);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    【图解错误】:
    在这里插入图片描述

    【注意事项】:

    • 当Sub和Base位于同一个包中的时候,Sub类继承Base类中public、protected、和默认访问级别的成员变量和方法。
    • 当Sub和Base不位于同一个包中的时候,Sub类继承Base类中public、protected访问级别的成员变量和方法。
    • 一个类只能有一个直接父类,不能同时直接继承多个父类,但是可以间接继承多个父类。
    • 每一个类都默认继承Object类。
    • 父类的构造器不能被子类继承(构造器必须与类名称相同)

    2、方法重载(Overload)

    【应用场景】: 类的功能有多种实现方式,选用那种方式,取决于调用者给定的参数。

    【满足重载的条件】:

    • 方法名相同
    • 方法中参数类型、个数、顺序至少有一项不相同
    • 方法的返回值类型可以不同。
    • 方法的修饰符可以不相同

    3、方法覆盖(Override)

    【应用场景】: 当父类中的方法不满足子类使用要求的时候,需要对父类中的方法进行覆盖。

    【方法覆盖满足的约束条件】:

    • 子类方法的名称、参数签名、和返回值类型必须与父类相同。

    【正确代码演示】:

    public class Base {
        public void method() {
        }
    }
    
    public class Sub extends Base {
        public void method() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【错误分析】:
    在这里插入图片描述

    • 子类方法不能缩小父类方法的访问权限。(原因:与多态机制发生冲突。)

    【错误代码演示】:

    public class Base {
        public void method() {
        }
    }
    
    
    public class Sub extends Base {
        private void method() {//子类缩小了父类的方法的访问权限
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【错误分析】:
    在这里插入图片描述

    • 子类方法不能抛出比父类更多的异常。(会导致程序异常终止)
    • 方法覆盖只存在于子类和父类之间,同一个类中的方法只能被重载不能被重写。
    • 父类的静态方法不能被子类覆盖为非静态方法。

    【错误代码演示】:

    public class Base {
        public static void method() {
        }
    }
    
    public class Sub extends Base {
        public void method() {//编译出错
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【错误分析】:
    在这里插入图片描述

    • 子类可以定义同父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。

    【正确代码演示】:

    public class Base {
        public static void method() {
        }
    }
    
    public class Sub extends Base {
        public static void method() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 父类的私有方法不能被子类覆盖
    • 父类的抽象方法可以被子类通过两种方式进行覆盖(1、实现父类的抽象方法 2、重新声明父类的抽象方法)

    【正确代码演示】:

    public abstract class Base {
        abstract void method1();
        abstract void method2();
    }
    
    public abstract class Sub extends Base {
        //实现并且扩大访问权限
        public void method1() {
        }
        //重新声明父类的抽象方法,并没有实现
        public abstract void method2();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 父类的非抽象方法可以被覆盖为抽象方法。
    public class Base {
        public void method() {
        }
    }
    
    public abstract class Sub extends Base {
        public abstract void method();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、方法覆盖与方法重载的区别

    【相同点】:

    • 都要求方法同名
    • 都可以用于抽象方法和非抽象方法之间

    【不同点】:

    • 方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致
    • 方法覆盖要求返回值类型必须一致,而方法重载对此没有限制
    • 方法覆盖发生在子类和父类之间,方法重载用于在同一个类的所有方法
    • 方法覆盖对于方法的访问权限和抛出的异常有一定的限制,而方法重载没有限制
    • 父类的方法只能被子类覆盖一次,而重载可以重载多次

    5、super关键字

    • super关键字表示当前子类的父类
    • super关键字可以用来访问父类的构造器,默认子类会访问父类的无参构造器。
    • 访问父类非私有的字段和方法(此处的方法只能是非静态的)

    6、多态

    【定义】:

    用父类类型或父类接口来接收子类对象。即一个对象在运行时的多种状态。

    【使用注意事项】:

    • 对于引用类型的变量,Java编译器会按照它声明的类型来进行处理。例如:如果用父类类型接收子类对象,又需要访问子类中特有的属性时,就必须将该对象强制转换为子类类型,否则编译报错。
    • 对于引用类型的变量,运行时、Java虚拟机会按照它实际引用的对象来处理。
    • 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
    1. 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的。
    2. 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上在编译阶段就已经做了绑定。
    3. 成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量
  • 相关阅读:
    信奥基本功:打字练习(盲打)
    9.基于netty实现WebSocket服务器
    计算机网络的故事——确保Web安全的Https
    20240603每日通信--------springboot使用netty-socketio集成即时通信WebSocket
    Linux C/C++实现SSL的应用层VPN (MiniVPN)
    search_everything文件搜索引擎的测试用例
    C语言入门必刷100题合集之每日一题(20-21)
    【Zabbix监控一】zabbix的原理与安装
    基于springboot实现班级综合测评管理系统项目【项目源码+论文说明】
    嵌入式Android系统耳机驱动基本知识
  • 原文地址:https://blog.csdn.net/m0_37911124/article/details/125791587