1. 程式人生 > >細節3:static、final、this、super關鍵字

細節3:static、final、this、super關鍵字

teacher 副本 super 構造 基本數據 靜態 dom 輸出結果 new

1、static
static關鍵字修飾的變量或者函數是屬於整個類的,調用方式,類名.變量/方法
靜態函數中,只能調用靜態的變量或者函數
靜態的變量只會運行一次

public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();

System.out.println(myClass1.j);
System.out.println(myClass2.j);

}
}

class MyClass {
public static double j = Math.random();
}

兩次的j的值相同

2、final

1.修飾類
當用final修飾一個類時,表明這個類不能被繼承

2.修飾方法
把方法鎖定,以防任何繼承類修改它的含義

3.修飾變量
①對於一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改

當用final作用於類的成員變量時,成員變量(註意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變量一旦被初始化賦值之後,就不能再被賦值了

②如果是引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象

當用final修飾引用變量時
public class Test {
public static void main(String[] args) {
final MyClass myClass = new MyClass();
System.out.println(++myClass.i);

}
}

class MyClass {
public int i = 0;
}

輸出結果為1

這說明引用變量被final修飾之後,雖然不能再指向其他對象,但是它指向的對象的內容是可變的

③final和static

static作用於成員變量用來表示只保存一份副本,而final的作用是用來保證變量不可變

public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);

}
}

class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}

運行這段代碼就會發現,每次打印的兩個j值都是一樣的,而i的值卻是不同的

④使用final修飾方法參數的目的是防止修改這個參數的值,同時也是一種聲明和約定,強調這個參數是不可變的
3、this關鍵字
this:當前對象
this():當前類的無參構造方法,也可以指定有參的構造方法this(a)
1、如果一個類的方法需要訪問該類本身的成員變量或其它方法,可以使用this引用
2、每個對象可以使用this關鍵字引用它本身,如:
我們可以將this引用作為參數給一個方法,通過這種方式,一個對象可以將它本身的引用傳給其它對象
3、可以在構造方法中調用本類的其它構造方法,但是必須放在構造方法的第一行

4、super關鍵字
super:直接父類對象
super():直接父類的無參構造方法,也可以指定有參構造方法super(a)

1、當子類成員變量b覆蓋父類成員變量b時,使用super.b調用父類被隱藏的成員變量
public class Person {

String name = "張三";

}
public class Teacher extends Person{

String name = "李四";

public Teacher() {
System.out.println(name); //name = "李四"
System.out.println(super.name); //super.name = "張三"
}
}

2、當子類重寫了父類方法method時,使用super.method()調用父類被隱藏的方法

3、實例化子類對象時,必定會調用父類構造方法,如果沒有寫super(),則默認調用父類構造方法
如果父類謝了有參構造方法,編譯器就不會為父類創建無參構造方法,此時super()沒有被定義,則必須在子類構造方法中寫明super(參數),或在父類中顯示的寫出父類的無參構方法(一般使用這種方法)

public class Person {

String name;

public Person(String name) {
this.name = name;
}
}

在編寫一個類去繼承Person類的時候會產生編譯錯誤
解決方法一:在子類構造方法中編寫super(參數),且必須放在子類構造方法的第一行

public class Teacher extends Person{

String name;

public Teacher(String name) {
super(name);
System.out.println(name);
}
}

解決方法二:在父類中顯示的寫出父類的無參構方法(一般使用這種方法)
public class Person {
String name;
public Person() {}

public Person(String name) {
this.name = name;
}
}

細節3:static、final、this、super關鍵字