1. 程式人生 > >Java中this、static、super、final

Java中this、static、super、final

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
    }
}