一、包
什么是包?
- 包是用来分门别类的管理各种不同类的,类似于文件夹、建包有利于程序的管理和维护
- 建包的语法格式:
package 公司域名倒写.技术名称
包名建议全部英文小写,且具备意义 - 建包语句必须在第一行,一般Idea工具会帮助创建
导包
相同包下的类可以直接访问,不同包下的类必须导包才可以使用。导包格式:import 包名.类名
二、权限修饰符
什么是权限修饰符?
- 权限修饰符:用来控制一个成员能够被访问的范围
- 可以修饰成员变量、方法、构造器、内部类,不同权限修饰符修饰的成员能够被访问的访问将受到限制
权限修饰符的分类和具体作用范围:
- 权限修饰符:有四种作用范围由小到大(private->缺省->protected->public)
学完权限修饰符需要具备: - 能够识别别人定义的成员访问范围
- 自己定义成员(方法、变量、构造器等)一般需要满足如下要求:
- 成员变量一般私有。
- 方法一般公开。
- 如果该成员只希望本类访问,使用private修饰
- 如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰。
三、final
final作用
- 修饰(类、方法、变量)
- 修饰类:表明该类是最终类,不能被继承
- 修饰方法:表明该方法是最终方法,不能被重写
- 修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)
final修饰变量的注意:
- final修饰的变量是基本类型:那么变量存储的数据值不能发送改变。
- final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发送变化的。
四、常量
常量概述和基本作用
- 常量是使用了
public static final
修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变 - 常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性
- 常量命名规范:英文单词全部大写,多个单词下划线连接起来
- 常量的执行原理:在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量;这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样的。
常量做信息标志和分类
- 代码可读性好,实现了软编码形式
五、枚举
枚举的概述
- 枚举是Java中的一种特殊类型
- 枚举的作用:为了做信息的标准和信息的分类
定义枚举类的格式:
修饰符 enum 枚举名称{
第一行都是罗列枚举类实例的名称
}
枚举的特征:
- 枚举类都是继承了枚举类型:java.lang.Enum
- 枚举都是最终类,不可以被继承
- 构造器都是私有的,枚举对外不能创建对象
- 枚举类的第一行默认罗列枚举对象的名称
- 枚举类相当于多例模式
枚举的使用场景演示
六、抽象类
抽象类
- 在java中abstract是抽象的意思,可以修饰类、成员方法
- abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法
修饰符 abstract class 类名{
修饰符 abstract 返回值类型 方法名称(形参列表);
}
注意事项:
- 抽象方法只有方法签名,不能申明方法体
- 一个类中如果定义了抽象方法,这个类必须申明成抽象类,否则报错
抽象的使用场景:
- 抽象类可以理解为不完整的设计图,一般作为父类,让子类继承
- 当父类知道子类一定要完成某些行为,但每个子类该行为实现不同,于是父类把该行为定义为抽象方法的形式,具体实现交给子类。
继承抽象类的注意点:一个类如果继承了抽象类,那么这个类必须重写完抽象类的全部抽象方法,否则这个类也必须定义为抽象类。
抽象类的案例
抽象类的特征、注意事项
特征和注意事项:
- 类有的成员(成员变量、方法、构造器)抽象类都具备
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类
- 不能用abstract修饰变量、代码块、构造器
- 最重要:得到了抽象方法,失去了创建对象的能力
为什么?——反正法:假如抽象类可以创建方法,连方法体都没有,因此抽象类不能创建方法
final和abstract是什么关系?
互斥关系
final修饰类不能被继承,abstract定义的抽象类作为模板必须被继承
抽象方法定义通用功能让子类重写,final定义的方法子类不能重写
抽象类的应用知识:模板方法模式
什么时候使用模板方法模式?
- 使用场景说明:当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。
实现步骤:
- 把功能定义成一个模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码。
- 模板方法中不能决定的功能定义成抽象方法让具体子类去实现
模板方法建议使用final修饰,因为模板方法是给子类直接使用的,不是让子类重写的,一旦子类重写了模板方法,则模板方法失效,加上final可以防止子类重写模板方法。
七、接口
接口概述、特点
- 接口的格式:
public interface 接口名{
//常量
//抽象方法
}
- 什么是接口
接口是一种规范
接口的基本使用:被实现
接口的用法:
- 接口是用来被类实现(
implements
)的,实现接口的类称为实现类。实现类可以理解为所谓的子类。
修饰符 class 实现类 implements 接口1,接口2,接口3,...{
}
实现的关键字:implements
- 接口可以内类单实现,也可以被类多实现
- 接口实现的注意事项:一个类实现接口,必须重写完全部接口的全部抽象方法,否则这个类需要定义成抽象类
接口与接口的关系:多继承
类与类的关系:单继承
类与接口的关系:多实现
接口与接口的关系:多继承,一个接口可以同时继承多个接口
JDK8开始接口新增方法
Java只对接口恶成员方法进行了新增
项目Version2.0需要对Inter接口丰富,加入10个新的抽象方法,此时改了接口就业所有实现类实现这些方法。
如何能丰富接口功能的同时又不对子类代码进行更改?
- 允许接口中直接定义带有方法体的方法。
第一种:默认方法
- 类似之前写的普通实例方法:必须用default修饰
- 默认会public修饰。需要用接口的实现类的对象来调用
default void run(){
system.out.println("开始跑");
}
第二种:静态方法
- 默认会public修饰,必须static修饰
- 注意:接口的静态方法必须使用本身的接口名来调用
static void inAddr(){
system.out.println("开心~~");
}
第三种:私有方法
- 私有的实例方法:必须使用private修饰,从JDK1.9开始有
- 只能在本类中被其他的默认方法或私有方法访问
private void go(){
system.out.println("开始跑");
}
使用接口的注意事项
- 接口不能创建对象
- 一个类实现多个接口,多个接口中有同名的静态方法不冲突(接口的静态方法只能自己调用)
- 一个类继承了父类,同时又实现了接口,父类中和接口中有同名的方法,默认调用父类的
- 一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可。
- 一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。