2019年08月19日(星期一)  农历:己亥年七月十九
  • 首页
  • JAVA
  • Java关键字final、static使用总结

作者:三年。分类: JAVA 标签: java java基础 学习 java关键字

一、final 
依据程序上下文环境,Java关键词final有“这是无法改动的”或许“终态的”含义,它能够润饰非笼统类、非笼统类成员办法和变量。你也许出于两种了解而需求阻止改动:规划或功率。 
final类不能被承继,没有子类,final类中的办法默许是final的。 
final办法不能被子类的办法掩盖,但能够被承继。 
final成员变量表明常量,只能被赋值一次,赋值后值不再改动。 
final不能用于润饰结构办法。 
留意:父类的private成员办法是不能被子类办法掩盖的,因而private类型的办法默许是final类型的。 
1、final类 
final类不能被承继,因而final类的成员办法没有机会被掩盖,默许都是final的。在规划类时分,假如这个类不需求有子类,类的完结细节不允许改动,而且坚信这个类不会载被拓展,那么就规划为final类。 
2、final办法 
假如一个类不允许其子类掩盖某个办法,则能够把这个办法声明为final办法。 
运用final办法的因素有二: 
榜首、把办法锁定,避免任何承继类修正它的含义和完结。 
第二、高效。编译器在遇到调用final办法时分会转入内嵌机制,大大提高履行功率。 
例如:


