Java final關鍵字用於限制用戶,能夠用於變量,方法以及類當中java
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方法,該方法將不可以被覆寫繼承
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類,那麼該類將不可以被繼承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嗎
不能夠,由於構造函數從不繼承
Java中的static關鍵字主要用於內存管理,能夠將static關鍵字與變量、方法、塊以及嵌套類一塊兒使用
經過使用靜態變量可使得程序的內存使用效率更高
class Student{ int id; String name; String college="MIT"; }
現假設學校裏面有500名學生,每次建立對象時,全部實例數據成員都將得到內存。每一名學生都有惟一的id
和name
,college
是同屬於一個學校,是指全部對象的共同屬性,所以將其設爲靜態變量,該字段就只獲取一次內存。
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(); } }
在這個例子中,靜態變量僅得到一次內存。若是任何對象更改了靜態變量的值,都將保存下來
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()
,而且能夠直接經過靜態方法訪問修改靜態變量的值。
限制
?爲何Java中的main方法是static
由於靜態方法不須要建立對象就可以直接被調用,而若是是非靜態方法,則JVM首先要建立一個對象,而後調用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類