美文网首页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