public class Test1 { 
public static void main(String[] args) { 
// TODO 主动生成办法存根 
} 
public void f1() { 
System.out.println("f1"); 
} 
//无法被子类掩盖的办法 
public final void f2() { 
System.out.println("f2"); 
} 
public void f3() { 
System.out.println("f3"); 
} 
private void f4() { 
System.out.println("f4"); 
} 
} 
public class Test2 extends Test1 { 
public void f1(){ 
System.out.println("Test1父类办法f1被掩盖!"); 
} 
public static void main(String[] args) { 
Test2 t=new Test2(); 
t.f1(); 
t.f2(); //调用从父类承继过来的final办法 
t.f3(); //调用从父类承继过来的办法 
//t.f4(); //调用失利,无法从父类承继获得 
} 


3、final变量(常量) 
用final润饰的成员变量表明常量,值一旦给定就无法改动! 
final润饰的变量有三种:静态变量、实例变量和部分变量,别离表明三种类型的常量。 
从下面的比如中能够看出,一旦给final变量初值后,值就不能再改动了。 
别的,final变量界说的时分,能够先声明,而不给初值,这中变量也称为final空白,不管啥情况,编译器都保证空白final在运用之前有必要被初 始化。可是,final空白在final关键词final的运用上提供了更大的灵敏性,为此,一个类中的final数据成员就能够完结依目标而有所不一样, 却有坚持其稳定不变的特征。


package org.leizhimin; 
public class Test3 { 
private final String S="final实例变量S"; 
private final int A=100; 
public final int B=90; 
public static final int C=80; 
private static final int D=70; 
public final int E; //final空白,有必要在初始化目标的时分赋初值 
public Test3(int x){ 
E=x; 
} 
/** 
* @param args 
*/ 
public static void main(String[] args) { 
Test3 t=new Test3(2); 
//t.A=101; //犯错,final变量的值一旦给定就无法改动 
//t.B=91; //犯错,final变量的值一旦给定就无法改动 
//t.C=81; //犯错,final变量的值一旦给定就无法改动 
//t.D=71; //犯错,final变量的值一旦给定就无法改动 
System.out.println(t.A); 
System.out.println(t.B); 
System.out.println(t.C); //不引荐用目标办法拜访静态字段 
System.out.println(t.D); //不引荐用目标办法拜访静态字段 
System.out.println(Test3.C); 
System.out.println(Test3.D); 
//System.out.println(Test3.E); //犯错,由于E为final空白,依据不一样目标值有所不一样. 
System.out.println(t.E); 
Test3 t1=new Test3(3); 
System.out.println(t1.E); //final空白变量E依据目标的不一样而不一样 
} 
private void test(){ 
System.out.println(new Test3(1).A); 
System.out.println(Test3.C); 
System.out.println(Test3.D); 
} 
public void test2(){ 
final int a; //final空白,在需求的时分才赋值 
final int b=4; //部分常量--final用于部分变量的景象 
final int c; //final空白,一向没有给赋值. 
a=3; 
//a=4; 犯错,现已给赋过值了. 
//b=2; 犯错,现已给赋过值了. 
} 

 
4、final参数 
当函数参数为final类型时,你能够读取运用该参数,可是无法改动该参数的值。


public class Test4 { 
public static void main(String[] args) { 
new Test4().f1(2); 
} 
public void f1(final int i){ 
//i++; //i是final类型的,值不允许改动的. 
System.out.print(i); 
} 

二、static 
static表明“大局”或许“静态”的意思,用来润饰成员变量和成员办法,也能够形成静态static代码块,可是Java语言中没有大局变量的概念。 
被static润饰的成员变量和成员办法独立于该类的任何目标。也就是说,它不依靠类特定的实例,被类的一切实例同享。只需这个类被加载,Java虚拟机 就能依据类名在运行时数据区的办法区内定找到他们。因而,static目标能够在它的任何目标创立之前拜访,无需引证任何目标。 
用public润饰的static成员变量和成员办法实质是大局变量和大局办法,当声明它类的目标市,不生成static变量的副本,而是类的一切实例同享同一个static变量。 
static变量前能够有private润饰,表明这个变量能够在类的静态代码块中,或许类的别的静态成员办法中运用(当然也能够在非静态成员办法中运用 --废话),可是不能在别的类中经过类名来直接引证,这一点很主要。实际上你需求搞了解,private是拜访权限限制,static表明不要实例化就可 以运用,这么就简略了解多了。static前面加上其它拜访权限关键词的作用也以此类推。 
static润饰的成员变量和成员办法习惯上称为静态变量和静态办法,能够直接经过类名来拜访,拜访语法为: 
类名.静态办法名(参数列表...) 
类名.静态变量名 
用static润饰的代码块表明静态代码块,当Java虚拟机(JVM)加载类时,就会履行该代码块(用途非常大,呵呵)。 
1、static变量 
依照是不是静态的对类成员变量进行分类可分两种:一种是被static润饰的变量,叫静态变量或类变量;另一种是没有被static润饰的变量,叫实例变量。两者的区别是: 
关于静态变量在内存中只要一个拷贝(节约内存),JVM只为静态分配一次内存,在加载类的过程中完结静态变量的内存分配,可用类名直接拜访(方便),当然也能够经过目标来拜访(可是这是不引荐的)。 
关于实例变量,没创立一个实例,就会为实例变量分配一次内存,实例变量能够在内存中有多个拷贝,互不影响(灵敏)。 
2、静态办法 
静态办法能够直接经过类名调用,任何的实例也都能够调用,因而静态办法中不能用this和super关键词,不能直接拜访所属类的实例变量和实例办法(就 是不带static的成员变量和成员成员办法),只能拜访所属类的静态成员变量和成员办法。由于实例成员与特定的目标相关!这个需求去了解,想了解其间的 道理,不是回忆!!! 
由于static办法独立于任何实例,因而static办法有必要被完结,而不能是笼统的abstract。 
3、static代码块 
static代码块也叫静态代码块,是在类中独立于类成员的static句子块,能够有多个,方位能够随意放,它不在任何的办法体内,JVM加载类时会执 行这些静态的代码块,假如static代码块有多个,JVM将依照它们在类中呈现的先后顺序依次履行它们,每个代码块只会被履行一次。例如:


public class Test5 { 
private static int a; 
private int b; 
static{ 
Test5.a=3; 
System.out.println(a); 
Test5 t=new Test5(); 
t.f(); 
t.b=1000; 
System.out.println(t.b); 
} 
static{ 
Test5.a=4; 
System.out.println(a); 
} 
public static void main(String[] args) { 
// TODO 主动生成办法存根 
} 
static{ 
Test5.a=5; 
System.out.println(a); 
} 
public void f(){ 
System.out.println("hhahhahah"); 
} 
 
运行成果: 
3 
hhahhahah 
1000 
4 
5 
使用静态代码块能够对一些static变量进行赋值,最终再看一眼这些比如,都一个static的main办法,这么JVM在运行main办法的时分能够直接调用而不必创立实例。 
4、static和final一块用表明啥 
static final用来润饰成员变量和成员办法,可简略了解为“大局常量”! 
关于变量,表明一旦给值就不行修正,而且经过类名能够拜访。 

关于办法,表明不行掩盖,而且能够经过类名直接拜访。


温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/2612 人参与

发表评论:



手Q扫描加入Java初学者群