final、finally、finalize有什么区别

最简单的回答是:

 final——

final 用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖(重写)和类不可被继承

final属性:被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。由于不可变有两重含义:一是引用不可变;二是对象不可变。

final方法:当一个方法声明为final时,该方法不允许任何子类重写这个方法,但子类仍可以使用这个方法。

final类:当一个类被声明为final时,意味着它不能再派生出新的子类,不能作为父类被继承,所有方法都不能被重写。当这并不表示final类的成员变量也是不可改变的。

   finally——在异常处理时提供 finally 块来执行最终清除操作。
        如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 
          finally是try...catch...finally中使用,不管前面是否执行,finally里面的内容都一定会执行;
try{
}catch(Exception e)finally{
if(a!=NULL)                                       //一般这样用
a.close();
}

   finalize——方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
 

     finalize:是Object类的一个方法,在垃圾回收器执行时会调用被回收的对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。需要      注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

 finally块中的代码什么时候被执行

由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,所以任何语句执行就要在return前执行,

但是,如果try或者catch中都有return那么finallly中的语句将会覆盖别处的return

public class Finally {
public static int Finally(){
try {
return 1;
} catch (Exception e) {
return 0;
}finally{
System.out.println("nnnnnnnnnnn");
//return 3;
}

}

public static void main(String[] args) {
int result=Finally();
System.out.println(result);
}

}

执行结果为:

若把return 3;放进finally中得到结果为:

JDK中哪些类是不能继承的?

答案:不能继承的是哪些用final修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是finally的,

在JDK中,String和StringBuffer等都是基本类型,所以String、StringBuffer等类是不能继承的。

private和final是JAVA中两个常用的关键字。在类中,它们既可修饰成员变量,也可修饰方法。由于修饰变量比较简单,这里就不再赘述。
  假设在类A中定义一个由private修饰的方法method1,而类B是类A的子类。那么,类A中的method1不能被B继承,自然也 不可能被B访问,更不可能在B中重写。因而,在子类中定义一个与method1一模一样的方法是允许的。此时,B中的method1与A中的 method1毫无关系,互不影响。
  假设在类C中定义一个由final修饰的方法method2,类D继承类C。与被private修饰的method1相似,方法 method2不能被重写。但不同的是,method2可以被继承,D中的方法可以访问到method2。
  那么,我提个问题,如果一个父类中的某一方法同时被private和final修饰,这个方法能不能被继承或重写呢?其实,在这 里,final的作用已经被private覆盖了。换句话说,这种情形跟上面提到的第一种情形没有任何区别。你仍然可以在子类中定义与被private和 final修饰的一模一样的方法,只不过这个方法与父类中的方法没有任何关系。

原文地址:https://www.cnblogs.com/thomasbc/p/6650907.html