this、super、static(靜態)、final、instanceof

一、this

this: 代表本類的對象,this代表它所在函數所屬對象的引用。簡單說:哪個對象在調用this所在函數,this就代表哪個對象。 
this的應用:當定義類中功能時,該函數內部要用到調用該函數的對象時,這時用this來表示這個對象。但凡本類功能內部使用了本類對象,都用this表示。

示例:

class ThisDemo {
    public static void main(String[] args) {
        Person p1 = new Person("張三",25);
        Person p2 = new Person("李四",30);
        boolean b = p1.compare(p2);
        System.out.println(p1.name+" "+p1.age);
        System.out.println(p2.name+" "+p2.age);
        System.out.println("年齡是否相等:"+b);
    }
}

class Person {
    int age;
    String name;
    Person(int age){
        this.age = age;
    }
    Person(String name){
        this.name = name;
    }
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public boolean compare(Person p){
        return this.age == p.age;
    }
}

以上代碼中,new一個對象 p1 的時候,通過Person類的構造函數傳遞了參數 “張三”和25,在Person類的構造函數中,this.age = age,意爲把參數age的值傳遞給本類對象 p1 的age屬性。

this即代表本類對象的引用。

Person p1 = new Person("張三",25); // 這個語句也能看出this關鍵字能在構造函數間調用

二、super

super 功能和this相似,只不過 super是在有繼承時,對父類對象中成員的引用。

示例

public class SuperDemo{
    public static void main(String[] args){
        Manager m = new Manager("張三",5000,"財務部");
        System.out.println(m.getDetails());
    }
}
class Employee{
    private String name;
    private int salary;
    Employee(String name,int salary){
        this.name = name;
        this.salary = salary;
    }
    public String getDetails(){
        return "姓名:"+name+" 工資:"+salary;
    }
}
class Manager extends Employee{
    private String department;
    Manager(String name,int salary,String department){
        super(name,salary);              //調用父類Employee()的構造方法。
        this.department = department;
    }
    public String getDetails(){
        //調用父類Employee()的getDetails()方法。
        return super.getDetails()+" 部門:"+department;  
    }
}

三、static

static 是靜態的關鍵字,static用來修飾成員變量和成員函數

靜態特點:

(1)隨着類的加載而加載,存於方法區(數據區)中,靜態變量生命週期最長,因爲隨着類的消失而消失。

(2)靜態成員優先於對象而存在,就是類一加載進內存靜態成員就有了,這時還沒有對象。所以,靜態方法中不能使用 this、super 關鍵字。

(3)靜態成員被本類的所有對象所共享。

(4)靜態成員可以直接被類名調用。

(5)靜態方法只能訪問靜態成員。

靜態的利弊:
利:對對象的共享數據單獨存儲,節省空間。沒有必要每個對象中都存儲一份, 可以直接被類名調用。
弊:生命週期過長,訪問出現侷限性(靜態只能訪問靜態)。

實例變量(非靜態)和類變量(靜態)區別:
1、存放位置:類變量隨着類的加載而存在於方法區(數據區)中,實例變量隨着對象的建立而存在於堆內存中。
2、生命週期: 類變量生命週期最長,隨着類的消失而消失,實例變量生命週期隨着對象的消失而消失。

示例:

class StaticDemo{
    public static void main(String[] args){
        Person p = new Person();
        p.name = "張三";
        p.show();
    }
}
class Person {
    String name;   //非靜態成員變量,實例變量
    static String country = "CN";  //靜態成員變量,類變量
    public void show() {
        System.out.println(name+": "+country);
    }
}

四、final

final關鍵字可以修飾類、變量、方法。

final修飾的類不能被繼承,爲了避免被子類重寫。

final修飾的變量作爲常量,只能賦值一次不能被更改,既可以修飾成員變量也可以修飾局部變量。

final修飾的方法不能被重寫。

class FinalDemo{
    public static void main(String[] args){
        SubDemo s = new SubDemo();
        s.show2();
    }
}
class Demo{
    final int x = 3;  //x被final修飾,x的值不能再更改。
    final int show1(){
        return 4;
    }
}
class SubDemo extends Demo{
    //void show1(){}  錯誤,show1()被final修飾不能被重寫。
    public void show2(){
        System.out.println("x="+x+" y="+super.show1());
    }
}

五、instanceof

在Java中可以使用 instanceof 測試對象的類型,由該關鍵字構成的表達式的值爲布爾類型
public class InstanceofDemo{
    public static void main(String[] args){
        Manager m = new Manager("張三",5000,"財務部");
        if(m instanceof Manager){   //若m是manager類型對象,則if表達式的值爲ture,否測爲false
            System.out.println(m.getDetails());
        }
        else if(m instanceof Employee){
            System.out.println(m.getDetails());
        }
        else{
            System.out.println("error");
        }
    }
}
class Employee{
    private String name;
    private int salary;
    Employee(String name,int salary){
        this.name = name;
        this.salary = salary;
    }
    public String getDetails(){
        return "姓名:"+name+" 工資:"+salary;
    }
}
class Manager extends Employee{
    private String department;
    Manager(String name,int salary,String department){
        super(name,salary);       //調用父類Employee()的構造方法。
        this.department = department;
    }
    public String getDetails(){
        //調用父類Employee()的getDetails()方法。
        return super.getDetails()+" 部門:"+department;
    }
}


發佈了39 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章