美文网首页java基础
java基础-day10-面向对象4.0

java基础-day10-面向对象4.0

作者: 触手不可及 | 来源:发表于2021-06-26 08:28 被阅读0次

    面向对象4.0

    1. 面向对象之继承

    1.1 生活中的继承
    王多鱼
        二爷的遗产
        
    你长的像你爹
        遗传,继承!!!
        
    开发中使用继承最多的地方:
        游戏开发!!!
        LOL
            血量,蓝量,攻击力,法术强度,攻击速度,护甲,魔抗,CD,移动速度,物理穿
            甲,法术穿甲,物理吸血,法术吸血....
            这里会考虑将所有的通用属性,封装成一个类,通过【继承】让每一个英雄类都可
            以使用到这些属性。这个类叫做【基类】.
    
    1.2 Java中的继承
    关键字
        extends 继承使用关键字
    格式:
        class A extends B {
        
        }
        
        A类是B类的一个子类
        B类是A类的唯一父类
        Java语言是一门单继承语言。
    
    继承效果
        1. 子类可以通过继承使用父类的非私有化成员变量和成员方法
        2. 子类无法通过继承使用父类的私有化成员变量和成员方法
    
    1.3 子类对象创建,会调用父类的构造方法解释
    1. 构造方法是用来做什么的???
        创建对象 new + 构造方法(); 
            new 申请内存【堆区】空间,并且擦除所有数据
            构造方法用于初始化当前类对象成员变量或者一些必要数据。
            构造方法没有创建对象的能力,只做【初始化操作】
    
    2. 子类对象可以通过继承使用父类的非私有化成员变量和成员方法
        子类对象所占用的内存【堆区】空间中,是有对应父类成员变量和成员方法的内存空间。
        开发中:
            所有的数据,方法,数据类型都要占用一定的内存空间,程序运行是离不开内存
            的。
    
    image.png
    1.4 super关键字
    1. super区分子类和父类同名内容。
    2. 通过super关键字调用父类的构造方法[后面讲 Exception]
    
    package com.qfedu.a_extends;
    
    class Person {
        public String name;
        public int age = 10;
        
        public void work() {
            System.out.println("Person类work方法");
        }
    }
    
    /**
     * super关键字区分父类和子类同名内容
     * @author Anonymous
     *
     */
    class SinglePerson extends Person {
        public int age = 20;
        
        public void work() {
            System.out.println("SinglePerson类work方法");
        }
        
        /*
         * super关键字可以解决父类和子类同名内容情况。
         */
        public void test() {
            // 子类和父类有同名内容情况下,默认为就近原则
            System.out.println(age);
            
            // 通过super明确告知编译器,这里使用的age是父类成员变量age
            System.out.println(super.age);
            
            // 调用方法也是采用就近原则
            work();
            
            // 通过super明确告知编译器这里调用的是父类的work方法。
            super.work();
        }
    }
    
    public class Demo3 {
        public static void main(String[] args) {
            
        }
    }
    
    1.5 继承带来的问题
    Java中继承主要目的
        1. 制定规范
        2. 继承可以进行方法传递,子类可以使用父类的方法,简化开发流程
    
    子类通过继承可以使用父类中的成员方法,但是父类成员方法     
    无法满足子类的特殊情况。                    
                                    
    为了降低程序员的开发压力,面向对象语言中,引入了一个【重写】概念
    
    1.6 重写 Override
    重写:
        用于在不增加方法量的情况下,解决父类方法无法满足子类使用情况。
    
    重写方法要求
        1. 子类和父类方法声明完全一致。
            权限修饰符 返回值类型 方法名(形式参数列表)
        2. 子类重写父类方法,可以修改方法体内容,来满足子类情况
        3. 通常情况下,会使用注解 @Override来开启严格格式检查。
    
    package com.qfedu.b_override;
    
    /**
     * LOLHero基类
     * @author Anonymous
     *
     */
    class LOLHero {
        public void Q() {
            System.out.println("Q方法");
        }
        
        public void W() {
            System.out.println("W方法");
        }
        
        public void E() {
            System.out.println("E方法");
        }
        
        public void R() {
            System.out.println("R方法");
        }
    }
    
    /**
     * 锤石类
     * @author Anonymous
     *
     */
    class Thresh extends LOLHero {
        /*
         * 重写之后,父类和子类方法声明完全一致,并没有增加方法的记忆压力
         * 只不过修改了子类方法体内容,从而更加合适子类的使用情况!!!
         */
        @Override
        public void Q() {
            // TODO todo是未完成代码标记,需要在todo注释之后完成代码
            System.out.println("死亡判决");
        }
        
        @Override
        public void W() {
            System.out.println("魂引之灯");
        }
        
        @Override
        public void E() {
            System.out.println("厄运钟摆");
        }
        
        @Override
        public void R() {
            System.out.println("幽冥监牢");
        }
    }
    
    /**
     * 维鲁斯类
     * @author Anonymous
     *
     */
    class Varus extends LOLHero {
    
        @Override
        public void Q() {
            System.out.println("穿刺之箭");
        }
    
        @Override
        public void W() {
            System.out.println("枯萎箭袋");
        }
    
        @Override
        public void E() {
            System.out.println("恶灵箭雨");
        }
    
        @Override
        public void R() {
            System.out.println("腐败锁链");
        }
        
    }
    
    public class Demo1 {
        public static void main(String[] args) {
            /*
             * 子类通过继承可以使用父类中的成员方法,但是父类成员方法
             * 无法满足子类的特殊情况。
             * 
             * 为了降低程序员的开发压力,面向对象语言中,引入了一个【重写】概念
             */
            Thresh goulei = new Thresh();
            
            goulei.E();
            goulei.R();
            goulei.W();
            goulei.Q();
            
            System.out.println();
            
            Varus saolei = new Varus();
            
            saolei.E();
            saolei.W();
            saolei.R();
            saolei.Q();
        }
    }
    
    1.7 重写注意事项
    1. 重写是建立在继承或者遵从[implements]关系之上的。通常是由子类或者实现类完成的。
    
    2. @Override 
        注解 ==> 注释 + 解释
        开启重写严格格式检查。【编译时作用】
    
    3. 重写可以简化代码结构,在不增加方法的情况下,满足子类的特殊使用情况。 
    
    1.9 重写的问题
        LOLHero类内有QWER方法,这里其实是要求子类按照自己的需求来完成重写的,但是代码没有从【语法】角度进行强行约束。
        目前缺少让子类重写方法的【强制要求】
        这里需要使用abstract关键字
    

    2. abstract关键字

    2.1 abstract关键字语法要求
    abstract修饰的方法
        要求子类必须强制完成/强制重写!!!
    
    package com.qfedu.c;
    
    /*
    abstract关键字使用 Eclipse操作引导
    
    第一个问题:
        Abstract methods do not specify a body
        abstract修饰的方法,不允许有方法体
    
    快速修复:
        Ctrl + 1
        Remove method body;
        删除当前abstract修饰方法的方法体。
    
     第二个问题:
        The abstract method Q in type LOLHero can only be defined by an abstract class
            在LOLHero类内abstract修饰的方法q,有且只能定义在abstract修饰的类内
        The type LOLHero must be an abstract class to define abstract methods
            LOLHero类必须是一个abstract修饰的类,才可以定义abstract修饰的方法
     
     快速修复:
        Ctrl + 1 
        Make type 'LOLHero' abstract
        
     第三个问题:
        The type HappyWindBoy must implement the inherited abstract method LOLHero.Q()
            HappyWindBoy类因为继承LOLHero类,必须实现LOLHero类内的abstract修饰的方法 Q();
     快速修复:
         Ctrl + 1
         Add unimplemented method;
            添加未实现的方法
     */
    /**
     * LOLHero基类
     * @author Anonymous
     *
     */
    abstract class LOLHero {
        abstract public void Q();
        
        abstract public void W();
        
        abstract public void E();
        
        abstract public void R();
    }
    
    /**
     * 快乐风男
     * @author Anonymous
     *
     */
    class HappyWindBoy extends LOLHero {
    
        @Override
        public void Q() {
            System.out.println("斩钢闪");
        }
    
        @Override
        public void W() {
            System.out.println("风之障壁");
        }
    
        @Override
        public void E() {
            System.out.println("踏前斩");
        }
    
        @Override
        public void R() {
            System.out.println("狂风绝息斩");
        }
        
    }
    
    /**
     * 提莫类
     * @author Anonymous
     *
     */
    class Timor extends LOLHero {
    
        @Override
        public void Q() {
            System.out.println("你瞎吧");
        }
    
        @Override
        public void W() {
            System.out.println("溜~~~");
        }
    
        @Override
        public void E() {
            System.out.println("呵 tui~~~");
        }
    
        @Override
        public void R() {
            System.out.println("蹦沙卡拉卡");
        }
    
    }
    
    public class Demo1 {
        public static void main(String[] args) {
            HappyWindBoy happyWindBoy = new HappyWindBoy();
            
            happyWindBoy.Q();
            happyWindBoy.W();
            happyWindBoy.E();
            happyWindBoy.R();
            
            Timor timor = new Timor();
            timor.Q();
            timor.W();
            timor.E();
            timor.R();
        }
        
    }
    
    2.2 abstract使用总结
    1. abstract关键字目前只要求了解语法规范。【实际使用和开发使用,后期项目中讲解】
    
    2. abstract修饰的方法不能有方法体,有且只有方法的声明,这里只是在当前类内告知编译器,这里定义了一个方法的声明。
    
    3. abstract修饰的方法,有且只能存在于abstract修饰的类内,或者interface接口内
    
    4. 一个普通类如果继承abstract修饰的类需要完成abstract类内的所有abstract修饰方法,【语法强制要求】
    
    5. abstract修饰的类请问有没有类对象???
        abstract修饰的类不能创建自己的类对象,因为abstrat修饰的类内可能存在abstract修饰的方法,而abstract修饰的方法没有方法体,无法通过类对象调用执行。
    

    3. final关键字

    3.1 基本语法
    成员变量
        final修饰的成员变量,定义时必须初始化,并且无法被重新赋值。
    成员方法
        final修饰的成员方法,不能被子类重写,为最终方法。
    局部变量
        final修饰的局部变量一旦被赋值无法修改!!!
    类
        final修饰的类不能被子类继承,没有子类
        断子绝孙
        代表之作:
            Java中的String字符串类就是一个final修饰的类
    
    3.2 final面试题
    package com.qfedu.d_final;
    
    class Person {
        public String name = "彭于晏";
        public int age = 16;
    }
    
    public class Demo2 {
        public static void main(String[] args) {
            final Person person = new Person();
            
            System.out.println(person.name + " " + person.age);
            
            /*
             * 一下操作那些正确,那些错误?
             * 
             * 请问:
             *      这里是指向不可变,还是指向内容不可变???
             * 
             * 这里final Person person 实际上修饰的内容是person引用数据类型变量
             * 也就是说当前引用数据类型变量中保存的数据是不能修改的!!!
             * 引用数据类型变量保存的数据是地址,地址指向不得改变。
             * 
             * 指向空间中保存的数据内容是可以改变的!!!
             * 
             * 生活例子:
             *      你买的房子地址不会发生改变,但是房子内部的装修装饰是可以发生改变。
             */
             // person = new Person();
             
             person.name = "彭于晏";
             person.age = 6;
        }
    }
    

    4. static关键字【重点】

    4.1 static修饰静态成员变量
    4.1.1 为什么要使用静态成员变量
        开发中存在一些共享数据,这些数据存在于每一个类对象中,并且一致数据!!!如果每一个对象都存储当前数据,会导致大量的资源浪费!!!
        
        共享单车
            共享资源,共享经济
            1. 共享单车不占用用户空间。占用公共空间。
            2. 共享单车是否与你有关???
                所属权归共享单车的运营公司
                每一个用户拥有使用权。
            3. 共享单车被XXX卸了座,大家都无法使用。
            4. 你来到北京之前,共享单车已经存在,你走之后,共享单车依然存在。
        
        饮水机
            共享资源
            1. 占用共享空间,不占用用户空间
            2. 饮水机与你有关?
                只能使用
            3. 饮水机里面放了巴豆,蹦沙卡拉卡...
            4. 饮水机在这里,你走之后,它还在这里。
    

    相关文章

      网友评论

        本文标题:java基础-day10-面向对象4.0

        本文链接:https://www.haomeiwen.com/subject/lmpnyltx.html