个人简介
> 📦个人主页:是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
- final表示最终
- 被final修饰的类是最终类,也称作叶子结点,所以不能被继承
- 被final修饰的方法是这个方法的最终实现,不能被重写
- 被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 真实类型