Java关键字final,static使用总结
一,final
在Java中,final关键字是”这是无法改变的”和”终态的“含义,它可以修饰非抽象类,非抽象类成员方法和变量。
1,final类不能被继承,没有子类,类中方法是final的(太监类)。
2,final方法不能被子类覆写,但可以被继承。
3,final成员变量表示常量。只能被赋值一次,赋值后值不能改变。
4,final不能用于修饰构造方法。
注意:父类中的private成员方法是不能被子类方法覆写的,也不能不被继承。所以private成员方法默认是final类型的。
1,final类
final类是不能被继承的,因此final类的成员方法不能被覆写,默认都是final的。在设计类的时候,如果这个类不需要有子类,类的实现细节不能被改变,并且这个类不会再被扩展,那就设计成final类。
2,final方法
如果一个类不需要子类覆写其方法,则将方法定义成final类型方法。
使用final方法的原因:
(1)把方法锁定,组织任何继承类改变它的意义和实现。
(2)高效,在遇到final方法的时候,会转入内嵌机制,大大提高效率。
package org.panda.Final;class Test1 //创建类{ public void f1() //新建方法 { System.out.println("f1") ; } public final void f2() //新建final方法,不能被覆写,但可以被继承 { System.out.println("f2") ; } public void f3() { System.out.println("f3"); } private void f4() { System.out.println("f4"); }}public class FinalDemo01 extends Test1{ public void f1() //覆写父类中一般方法 { System.out.println("父类中一般方法被覆写"); } public void f3() { System.out.println("f3"); } public static void main(String[] args) { FinalDemo01 f = new FinalDemo01() ;//声明并实例化子类对象 f.f1() ; //因为子类覆写父类方法,所以调用子类中方法 f.f2() ; //调用从父类中继承的final方法 f.f3() ; //调用从父类中继承的方法 //f.f4() ; //调用失败,无法从父类中继承获得。 }}
3,final变量(常量)
用final修饰的成员变量表示常量,值一旦改变不能更改变。修饰的变量要被初始化。
final修饰的变量有三种,静态变量,实例变量和局部变量。分别表示三种类型的常量。
二,static关键字
static表示“全局”或“静态”的意思。用来修饰成员变量和成员方法。也可以形成static静态代码块。在Java语言中没有全局变量的概念。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接使用类名来访问。
类名.静态变量名
类名.静态方法名(参数类型,参数列表)
用static修饰的代码块称为静态代码块,当JVM加载类时,就会执行该代码块。
1,static变量
一种是被static修饰的变量,叫静态变量或类变量;另一中没有被static修饰的变量,叫实例变量。
2,static方法
静态方法可以直接通过类名直接调用,任何的实例都可以调用。因此在静态方法中不能使用this和super关键字。不能直接访问所属类的实例变量和变量方法(就是不带static的的成员变量和成员方法),只能访问所属类的静态成员变量和成员方法。
三,static 和 final一起用表示什么?
static final用来修饰成员变量和成员方法,可以简单理解为“全局常量”。
对于变量,表示一旦给值就不能修改。并且可以通过类名直接调用。
对于方法,表示不可覆盖,可以通过类名直接访问。
package org.panda.Final;import java.util.ArrayList;public class StaticFinalDemo01 { private static final String strStaticFinalVar = "IronMan" ; //定义属性用static final修饰 private static String strStaticVar = "null" ; //定义属性用static修饰 private final String strFinalVar = "null" ; //定义属性用final修饰 private static final int intStaticFinalVar = 0 ; //定义int属性用static final修饰 private static final Integer integerStaticFinalVar = new Integer(8) ; //定义容器 private static final ArrayListalStaticFinalVar = new ArrayList () ; //定义容器 private void test() { System.out.println("--------------值处理前-------------"); System.out.println("strStaticFinalVar:"+strStaticFinalVar); System.out.println("strStaticVar:"+strStaticVar); System.out.println("strFinalVar:"+strFinalVar); System.out.println("intStaticFinalVar:"+intStaticFinalVar); System.out.println("integerStaticFinalVar:"+integerStaticFinalVar); System.out.println("alStaticFinalVar:"+alStaticFinalVar); //strStaticFinalVar = "Hulk" ; //错误,final表示终态,不能被改变 strStaticVar = "Hello World" ; //正确,static表示类变量,值可以改变 //strFinalVar = "ByeBye World" ; //错误,final表示终态,不能被改变 //intStaticFinalVar = 1 ; //错误,final表示终态,不能被改变 //integerStaticFinalVar = new Integer(8) ; //错误,final表示终态,不能被改变 alStaticFinalVar.add("aaa") ; //正确,容器变量本身没有变化,但存放内容发生变化 System.out.println("--------------值处理后-------------"); System.out.println("strStaticFinalVar:"+strStaticFinalVar); System.out.println("strStaticVar:"+strStaticVar); System.out.println("strFinalVar:"+strFinalVar); System.out.println("intStaticFinalVar:"+intStaticFinalVar); System.out.println("integerStaticFinalVar:"+integerStaticFinalVar); System.out.println("alStaticFinalVar:"+alStaticFinalVar); } public static void main(String[] args) { new StaticFinalDemo01().test() ; }}