final 关键字
基本概念
- final本意为"最终的、不可变的",可以修饰类、成员方法以及成员变量。
使用方式
-
final 关键字修饰类体现在该类不能被继承。
- 主要用于防止滥用继承,如:java.lang.String类、System类等。
-
final 关键字修饰成员方法体现在该方法不能被重写但可以被继承。
- 主要用于防止不经意间造成重写,如:java.text.Dateformat类中的format方法等。
package com.lagou.task08; /** * @author hhc19 * @date 2021/12/30 11:31 * @description */ // ctr + shift + / 进行选中内容的多行注释,再来一次取消注释 //ctr + / 进行当前行的单行注释,再来一次取消注释 public /*final*/ class FinalClass { public final void show() { System.out.println("FinalClass 类中的 show 方法!"); } }
package com.lagou.task08; /** * @author hhc19 * @date 2021/12/30 11:31 * @description */ public class SubFinalClass extends FinalClass { // Cannot inherit(继承) from final 'com.lagou.task08.FinalClass /*@Override public void show() { // 'show()' cannot override 'show()' in 'com.lagou.task08.FinalClass'; overridden method is final super.show(); }*/ public static void main(String[] args) { SubFinalClass sfc = new SubFinalClass(); sfc.show(); // FinalClass 类中的 show 方法!final 方法虽然不能被重写但是可以被继承 } }
-
final 关键字修饰成员变量体现在该变量必须初始化且不能改变。final 修饰的成员变量不可被赋值。
- 主要用于防止不经意间造成改变,如:java.lang.Thread类中的MAX_PRIORITY等。
package com.lagou.task08; /** * @author hhc19 * @date 2021/12/30 11:48 * @description 编程实现final修饰成员变量的测试 */ // 对于final类型的成员变量必须初始化,但是初始化方式有3种:1、显示初始化;2、构造块初始化;3、构造方法体初始化 public class FinalMemberTest { // 显示初始化:在声明变量的同时就给成员变量给初始值的手法 // private final int cnt = 1; // Variable 'cnt' might not have been initialized 变量 cnt 可能未被初始化 private final int cnt; /*{ cnt = 2; // 构造块中进行初始化 Cannot assign a value to final variable 'cnt' 不能给final对象赋值 }*/ public FinalMemberTest() { cnt = 3; // 构造方法体中进行初始化 } public static void main(String[] args) { // 声明FinalMemberTest类型的引用指向该类的对象 FinalMemberTest fmt = new FinalMemberTest(); // 打印成员变量的数值 System.out.println(fmt.cnt); // 不加final时(new 完这个对象之后并没有对这个对象的成员变量进行初始化,默认使用默认值):0 } }
常量的概念
- 在以后的开发中很少单独使用final关键字来修饰成员变量,通常使用 public static final 关键字共同修饰成员变量来表达常量(数值不可改变的量)的含义,常量的命名规范要求是所有字母都要大写,不同的单词之间采用下划线连接。
- 一般像圆周率这种固定不变的数据我们才使用常量:public static final double PI = 3.14;
static 关键字和继承的总结
- static 关键字
- 概念(通常情况下成员变量都隶属于对象层级,每个对象都有一份,如果所有对象中某个成员变量一定相同时,我们可以使用static关键字修饰把它提升为类层级,整个独一份且被所有对象所共享。虽然可以使用引用.访问,但是推荐使用类名.方式访问)
- 使用方式:
- 非静态成员方法中既能访问非静态的成员也能访问静态的成员,因为静态被所有对象共享
- 静态成员方法中只能访问静态成员而不能访问非静态成员,是因为我们使用类名.调用的时候此时还没有对象
- 只有隶属类层级且被所有对象所共享的才能使用static关键字修饰,不能滥用static关键字
- 构造块和静态代码块:构造块是在构造方法之前对成员变量做一个统一的初始化操作,静态代码块是随着类的加载只执行一次
- 单例设计模式:当一个类对外提供且只提供一个对象时,这个类就叫单例类,这种思想就叫单例设计模式,单例设计模式实现的流程:1、私有化构造方法;2、声明本类类型的引用指向本类类型的对象,用private static共同修饰;3、提供公有的get方法负责把这个对象返回出去,用public static共同修饰。
- 单例设计模式分为:1、饿汉式;2、懒汉式;推荐使用饿汉式方式,原因涉及到了多线程。
- 继承(重中之重)
- 概念:可以将多个类相同的内容提取出来作为一个公共类,这多个类去吸收公共类中已有的特征和行为,而这多个类中只需要编写自己独有的特征和行为的方式我们就叫继承,用extends关键字。使用继承可以实现代码的复用,提高了可维护性、扩展性等等。也是多态的前提。
- 继承的4个特点:
- 除了构造方法和私有方法,子类都能继承,私有成员变量子类不能直接访问,只能通过公有的get、set方法进行访问;
- 无论使用何种方式构造子类对象时,都会调用父类中的无参构造方法,相当于super();的效果;
- 使用继承必须满足逻辑关系:子类 is a 父类,不能滥用继承;
- Java中只支持单继承,一个子类只能有一个父类,但是一个父类可以有多个子类。
- 方法的重写:从父类中继承的方法不满足子类的需求时,我们需要重新写一个来覆盖父类中的方法(两个方法的方法签名完全相同,除了子类的返回值可以改为子类类型之外),Override,一定要跟重载Overload加以区分。
- 重写的三个原则:
- 要求方法名相同、参数列表相同以及返回值类型相同,从Java5开始允许返回子类类型。也就是说在Java5之前父类中的show方法返回的是一个父类类型的对象,子类中的show方法也要返回一个父类类型的对象,这就叫一致。Java5之后,父类中返回父类类型,子类中允许返回子类类型。
- 要求方法的访问权限不能变小,可以相同或者变大。访问权限就是权限修饰符。子类继承父类可以看成是子类扩展父类,既然是扩展,哪里有访问权限变小的道理。
- 要求方法不能抛出更大的异常(异常机制)。
- IDEA的使用
- 访问控制
- public修饰哪都能用,private修饰只能自己用,方法都用public成员变量都用private修饰。
- package包的定义,定义包的目的:便于管理、区分同名问题、还可以进行权限控制。导包的时候可以导入类还可以导入静态成员(import static)。可以声明多层包以及单层包。
- final 关键字
- 概念:本意是"最终的"
- 修饰类:该类不能被继承
- 修饰成员方法:该方法不能被重写但可以被继承
- 修饰成员变量:该变量必须初始化且不能改变
- 常量:由 public static final 共同修饰