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

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

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

  • 34
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Lay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值