一、代码块
(一)*字段不存在多态的特征
通过对象调用字段,在编译时期就已经决定了调用哪一块的内存空间的数据。字段不存在覆盖的概念,在多态时,不能有多态的特征(在运行时期体现子类的特征)。只有方法才有覆盖的概念。
当子类和父类存在相同字段的时候,无论修饰符是什么,都会在各自的内存空间中存储数据。
(二) 什么是代码块
在类或者方法中直接使用“{}”括起来的一段代码,表示一块代码区域。
代码里的变量属于局部变量,只在自己所在的区域(前后的{})内有效。
根据代码块定义的位置不同,我们又分成三种形式:
(三) 局部代码块:直接定义在方法内部的代码块:
一般的情况下,我们不会直接使用局部代码块。会结合if、while、for、try等关键字联合来表示一块代码区域。
(四) 初始化代码块(构造代码块):直接定义在类中:
每次创建对象的时候都会执行初始化代码块:
每次创建对象的时候都会调用构造器,在调用构造器之前,会先执行本类中的初始化代码块(如下代码)。
// 编译前
class CodeBlockDemo{
{
System.out.println("初始化代码块");
}
CodeBlockDemo(){
System.out.println("构造器...");
}
}
// 编译后
class CodeBlockDemo{
CodeBlockDemo(){
System.out.println("初始化代码块");
System.out.println("构造器...");
}
}
通过反编译之后,我们发现初始化代码块也作为构造器的最初语句。
在平时的开发中,一般不使用初始化代码块。即使要做初始化操作,一般在构造器中做即可。如果需要初始化的代码较多,构造器的结构比较混乱,此时可以专门定义一个方法做初始化操作,再在构造器中调用即可。
(五) 静态代码块:使用static修饰的初始化代码块:
在主方法执行之前执行静态代码块,而且只执行一次。
main方法是程序的入口,为什么静态代码块会优先于mian方法执行?
静态成员随着字节码的加载而加载进JVM,此时main方法还没有被执行,因为方法需要JVM调用。
先把字节码加载进JVM,而后JVM再调用main方法。
静态代码块一般,我们用来做初始化操作,加载资源、加载配置文件等。
二、final修饰符
(一) 理解final
final本省的含义是“最终的,不可改变的”,他可以修饰非抽象类,非抽象方法和变量。注意:构造方法不能使用final修饰,因为构造方法不能被继承,一定是最终的。
(二) final类
final修饰的类:表示最终类,该类不能再有子类。
只要满足以下条件就可以把一个类设计成final类:
① 某类不是专门为继承而设计的。
② 出于安全考虑,类的实现细节不允许改动,不准修改源代码。
③ 确定该类不会再被扩展。
Java里final修饰的类有很多,比如八大基本数据类型包装类和String等。
(三) final方法
final修饰的方法:最终的方法,该方法不能被子类覆盖。
什么时候方法需要final修饰:
① 在父类中提供的统一的算法骨架,不准子类通过方法覆盖来修改,此时使用final修饰(模板方法设计模式)。
② 在构造器中调用的方法(初始化方法),此时一般使用final修饰。
注意: final修饰的方法,子类可以调用,但是不能覆盖。
(四) final变量
final修饰的变量:表示常量,只能被赋值一次,不能再次赋值。
① final变量必须显示的指定初始值,系统不会为final字段初始化。
② final变量一旦赋予初始值,就不能被重新赋值。
③ 常量名规范:常量名符合标识符,单词全部使用大写字母,如果是多个单词组成,单词间使用下划线隔开。
int类型的最大值:final int MAX_VALUE = …;
补充概念:全局静态常量:public static final 修饰的变量,直接使用类名调用即可。
重点:
final修饰基本类型变量:表示