【Java】final & static

final關鍵字

Java final關鍵字用於限制用戶,能夠用於變量,方法以及類當中java

final.jpg

final 變量

final關鍵字與變量一塊兒使用,該變量沒有值,稱爲空白final變量或者未初始化final變量。只可以在構造函數中初始化。空白final如果是靜態(static)的,則只可以在靜態塊中初始化。函數

若是定義一個final變量,該變量的值不可以被改變,將會是一個常量this

public class Test {
    final int date = 2020;
    void run(){
        date = 2021;
    }

    public static void main(String[] args){
        Test t = new Test();
        t.run();
    }
}

在IDEA中運行上述代碼;spa

Output:code

Error:(6, 9) java: 沒法爲最終變量date分配值對象

public class Test {
    final int date;
    Test() {
        date = 2020;
        System.out.println(date);
    }


    public static void main(String[] args){
        Test t = new Test();
    }
}

final 方法

若是定義一個final方法,該方法將不可以被覆寫繼承

class Bike{
    final void run(){
        System.out.println("running");
    }
}

class Test extends Bike{
    void run(){
        System.out.println("running safely with 100kmph");
    }

    public static void main(String args[]){t
        Test t= new Test();
        t.run();
    }
}

Output:內存

Error:(10, 10) java: package1.Test中的run()沒法覆蓋package1.Bike中的run()被覆蓋的方法爲finalget

final 類

若是定義一個final類,那麼該類將不可以被繼承it

final class Bike{ }

class Test extends Bike{
    void run(){
        System.out.println("go go go!");
    }
    public static void main(String args[]){
        Test t= new Test();
        t.run();
    }
}

Output:

Error:(5, 20) java: 沒法從最終package1.Bike進行繼承

注:final 方法能夠被繼承可是不能覆寫

?什麼是空白或未初始化的final變量?

再變量聲明時沒有進行初始化的final變量

?能夠聲明構造函數爲final嗎

不能夠,由於構造函數從不繼承

static關鍵字

Java中的static關鍵字主要用於內存管理,能夠將static關鍵字與變量、方法、塊以及嵌套類一塊兒使用

java-static-keyword1.png

static 變量

  • static變量可用於引用全部對象的公共屬性
  • static變量在類加載時僅在類區域中得到一次內存

經過使用靜態變量可使得程序的內存使用效率更高

class Student{  
     int id;  
     String name;  
     String college="MIT";  
}

現假設學校裏面有500名學生,每次建立對象時,全部實例數據成員都將得到內存。每一名學生都有惟一的idnamecollege是同屬於一個學校,是指全部對象的共同屬性,所以將其設爲靜態變量,該字段就只獲取一次內存。

class Student{  
   int rollno;
   String name;  
   static String college ="MIT";
   
   Student(int r, String n){  
       rollno = r;  
       name = n;  
   }
}

例1:沒有靜態變量的計數器

class Counter{  
    int count=0;
    Counter(){  
        count++;
        System.out.println(count);  
    }  
    public static void main(String args[]){  
        Counter c1=new Counter();  
        Counter c2=new Counter();  
        Counter c3=new Counter();  
    }  
}

在這個例子中,建立了一個名爲count的實例變量,該變量在構造函數中遞增。因爲實例變量在建立對象時獲取內存,全部在每一個對象中count變量的值都爲1

例2:靜態變量計數器

class Counter2{  
    static int count=0;
    Counter2(){  
        count++;
        System.out.println(count);  
    }  
    public static void main(String args[]){  
        Counter2 c1=new Counter2();  
        Counter2 c2=new Counter2();  
        Counter2 c3=new Counter2();  
    }  
}

在這個例子中,靜態變量僅得到一次內存。若是任何對象更改了靜態變量的值,都將保存下來

static 方法

  • 靜態方法屬於類而不是類的對象
  • 能夠直接調用靜態方法而不須要建立類的實例
  • 靜態方法能夠訪問靜態數據成員並更改其值
class Student{
    int rollno;
    String name;
    static String college = "MIT";
    static void change(){
        college = "PKU";
    }
    Student(int r, String n){
        rollno = r;
        name = n;
    }
    void display(){
        System.out.println(rollno + " " + name + " " + college);
    }
}

public class TestStaticMethod{
    public static void main(String args[]){
        Student.change();  
        Student s1 = new Student(001, "Mike");
        Student s2 = new Student(002, "Hulk");
        Student s3 = new Student(003, "Mary");

        s1.display();
        s2.display();
        s3.display();
    }
}

在上面的例子中,能夠不實例化就直接調用靜態方法change(),而且能夠直接經過靜態方法訪問修改靜態變量的值。

限制

  • 靜態方法不可以使用非靜態數據成員或者直接調用非靜態方法
  • this和super不可以再static context中使用

?爲何Java中的main方法是static

由於靜態方法不須要建立對象就可以直接被調用,而若是是非靜態方法,則JVM首先要建立一個對象,而後調用main方法,這將致使額外的內存分配

static 塊

  • 用於初始化靜態數據成員
  • 在類加載時,它在main方法以前執行
class Test{  
    static{
        System.out.println("static block is invoked");
    }  
    public static void main(String args[]){  
        System.out.println("Hello main");  
    }  
}

Output: static block is invoked Hello main

?能夠執行沒有main方法的程序嗎

不能夠。從JDK1.7開始,沒有main方法就沒法執行Java類

參考

https://www.javatpoint.com/final-keyword

https://www.javatpoint.com/static-keyword-in-java

相關文章
相關標籤/搜索