一、包
1.概述
-
包是用来分门别类的管理各种不同的类,类似文件夹
- 建包利于程序管理和维护
-
建包语法:
公司域名倒写.技术名称;- 建议:全部小写且有意义
- 建包语句必须在第一行;
2.导包
-
相同包下类直接访问,不同包下要导包
- 格式:
import 包名.类名;
- 格式:
-
如果类中使用不同包下相同类名,只可以导入一个,另一个用全名访问;
3. idea设置
- setting
- Auto Import
- Add unambiguous imports on the fly(自动导包选中)
二、权限修饰符
1.概述
- 权限修饰符:用来控制一个成员能够被访问的范围;
- 修饰对象:成员变量,方法,构造器,内部类;
2.权限修饰符的分类和具体作用范围
作用范围由小到大:private< 缺省 < protected < public
| 分类 | 作用范围 |
|---|---|
| private | 同一类中 |
| 缺省 | 上+同一包中类 |
| protected(子类访问权限) | 上+不同包下的子类 |
| public | 上+不同包下无关类 |
3.自己定义成员一般满足如下要求:
- 成员变量一般私有;
- 方法一般公开;
- 如果成员只希望本类访问,用private修饰;
- 只希望本类和同一包下类和其子类访问,用protected
三、关键字 final
1. final作用
-
final关键字是最终的意思,可以修饰(类、方法、变量);
-
修饰类:该类是最终类,不能被继承;
- 工具类:不要继承,直接使用
-
修饰方法:最终方法,不能重写
-
修饰变量:第一次赋值后,不能再赋值(有且仅能赋值一次)
- 实例和静态成员变量,生成时必须赋值;修饰实例基本不用
-
public static void main(String[] args) { final double r1 = 3.14; //r1 = 2.5; //第一次赋值 buy(0.99); } public static void buy(final double r2){ //r2=1.99; }
2.修饰注意
- final修饰基本类型变量,存储的数据值不能发生改变
- final修饰引用类型变量,地址值不能变化,内容可以
四、常量constant
1.常量概述
- 使用了public static final 修饰的成员变量,必须有初始化值,执行过程中值不可变;
- 作用和好处:可以用于系统配置信息,方便维护,提高可读性;
- 常量格式:英文单词全部大写,单词间下划线连接
2.常量执行原理
- 编译阶段进行“宏替换”,常量地方全部替换成真实字面量;
- 好处是使用常量的执行性能与字面量一样
3.做信息标志和分类
代码可读性好,实现了软编码形式;
五、枚举
1.枚举概述
-
java中一种特殊类型;
-
作用:为了做信息的标志和信息的分类
-
格式:
-
修饰符 enum 枚举名称{ }
-
2.枚举特征
- 枚举类都继承了枚举类型:java.lang.Enum
- 枚举都是最终类,不可以继承
- 构造器都是私有的,枚举不能对外创建对象
- 第一行默认都是罗列枚举对象的名称;
- 枚举类相当于多例模式;
3.使用场景
- 具体信息:常量;
- 信息标注(如上下左右):用枚举;
六、抽象类
1.概述
在java中abstract是抽象的意思,可以修饰类、成员方法;
/**
* 抽象类:
*/
public abstract class Animal {
/**
* 抽象方法,不能有具体实现
*/
public abstract void run();
}
2.注意
- 抽象方法只有方法签名,不能声明方法体(具体实现)
- 类中定义了抽象方法,类必须声明为抽象类,否则报错
- 子类继承父类,必须重写父类所有抽象方法,否则这个类必须定义为抽象类
3.抽象使用场景
- 抽象类是不完整的设计图,作为父类,由子类继承实现;
- 父类知道子类要完成某行为,但每个子类实现过程不一样,于是父类将其定义为抽象,具体交由子类完成
4.抽象类案例
/**
* 两种卡:
* 白金卡:原价八折
* 银卡:原价八折五
*/
public abstract class Card {
private String name;
private double money;
/**
* 定义一个支付的抽象方法:
*/
public abstract void pay(double money);
}
/*
金卡具体实现
*/
public class GoldCard extends Card{
@Override
public void pay(double money) {
System.out.println("当前消费:"+money);
System.out.println("余额:"+getMoney());
double rs = money*0.8;
System.out.println("实际消费:"+rs);
}
}
5.抽象类特征和注意事项
-
抽象类中不一定有抽象方法;有抽象方法一定是抽象类;
-
一个类继承抽象类,必须重写全部抽象方法,否则这个类必须定义抽象类;
-
不能用abstract修饰变量,代码块,构造器
-
最重要特征:
- 得到了抽象方法,失去了创建对象的能力(有得有失) ;抽象类不应该实例化
5.1 final和abstract是什么关系?
-
互斥关系:
- final修饰类,不能继承;
- abstract修饰类,作为父类需要被子类继承
- 抽象方法需要子类重写;final定义的方法不能重写;
6.抽象类应用:模板方法模式
6.1使用场景说明
当系统中同一功能多处在开发,该功能中大部分代码一致,只有其中部分功能不一样;
6.2 模板方法实现步骤
功能定义成一个所谓模板,放在抽象类,模板方法中只放入通用且能确定的代码;
模板方法中不能决定的功能定义成抽象方法,让具体子类实现;
public abstract class Student {
public final void write(){
System.out.println("开头");
writeMain();
System.out.println("结尾");
}
public abstract void writeMain();
}
public class StudentMiddle extends Student{
@Override
public void writeMain() {
System.out.println("这是中学生写的!");
}
}
6.3 模板方法建议final修饰,为什么?
模板方法是直接给子类使用的,不是让子类重写的
6.4 模板方法解决的问题
- 提高代码的复用性;
- 模板方法定义了通用结构,不能确定的地方定义成抽象方法,由子类实现,使用者只需要实现自己的部分功能
七、接口
1.接口概述
-
接口格式:
-
public interface 接口名{ //常量 //抽象方法 }
-
-
JDK8之前,接口中只能是抽象方法和常量,没有其他成分;
-
接口是一种规范,规范一定是公开的;
2.接口的用法
- 接口是用来被实现(implements)的,实现接口的类称为实现类
- 接口可以被类单实现,也可以被多实现
3.接口实现的注意事项
类实现接口,必须重写完接口的全部抽象方法,否则类需定义为抽象类
4.关系总结
- 类和类:单继承
- 类和接口:多实现
- 接口和接口:多继承,一个接口可以同时继承多个接口
5.接口多继承作用
规范合并,整合多个接口为同一个接口,便于子类实现;
6.JDK8开始接口新增方法
-
第一种:默认方法
- 实例方法,必须用default修饰
- 默认会public修饰,需要接口的实现类对象调用
-
第二种:静态方法
- 默认public修饰,必须static修饰
- 注意:接口静态方法,必须用接口名来调用
-
第三种:私有方法
- 私有实例方法,从jdk1.9开始
- 只能在本类(接口)中被其他默认方法或私有方法访问
7.接口注意事项
-
接口不能创建对象();
- 接口更加彻底的抽象
-
一个类实现多个接口,多接口中有同样的静态方法不冲突;
- 静态方法由接口名直接调用
-
一个类实现多个接口,多接口中有同名默认方法,不冲突,类重写该方法即可;
- 有同名默认方法,谁的都不用,自己重写一个
-
一个类,继承了父类,又实现接口,又同名方法,默认用父类;
- 就近原则,继承父类
-
一个接口继承多个接口,没有问题,多接口中存在规则冲突则不能继承
- 类似,类实现多接口,但这里不能重写方法
RecordDate:2021/08/12