Java中this、static、super、final
阿新 • • 發佈:2018-10-31
this
class Person { public String _name; public int _age; public Person() //無參構造 { System.out.println("Person()"); } public Person(String name) { this._name=name; System.out.println("Person(String name)"); } public Person(String name,int age) { this(name); //調Peson(String name)構造方法 //this._name=name; this._age=age; System.out.println("Person(String name,int age)"); } } public class Construtor { public static void main(String[] args) { //Person p1=new Person(); //當沒有寫建構函式時,系統會自動生成一個無參構造,當寫了建構函式,系統不會自動生成無參構造 //Person p2=new Person("pick"); Person p3=new Person("pick",11); //Person(String name) Person(String name,int age) } }
表示呼叫本類屬性:只要在類中訪問類的屬性一定要加上this關鍵字
表示呼叫本類方法:
呼叫普通方法
this.方法名(引數)
當有類的繼承關係時,表示本類方法一定要加上this關鍵字;
呼叫構造方法
- this呼叫構造方法必須放在構造方法首行,this(引數)
- this呼叫構造方法不允許成環;
this表示當前物件,並不是當前物件的地址
super
super用於方法
super用於構造方法
class Person { private String name; public Person(String name) { this.name=name; } } class Student extends Person { private int num; public Student(String name,int num) { super(name); //調父類有參構造,必須寫super(引數) this.num=num; } // public Student(int num) //調父類無參構造,可以不寫super // { // this.num=num; // } } public class Final { public static void main(String[] args) { Student s1=new Student(1); } }
- 當子類呼叫父類無參構造時,super可寫可不寫,表示呼叫父類無參構造;
當子類呼叫父類有參構造時,super(引數列表),必須寫,要告訴編譯器當前呼叫的是哪個有參構造; - 子類構造方法中呼叫父類構造必須放在第一行
- this與super不能同時使用(因為兩者在建構函式中都必須放第一行)
super用於普通方法
super.方法名(引數)
用於在子類中明確呼叫父類被覆寫的方法,這時super.方法名(引數)可以不放在第一行
class Student extends Person { private int num; public void func() { super.func(); System.out.println("Student::func()"); } } public class Final { public static void main(String[] args) { Student s=new Student(); //person::func() Student::func() s.func(); } }
super用於屬性:
super.屬性名 表示呼叫父類中被覆寫的屬性(許可權不能是private,private屬性變數在子類中不可見,但是子類繼承了父類的私有屬性和私有方法)
class Person
{
public String name="dad";
}
class Student extends Person
{
private String name="son";
public void show()
{
System.out.println(super.name); //父類屬性
System.out.println(this.name); //子類的屬性
}
}
this和super區別:
static
- static屬性稱為類屬性,儲存在全域性資料區中(方法區-所有物件共享區域),用類名來呼叫,與類例項化物件無關。
- static方法 ---- 類方法(靜態方法)
通過類名呼叫,與物件例項化無關 - 區域性變數不能用static修飾,即在方法中變數(不論是主方法,還是普通方法)
private/static不能用於外部類,即 static class Perosn{},錯誤
final
在java中,final被稱為終結器。
final修飾類
- 當一個類被final 關鍵字修飾,表示該類不能擁有子類(該類不允許被繼承);
- 一旦一個類被final修飾,該類的所有方法都會被預設加上final.(成員變數不會被加上final)。
final修飾方法
- 當一個方法被final修飾,明確表示該方法不能被覆寫;
- 當一個方法被private修飾後,相當於加了一個final關鍵字。
final修飾屬性
- final可以用於成員變數、本地變數,被final修飾的變數變成常量,即值不可以改,型別也不可以改;
- 被final修飾的成員變數必須在宣告時初始化(也可以在構造塊或者構造方法中初始化,即final修飾的變數是在物件產生時初始化),否則編譯器會報錯,並且初始化後無法被修改。而普通型別的成員變數可在構造方法中,也可以在getseter中初始化。
public final int a=100; //在宣告時初始化
public static final int a=5;// 在編譯器載入類時初始化
static final 是全域性變數,所有物件共享此變數,並且在類載入時(編譯時)初始化,效率較高,通過類名呼叫
- final修飾引用資料型別的變數(值不能被改)
資料型別轉換
當使用 +、-、*、/、%、運算操作時,遵循如下規則:
只要兩個運算元中有一個是double型別的,另一個將會被轉換成double型別,並且結果也是double型別,如果兩個運算元中有一個是float型別的,另一個將會被轉換為float型別,並且結果也是float型別,如果兩個運算元中有一個是long型別的,另一個將會被轉換成long型別,並且結果也是long型別,否則(運算元為:byte、
short、int 、char),兩個數都會被轉換成int型別,並且結果也是int型別。但是final修飾的域型別不會發生變化。
請判斷下列語句的正確性:
public class Final
{
public static void main(String[] args)
{
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7=9; //final定義變數值和型別都不能變
b3=b1+b2; // byte 和byte型別相加,兩個數型別都轉為int,且結果也是int,從int到byte需要強轉,所以該語句錯誤
b6=b4+b5; // final byte 和final byte相加型別不會變,結果也是byte,所以該語句正確
b8=b1+b4; // byte 和final byte相加,結果是 int ,從int到byte需要強轉,所以該語句錯誤
b7=b2+b5; // b7是final修飾,只不可以改,所以該語句錯誤
System.out.println(b6); //10
}
}