1. 多态
1.1 多态
多态是指同一种行为具有多种不同的表现形式。
前提
- 有继承或者实现关系
- 有方法重写(没有重写多态就没有意义)
- 父类引用指向子类对象
格式
父类类型 变量名 = new 子类/实现类构造器;
变量名.方法名();
运行特点
- 调用成员变量时:编译看左边,运行看左边
- 调用成员方法时:编译看左边,运行看右边
弊端
如果子类有独有的功能,多态的写法无法访问子类独有的功能。
1.2 引用类型转换
想要访问子类独有的功能,需要进行引用类型转换。
1.2.1 向上转型(自动转换)
多态本身就是子类类型向父类类型向上转换的过程,这个过程是默认的。
父类类型相对于子类类型来说是大范围的类型,所以范围小的子类可以直接自动转换为范围大的父类。
1.2.2 向下转换(强制转换)
父类类型向子类类型向下转换的过程,这个过程是强制的。
1.2.3 instanceof关键字
转型的过程中一不小心就会引发ClassCastException
,即类型转换异常。
如下:
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
a.eat(); // 调用的是 Cat 的 eat
// 向下转型
Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的 watchHouse 【运行报错】
}
}
这段代码可以通过编译,但是运行时,却报出了 ClassCastException
,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。
为了避免ClassCastException
的发生,Java提供了 instanceof
关键字,给引用变量做类型的校验,格式如下:
变量名 instanceof 数据类型
如果变量属于该数据类型或者其子类类型,返回true。
如果变量不属于该数据类型或者其子类类型,返回false。
instanceof新特性
JDK14的时候提出了新特性,把判断和强转合并成了一行
//先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d
//如果不是,则不强转,结果直接是false
if(a instanceof Dog d){
d.lookHome();
}else if(a instanceof Cat c){
c.catchMouse();
}else{
System.out.println("没有这个类型,无法转换");
}
2. 包
- 什么是包?包的作用是什么?
- 包就是文件夹,用来管理各种不同功能的类
- 包名的书写规则?
- 公司域名反写+包的作用,需要全部英文小写,见名知意,如:
com.kuaicode.test
- 公司域名反写+包的作用,需要全部英文小写,见名知意,如:
- 什么是全类名?
- 包名+类名 如:
java.lang.String
- 包名+类名 如:
使用其他类的规则:
- 使用同一个包中的类时,不需要导包。
- 使用
java.lang
包中的类时,不需要导包。- 除以上两种情况外都需要导包
- 如果同时使用两个包中的同名类,需要使用全类名
3. final
final的作用:
-
修饰方法:表明该方法是最终方法,不能被重写
-
修饰类:表明该类是最终类,不能被继承
-
修饰变量:被修饰的变量叫做常量,只能被赋值一次
细节:
final修饰的变量是基本数据类型:变量存储的数据值不能改变
final修饰的变量是引用数据类型:变量存储的地址值不能改变,对象内部的数据可以改变
常量
- 实际开发当中,常量一般作为系统的配置信息,方便维护,提高可读性。
- 常量的命名规范:
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
3. 权限修饰符和代码块
3.1 权限修饰符
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限。
-
public
:公共的,所有地方都可以访问。 -
protected
:本类、本包以及其他包中的子类可以访问。 -
默认(不写修饰符)
:本类和本包可以访问。 -
private
:本类可以访问。public > protected > 默认 > private
public | protected | 默认 | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
权限修饰符的使用规则:
实际开发中一般只使用private
和public
:
- 成员变量私有
- 方法公有
注意:如果方法中的代码是抽取其他方法中共性的代码,这个方法一般也私有。
3.2 代码块
分类
- 局部代码块
- 构造代码块
- 静态代码块
作用
- 局部代码块:提前结束变量的生命周期(已淘汰)。
- 构造代码块:抽取构造代码中的重复代码(不够灵活)。
- 静态代码块:数据的初始化(重点)。