• 【Java基础】面向对象进阶(二)



    个人简介

    > 📦个人主页:是Lay的主页
    > 🏆学习方向:JAVA后端开发 
    > 📣种一棵树最好的时间是十年前,其次是现在!
    > ⏰往期文章:【Java基础】面向对象进阶
    > 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

     

    目录

    1. 包

    2. 权限修饰符

    3. final

    4. 常量 

    5. 枚举

    6. 抽象类

    7. 面向对象三大特征之三: 多态


    活动地址:CSDN21天学习挑战赛

    1. 包

      1. 什么是包?

            1). 包是用来分门别类的管理各种不同类的,类似于文件夹、建包利于程序的管理和维护。

            2). 建包的语法格式:package 公司域名倒写.技术名称。报名建议全部英文小写,且具备意义

            3). 建包语句必须在第一行,一般IDEA工具会帮助创建

      2. 导包

           1). 相同包下的类可以直接访问,不同包下的类必须导包,才可以使用!导包格式:import 包名.类名;

            2). 假如一个类中需要用到不同类,而这个两个类的名称是一样的,那么默认只能导入一个类,另一个类要带包名访问。 

    2. 权限修饰符

    权限修饰符速查表
    修饰符同类同包子类不同包(无关类)
    publicYESYESYESYES
    protectedYESYESYESNO
    默认YESYESNONO
    privateYESNONONO

    3. final

    1. final表示最终
    2. 被final修饰的类是最终类,也称作叶子结点,所以不能被继承
    3. 被final修饰的方法是这个方法的最终实现,不能被重写
    4. 被final修饰的是常量,值不可以被修改,注意常量定义时必须赋值

    final修饰变量的注意

    final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

    final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。

    4. 常量 

      1. 常量

            常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。

            常量名的命名规范:英文单词全部大写,多个单词下划线连接起来。

      2. 常量做信息配置时的原理, 优势

            在编译阶段会进行“宏替换”:把使用常量的地方全部替换成真实的字面量

            维护系统容易,可读性更好。

    5. 枚举

      1. 枚举的概述

            枚举是Java中的一种特殊类型

            枚举的作用:"是为了做信息的标志和信息的分类"。

      2. 定义枚举类的格式:

            修饰符  enum  枚举名称 {

                    第一行都是罗列枚举类实例的名称

            }

                    enum  Season {

                            SPRING , SUMMER , AUTUMN , WINTER;

                    }

      3. 枚举的特征:

            1). 枚举类都是继承了枚举类型:java.lang.Enum

            2). 枚举都是最终类,不可以被继承。

            3). 构造器都是私有的,枚举对外不能创建对象。

            4). 枚举类的第一行默认都是罗列枚举对象的名称的。

            5). 枚举类相当于是多例模式。

    6. 抽象类

            在Java中abstract是抽象的意思,可以修饰类、成员方法。

            abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。

                    修饰符 abstract class 类名{     

                            修饰符 abstract 返回值类型 方法名称(形参列表);

                    }

                            public abstract class Animal{        

                                    public abstract void run();

                            }

    注意事项

            抽象方法只有方法签名,不能声明方法体。

            一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。

      1. 抽象的关键字是abstract
      2. 被abstract修饰的方法是抽象方法,抽象方法没有方法体
      3. 如果一个类中出现了一个抽象方法,那么这个类必须被abstract修饰
      4. 关于抽象类的特点:
            1)抽象类中的方法不做限制 : 全普 / 全抽 / 半普半抽
            2)如果一个类中的方法都是普通方法,还要声明成抽象类,为什么?
            为了不让外界创建本类的对象
            3)抽象类不可以创建对象,所以常用于多态
            4)抽象类中包含构造方法,但是不是为了自己创建对象时使用,而是为了子类的super()
            5)抽象类中也是可以定义成员变量的
      5. 如果一个子类继承了一个抽象父类,有两种解决方案:
            1)作为抽象子类:不实现/实现部分 抽象父类中的抽象方法 : ”躺平”
            2)作为普通子类:实现抽象父类中的所有的抽象方法 : “父债子偿”
      6. 面向抽象进行编程:后天重构的结果
    案例:

    1. package com.example.bbb;
    2. /*本类用于面向抽象编程的推导*/
    3. public class DesignTeacher {
    4. }
    5. //3.抽取共性,向上形成父类
    6. abstract class Teacher{
    7. String name;
    8. int id;
    9. public abstract void ready();
    10. public abstract void teach();
    11. }
    12. //1.创建培优CGB老师类
    13. //业务:主打互联网架构与微服务
    14. class CGBTeaher extends Teacher{
    15. @Override
    16. public void ready(){
    17. System.out.println("正在备课:互联网架构与微服务");
    18. }
    19. @Override
    20. public void teach(){
    21. System.out.println("正在讲课:互联网架构与微服务");
    22. }
    23. }
    24. //2.创建高手加薪班老师类
    25. //主打:基础加强 框架加强 高新技术
    26. class ACTTeacher extends Teacher{
    27. @Override
    28. public void ready(){
    29. System.out.println("正在备课:基础加强 框架加强 高新技术");
    30. }
    31. @Override
    32. public void teach(){
    33. System.out.println("正在讲课:基础加强 框架加强 高新技术");
    34. }
    35. }
    36. //创建抽象父类的子实现类SCDTeacher
    37. //这是一个抽象子类,只实现抽象父类中的一个抽象方法
    38. abstract class SCDTeacher extends Teacher{
    39. @Override
    40. public void ready() {
    41. System.out.println("正在研发中...");
    42. }
    43. }

      7. final和abstract是什么关系?

            1). 互斥关系

            2). abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承。

            3). 抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

      8. 模板方法模式解决了什么问题?  

            1). 提高了代码的复用性  

            2). 模板方法已经定义了通用结构,模板方法不能确定的部分定义成抽象方法,交给子类实现,因此,使用者只需要关心自己需要实现的功能即可。

    7. 面向对象三大特征之三: 多态

      多态的常见形式

            父类类型 对象名称 = new 子类构造器;

      1. 前提:为了忽略子类型之间的差异,统一看作父类类型,写出更加通用的代码
            比如:把Cat看作Animal,把Dog看作Animal,把Bird看作Animal,如果方法需要设置传入的参数,可以buy(Animal a)
            比如:把算术异常、输入不匹配异常都看作是Exception,统一捕获处理,只写一个解决方案
      2. 概念:在同一时刻,同一个对象,代表的类型不同,拥有多种形态
      3. 多态的要求:继承 + 重写
      4. 多态的口诀1:父类引用指向子类对象:父类型的引用类型变量保存的是子类对象的地址值
      5. 多态的口诀2:编译看左边,运行看右边:
            父类中定义的功能,子类才能使用,否则报错
            多态中,方法的定义看的是父类的,方法的实现看的是子类重写后的功能

      6. 多态中资源的使用:
            1)成员变量:使用的是父类的
            2)成员方法:对于方法的定义看的都是父类的,对于方法实现,重写后使用的是子类的
            3)静态资源:静态资源属于类资源,不存在重写的概念,在哪个类中定义的,就属于哪个类
      7. 向上造型与向下造型
            1)这两种都属于多态,只不过是多态的两种不同的表现形式
            2)向上造型【最常用】
            可以把不同的子类型都看作是父类型,比如Parent p = new Child();
            比如:花木兰替父从军,被看作是父类型,并且花木兰在从军的时候,不能使用自己的特有功能,比如化妆
            3)向下造型
            前提:必须得先向上造型,才能向下造型
            子类的引用指向子类的对象,但是这个子类对象之前被看作是父类类型,所以需要强制类型转换
            Parent p = new Child(); 然后:Child c = (Child) p;
            比如:花木兰已经替她爸打完仗了,想回家织布,那么这个时候,一直被看作是父类型的花木兰必须经历“解甲归田”【强制类型转换】这个过程,才能重新被看作成子类类型,使用子类的特有功能
            为什么有向下造型:之前被看作是父类类型的子类对象,想使用子类的特有功能,那就需要向下造型

      8. 引用数据类型的类型转换,有几种方式?  

            自动类型转换、强制类型转换。

      9. 强制类型转换能解决什么问题?  

            可以转换成真正的子类类型,从而调用子类独有功能。

      10. 强制类型转换需要注意什么?  

            有继承关系/实现的2个类型就可以进行强制转换,编译无问题。  

            运行时,如果发现强制转换后的类型不是对象真实类型则报错(ClassCastException)

      11. 强制类型转换前最好做什么事情,如何进行?  

            使用instanceof判断当前对象的真实类型,再进行强制转换  

            对象变量名 instanceof 真实类型

  • 相关阅读:
    分布式ID介绍&实现方案总结
    Zabbix监控部署项目
    作为所有类的顶层父类,没想到Object的魔力如此之大!
    0学习Java(32)
    web前端期末大作业 HTML游戏资讯网页设计制作 简单静态HTML网页作品 DW游戏资讯网页作业成品 游戏网站模板
    JavaScript扫盲及DOM的特点
    【二进制部署k8s-1.29.4】三、etcd集群的安装配置
    Ansible中的任务执行控制
    Os-ByteSec
    基于Matlab仿真极化双基地雷达系统(附源码)
  • 原文地址:https://blog.csdn.net/LKS_010620/article/details/126455954