• 继承day01


    1/*
        继承: 向上抽取共性,把相同的内容定义在父类中
            public class 子类 extends 父类 {
                //成员变量 +成员方法 +构造方法
            }
            2.子类可以使用父类中除了private修饰的和构造方法以外的内容
     */
    public class Demo01Extends {
        public static void main(String[] args) {
            //创建子类Teacher类的对象
            Teacher t = new Teacher();
            //给成员变量赋值
            t.name = "响哥";
            t.salary/birthday = 66666; 
            t.show();  //
        }
    }

    2

    /*
       继承中的成员变量访问特点
            1.不重名的成员变量
                (1)子类自己有: 优先使用子类自己的
                (2)子类没有: 找父类
                (3)注意: 子类可以找父类,但是父类不能找子类
            2.重名的成员变量
              (1)方法内部,直接写变量名
                    从方法内部开始向上找
                    方法内部有: 直接使用
                    方法内部没有: 向上找,本类的成员位置
                    本类的成员位置有: 直接使用
                    本类的成员位置没有: 向上找,父类的成员位置
                (2)方法内部,直接写this.变量名
                    从本类的成员位置开始向上找
                    本类的成员位置有: 直接使用
                    本类的成员位置没有: 向上找,父类的成员位置
                (3)方法内部,直接写super.变量名
                    从父类成员位置开始向上找
                    父类的成员位置有: 直接使用
                    父类的成员位置没有: 继续向上找
                (4)总结:就近原则
    
            this.变量名: 代表当前类的成员变量 this.num
            super.变量名: 父类的成员变量 super.num
    */
    继承中成员方法的访问特点
           1.子类自己有: 优先使用子类自己的
           2.子类没有: 向上找父类
           3.重名的方法(方法重写): 优先使用子类自己的
    方法重写
        1.概念:
            子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),
            会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
            必要条件:方法名和参数列表必须相同
            可选条件:返回值类型可以不一致(后面讲)
        2.最简单的方法重写形式:
            子类方法声明(定义方法的第一行)和父类方法声明一模一样
        3.@Override注解:用来检测子类方法,是否是对父类方法的覆盖重写
        4.与方法重载区分开:
            方法重载作用: 是节约命名空间
            方法重载要求: 方法名称相同,参数列表不同(类型不同,数量不同,多个不同类型的顺序不同)
        5.方法重写快捷键:
            ctrl + o --> 选择要重写的方法 --> ok
    直接调用父类的成员方法: super.成员方法名称(参数列表...)
    //@Override
    public void show(int num) {
        System.out.println("Zi03...show...num..." + num);
    }
    
    @Override //不报错: 是对父类方法的重写,因为方法名称相同,参数列表也相同
    public void show() {
        System.out.println("Zi03...show...");
    }
    
    //在Zi03类中出现了两个show方法,不报错
    //原因: 名称相同,参数列表不同,构成了重载关系
    public class NewPhone extends OldPhone {
        @Override
        public void show() {
            //System.out.println("110来电...");
            //显示电话号码,其实父类的show方法已经实现该功能,
            //子类不用自己重新实现了,直接调用父类的功能
            super.show();
            System.out.println("显示归属地: 东莞...");
            System.out.println("显示头像: 🃏");
        }
    }
    
    //满参构造
    public Zi05(int num) {
        /*
            如果没有自己写super调用父类构造,
            隐藏提供super()调用父类的空参构造
         */
        //但是建议: 子空参 调用 父类空参
        //但是建议: 子满参 调用 父类满参
        super(num);
        System.out.println("子满参...");
        //super(num);//错误: 调用父类构造必须写在第一行
    }
    //创建子类对象: 空参构造
    Zi05 zi = new Zi05();
    //创建子类对象: 满参构造
    Zi05 zi2 = new Zi05(100);
    /*
        继承中构造方法的访问特点
            1.构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的
            2.子类继承父类,是为了使用父类的内容,
                所以子类创建对象调用构造方法时,
                必须先调用父类的构造方法,
                完成父类成员的初始化动作,
                子类才可以使用父类的成员,
                super()表示调用父类的空参构造
            3.子类的构造方法中如果没有手动给出super调用父类构造,
                    编译器默认提供一个super()调用父类的空参构造
            4.super调用父类构造,只能写在第一句
            5.构造方法可以重载,所以:
                    super(...):调用父类带参数的构造方法
    //创建子类对象: 空参构造
            Zi05 zi = new Zi05();
            //创建子类对象: 满参构造
            Zi05 zi2 = new Zi05(100);
        super的用法:
            1.super.成员变量名: 代表父类的成员变量
            2.super.成员方法(参数列表...): 代表调用父类的成员方法
            3.super(参数列表...): 代表调用父类的构造方法
    
        this的用法:
            1.this.成员变量名: 代表本类自己的成员变量(自己没有找父类)
            2.this.成员方法(参数列表...): 代表本类自己的成员方法(自己没有找父类)
            3.this(参数列表...): 代表调用本类自己的其它构造方法 ---后面讲
    */
    public class Fu05 {
        private int num;
        //空参构造
        public Fu05(){
            System.out.println("父空参...");
        }
    
        //满参构造
        public Fu05(int num) {
            System.out.println("父满参...");
            this.num = num;
        }
    
        //get和set方法
        public void setNum(int num) {
            this.num = num;// 
         super(num);      
    
        public int getNum() {
            return num;
        }
    }
    /*
        如果没有自己写super调用父类构造,
        隐藏提供super()调用父类的空参构造
     */
    //但是建议: 子空参 调用 父类空参
    //但是建议: 子满参 调用 父类满参
    /*
        定义父类员工Employee类
            1.所有成员变量private修饰
            2.提供空参/满参构造方法
            3.提供get/set方法
            4 //特有方法: 
     */
     //创建子类Teacher类的对象: 满参构造
    //        Teacher t =
    //                new Teacher("响哥",18,66666,33333);
    //
    //                //调用成员方法
    //                t.show();
    //                t.teaching();
    //                System.out.println("-----------");
    //
    //                //创建子类Manager类的对象: 空参构造
    //                Manager m = new Manager();
    //
    //                //给成员变量赋值
    //                m.setName("玲姐");
    //                m.setAge(16);
    //                m.setSalary(88888);
    public class Employee {
        // private成员变量
        
        //成员方法: 展示信息
        //2.提供空参构造方法
        //2.提供空参构造方法
        //3.提供get/set方法
    }
    

    /*
        类的继承特点
            1.Java只支持单继承,不支持多继承。
    //Java中的类可以多层继承爷父子
            2.Java支持多层继承(继承体系)。
            3.所有的类都直接或者间接继承了Object类,Object类是所有类的最终父类。
     */
    //错误: 一个类只能直接继承一个父类
     
    public abstract class Animal {
        //成员变量
          //空参构造 
    
        //满参构造 
    
        //展示信息的方法 
        //抽象方法: 吃 
    
        //抽象方法: 睡 
    
        //get和set方法 
    }
    public abstract class Animal {
        //抽象方法: 吃
        public abstract void eat();
    
        //抽象方法: 睡
        public abstract void sleep();
    }
    
    /*
        抽象父类和之前普通类的定义的区别?
            1.不能直接创建对象
            2.内部可以定义抽象方法
     */
    /*
        抽象: 
            2.抽象类中抽象方法存在的意义:强制要求子类必须具备的能力
            3.抽象类的定义格式:
                public abstract class 类名 {
                    ...
                }
            4.抽象方法的定义格式:
    
    //错误: 不能直接创建抽象类的对象
    //Animal a = new Animal();
    //创建Cat类的对象
    Cat cat = new Cat();
    //子类对象调用成员方法
    cat.eat();
    cat.sleep();
                修饰符 abstract 返回值类型 方法名称(参数列表...);
                注意:
                    (1)和以前定义方法一样,但是去掉{},添加abstract关键字
                    (2)返回值类型和参数列表根据需求确定 
     (3)含有抽象方法的类,必须定义为抽象类,但是抽象类中不一定含有抽象方法
            5.抽象类的使用
                (1)不能直接创建抽象类的对象
                (2)定义子类,继承抽象父类
                (3)子类中覆盖重写抽象父类中的所有抽象方法
                            去掉abstract关键字,添加{}
                            快捷键: ctrl + i
                (4)创建子类对象
                (5)子类对象调用方法
    */

    //-----------------------------------------------------------------------------------

    //---------------------------------------------------------------------------------

    //---------------------------------------------------------------------------------

    /*
        抽象类的注意事项:
     (3)含有抽象方法的类,必须定义为抽象类,但是抽象类中不一定含有抽象方法
     4.抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类
     3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类 看: MyAbstractClass
            1.抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象
            2.抽象类中,必须有构造方法,是供子类创建对象时,初始化父类成员使用的
           
      

    //-----------------------------------------------------------------------------------

    //---------------------------------------------------------------------------------

    //---------------------------------------------------------------------------------

         
    
    */
     
    //错误: 不能直接创建抽象类的对象
    //Animal a = new Animal();
    //创建Cat类的对象: 空参构造
    Cat cat = new Cat(); 
    //调用set方法给成员变量赋值
    cat.setName("小花");
    cat.setWeight(10);
        问题:
            Animal中有两个抽象方法eat和sleep,但是对应当前子类而言,
            只覆盖重写了一个抽象方法eat,相当于子类自己有个抽象方法sleep
            当前子类必须定义为抽象类
     public abstract void sleep();
  • 相关阅读:
    软信天成:干货分享,如何实施云迁移策略!
    【不积跬步无以至千里】Linux批量新建分区
    vue+element实现电商商城礼品代发网,商品、订单管理
    fatal: Unable to create ‘D:/git/2_wechat/.git/index.lock‘: File exists.
    win11 好用的 快捷方式 --chatGPT
    程序安装 - 笔记
    当黑客遇到电脑白痴
    ffmpeg源码阅读之avformat_alloc_output_context2
    Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)C. Divisor Chain
    饥荒联机版 Don‘t Starve Together服务器架设
  • 原文地址:https://blog.csdn.net/qq_35744728/article/details/125628069