Final
final修饰类
被final修饰的类无法被继承,类中属性全部默认为final,所以在Java中不允许使用abstract和final修饰同一个类,因为abstract抽象类必须被继承。当在设计类时,假如一个类不需要有子类,内容不允许被修改, 并且此类后期不会扩展,那么就将此类设置为final类。
final修饰方法
被final修饰的方法不允许被子类重写,但不影响被子类继承。
public class FinalClass {
public final void TestFinal(){
System.out.println("父类--这是一个final方法");
}
}
public class FinalTest extends FinalClass {
// 子类无法重写(override父类的final方法,否则编译时会报错
/*
* public void TestFinal(){ System.out.println("子类--重写final方法"); }
*/
public static void main(String[] args) {
FinalClass sc = new FinalClass();
sc.TestFinal();
}
}
需要特别说明的是父类中的private修饰的方法也可以通过final修饰,但是由于子类无法继承private方法,所以也就无法对方法进行重写 ,子类还是可以创建同名方法,但是不会有重写效果。两者之间也不会有任何必然的联系。
final修饰变量
当final修饰一个变量或者方法参数时,这个变量或参数只能赋值一次,且后期使用只能查询不能更改变量或参数的值。但是Java虚拟机为变量设置的默认值不记作一次赋值,被final修饰的变量必须初始化,初始化的方式有以下几种:
- 在定义变量时初始化
- final可以在初始化块中进行初始化,不可以在静态初始化块中初始化
- 静态final变量可以在定义是初始化,也可以在静态初始化块中初始化,不可以在非静态初始化块中初始化
- final变量还可以在类的构造器中初始化,但是静态final变量不可以
public class FinalTest {
// final变量在定义时初始化
public final int A = 10;
// final变量在初始化块中初始化
public final int B;
{
B = 20;
}
//finalg常量不能在静态初始化块中初始化
//public final int C; static{ C = 30; }
//静态final常量,在定义时初始化
public static final int STATIC_D = 40;
// 静态final常量在静态初始化块中初始化
public static final int STATIC_E;
static {
STATIC_E = 50;
}
//静态常量不能在非静态初始化块中初始化
//public static final int STATIC_F;{STATIC_F=60;}
//final变量
public final int G;
//静态final常量不可以在构造器中初始化
//public static final int STATIC_H;
//在构造器中初始化
public FinalTest() {
G=70;
//静态final常量不可以在构造器中初始化
//STATIC_H=80;
}
//不管是静态还是非静态的final变量第二次赋值时,编译都会报错
//A=99;
//STATIC_D=99;
}
Finally
finally是关键字,在异常处理中,try子句中执行需要运行的内容,catch子句用于捕获异常,finally子句表示不管是否发生异常,都会执行。finally可有可无。但是try…catch必须成对出现。
Finalize
finalize() 方法名,Object类的方法,Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象进行调用。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的子类覆盖 finalize() 方法以整理系统资源或者执行其他清理操作。
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "姓名:" + this.name + ",年龄:" + this.age;
}
public void finalize() throws Throwable {// 对象释放空间是默认调用此方法
System.out.println("对象被释放-->" + this);// 直接输出此对象,调用toString()方法
}
}
public class SystemDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person("zhangsan", 30);
per = null;// 断开引用,释放空间
// 方法1:
System.gc();// 强制性释放空间
// 方法2:
// Runtime run=Runtime.getRuntime();
// run.gc();
}
}
参考文章
https://www.cnblogs.com/xwdreamer/archive/2012/04/17/2454178.html
https://www.cnblogs.com/smart-hwt/p/8257330.html
文尾
文章均为学习阶段记录笔记,若有不妥请留言指正。谢谢!