Java修饰符权限
什么是权限修饰符?
权限修饰符:是用来控制一个成员能够被访问的范围的。
可以修饰成员变量,方法,构造器,内部类,不同权限修饰符修饰的成员能够被访问的范围将受到限制。
权限修饰符的分类和具体作用范围:
权限修饰符:有四种作用范围由小到大(private -> 缺省 -> protected - > public )
final的关键字
final的作用
final 关键字是最终的意思,可以修饰(方法,变量,类)
1、修饰类:表明该类是最终类,不能被继承。
2、修饰方法:表明该方法是最终方法,不能被重写。
3、修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)。
final修饰变量的注意
final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。
常量
常量概述和基本作用
常量是使用了--public static final--修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。
常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性。
常量命名规范:英文单词全部大写,多个单词下划线连接起来。 常量的执行原理
在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量。
这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样的。
枚举
枚举的概述
枚举是Java中的一种特殊类型
枚举的作用:"是为了做信息的标志和信息的分类
定义枚举类的格式: 枚举的特征:
1、枚举类都是继承了枚举类型:java.lang.Enum
2、枚举都是最终类,不可以被继承。
3、构造器都是私有的,枚举对外不能创建对象。
4、枚举类的第一行默认都是罗列枚举对象的名称的。
5、枚举类相当于是多例模式。
抽象类
抽象类概述
在Java中abstract是抽象的意思,如果一个类中的某个方法的具体实现不能确定,就可以申明成abstract修饰的抽象方法(不能写方法体了),
这个类必须用abstract修饰,被称为抽象类。
格式如下:
修饰符 abstrace class 类{
修饰符 abstract 返回值类型 方法名称(参数列表);
}
抽象的使用总结与注意事项
抽象类可以理解成类的不完整设计图,是用来被子类继承的。
一个类如果继承了抽象类,那么这个类必须重写完抽象类的-- 全部---抽象方法,否则这个类也必须定义成抽象类。
问题1:抽象类的作用是什么样的?
可以被子类继承、充当模板的、同时也可以提高代码复用。
问题2:抽象方法是什么样的?
只有方法签名,没有方法体,使用了abstract修饰。
问题3:继承抽象类有哪些要注意?
一个类如果继承了抽象类,那么这个类必须重写完抽象类的全部抽象方法。
否则这个类也必须定义成抽象类。
抽象类的案例
系统需求
某加油站推出了2种支付卡,一种是预存10000的金卡,后续加油享受8折优惠,另一种是预存5000的银卡 ,后续加油享受8.5折优惠。
请分别实现2种卡片进入收银系统后的逻辑,卡片需要包含主人名称,余额,支付功能。
分析实现
创建一张卡片父类:定义属性包括主人名称、余额、支付功能(具体实现交给子类)
创建一张白金卡类:重写支付功能,按照原价的8折计算输出。
创建一张银卡类:重写支付功能,按照原价的8.5折计算输出。
FuCard卡片父类 BaiJin_Card白金卡类 YIn_Card银卡类 Test测试类 抽象类的特征、注意事项
1、有得有失: 得到了抽象方法,失去了创建对象的能力。
2、类有的成员(成员变量、方法、构造器)抽象类都具备
3、抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
4、一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
5、不能用abstract修饰变量、代码块、构造器。
final和abstract是什么关系?
1、互斥关系
2、abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承。
3、抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。
抽象类的应用知识:模板方法模式 什么时候使用模板方法模式
使用场景说明:当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。
模板方法模式实现步骤
把功能定义成一个所谓的模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码。
模板方法中不能决定的功能定义成抽象方法让具体子类去实现。
模板方法模式案例:
某软件公司要为某银行的业务支撑系统开发一个利息结算系统,账户有活期和定期账户两种,
活期是0.35%,定期是 1.75%,定期如果满10万额外给予3%的收益。
结算利息要先进行用户名、密码验证,验证失败直接提示,登录成功进行结算
Account账户抽象类
public abstract class Account {
public static final String LOGIN_NAME = "itheima"; // 常量
public static final String PASS_WORD = "123456"; // 常量
private String cardId;
private double money;
public Account(){}
public Account(String cardId, double money){
this.cardId = cardId;
this.money = money;
}
/**
* 登录结算利息
*/
public void handle(String loginName, String passWord){
// 1. 判断是否登录成功
if(LOGIN_NAME.equals(loginName) && PASS_WORD.equals(passWord)){
System.out.println("登录成功~~~");
// 2. 结算利息
double result = calc(); // 活期与死期唯一不同的部分在于利息的计算方式不同,定义一个抽象方法,在子类中进行计算
System.out.println("本账户利息是:" + result);
}else {
// 3. 登录失败
System.out.println("登录失败~~~");
}
}
public abstract double calc();
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
CurrentAccount活期账户类: FixedAccount死期账户类: Test测试类:
接口
接口概述、特点
接口用关键字interface来定义
public interface 接口名 { // JDK8之前接口中只能有常量和抽象方法
// 常量
// 抽象方法
}
1、JDK8之前接口中只能是--抽象方法--和--常量--,没有其他成分了。
2、接口不能实例化。
3、接口中的成员都是public修饰的,写不写都是,因为规范的目的是为了公开化。
接口的基本使用:被实现
接口是用来被类实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子类。
修饰符 class 实现类 implements 接口1,接口2, 接口3.....{
}
从上面可以看出,接口可以被类单实现,也可以被类多实现。
接口实现的注意事项:
一个类实现接口,必须重写完全部接口的全部抽象方法,否则这个类需要定义成抽象类。
接口与接口的关系:多继承
1、类和类的关系:单继承(extends)。
2、类和接口的关系:多实现(implements)。
3、接口和接口的关系:多继承,一个接口可以同时继承多个接口。
接口多继承的作用: 规范合并,整合多个接口为同一个接口,便于子类实现。
JDK8开始接口新增方法
1、默认方法:default修饰,实现类对象调用。
类似之前写的普通实例方法:必须用default修饰
默认会public修饰。需要用接口的实现类的对象来调用
2、静态方法:static修饰,必须用当前接口名调用
默认会public修饰,必须static修饰。
注意:接口的静态方法必须用本身的接口名来调用。
3、私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。他们都会默认被public修饰。
就是私有的实例方法:,必须使用private修饰,从JDK 1.9才开始有的。
只能在本类中被其他的默认方法或者私有方法访问。
注意:JDK8新增的3种方法我们自己在开发中很少使用,通常是Java源码涉及到的,我们需要理解、识别语法、明白调用关系即可。
public interface SportManInter {
/**
* 1、JDK 8开始:默认方法(实例方法)
* -- 必须default,默认用public修饰
* -- 默认方法,接口不能创建对象,这个方法智能过继给实现类,由实现类的对象调用。
*/
default void run(){
go();
System.out.println("跑的非常快~~~");
}
/**
* 2、静态方法
* 必须使用static修饰,默认用public修饰
* -- 接口静态方法,必须接口名自己调用
*/
static void inAddress(){
System.out.println("University");
}
/**
* 3、私用方法
* -- JDK 1.9开始支持的
* -- 必须在接口内部才能被访问
*/
private void go(){
System.out.println("跑的快~~~");
}
}
class PingPongMan implements SportManInter{
}
class Test{
public static void main(String[] args) {
PingPongMan p = new PingPongMan();
p.run();
// PingPongMan.inAddress(); // 接口名称不可调用接口的静态方法
// p.inAddress(); // 接口实现类不可调用接口的静态方法错误
SportManInter.inAddress(); // 接口中的静态方法只能用接口名称.静态方法的调用方式
}
}
使用接口的注意事项
1、接口不能创建对象
2、一个类实现多个接口,多个接口中有同样的静态方法不冲突。
3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。
4、一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可。
5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。
|