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

1年前 (2023) 程序员胖胖胖虎阿
108 0 0

【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. 权限修饰符

权限修饰符速查表
修饰符 同类 同包 子类 不同包(无关类)
public YES YES YES YES
protected YES YES YES NO
默认 YES YES NO NO
private YES NO NO NO

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. 面向抽象进行编程:后天重构的结果
案例:

package com.example.bbb;
/*本类用于面向抽象编程的推导*/
public class DesignTeacher {
}
//3.抽取共性,向上形成父类
abstract class Teacher{
    String name;
    int id;
    public abstract void ready();
    public abstract void teach();
}

//1.创建培优CGB老师类
//业务:主打互联网架构与微服务
class CGBTeaher extends Teacher{
    @Override
    public void ready(){
        System.out.println("正在备课:互联网架构与微服务");
    }
    @Override
    public void teach(){
        System.out.println("正在讲课:互联网架构与微服务");
    }
}
//2.创建高手加薪班老师类
//主打:基础加强 框架加强 高新技术
class ACTTeacher extends Teacher{
    @Override
    public void ready(){
        System.out.println("正在备课:基础加强 框架加强 高新技术");
    }
    @Override
    public void teach(){
        System.out.println("正在讲课:基础加强 框架加强 高新技术");
    }
}

//创建抽象父类的子实现类SCDTeacher
//这是一个抽象子类,只实现抽象父类中的一个抽象方法
abstract class SCDTeacher extends Teacher{
    @Override
    public void ready() {
        System.out.println("正在研发中...");
    }
}

  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:编译看左边,运行看右边:
        父类中定义的功能,子类才能使用,否则报错
        多态中,方法的定义看的是父类的,方法的实现看的是子类重写后的功能

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

  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 真实类型

版权声明:程序员胖胖胖虎阿 发表于 2023年9月3日 下午5:48。
转载请注明:【Java基础】面向对象进阶(二) | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...