天天看點

java之this,super和代碼塊精選

前言:

本篇主要講兩塊,一個是this和super的用法,再一個就是代碼塊的概念,文章每一部分的概念解釋,代碼,示範效果,都會貼在文章的對應地方,幫助大家了解和加深印象!

java之this,super和代碼塊精選

一.介紹

在程式設計語言裡面每一個定義的方法裡,都會有一個this關鍵字,這個this關鍵不是由在那兒定義來決定的,而是由誰來執行的決定的。這是判斷this關鍵。

比如說吃飯這個方法它是由上帝來定義的,世界上所有的人來執行。吃飯這個行為發生的時候,主體就是在吃飯的這個人,也就是要有人執行吃飯這個行為。

有時候我們需要在一個行為(方法)裡,能明确知道這個行為是誰來執行的,确切的說就是我要知道誰在吃飯。

在JAVA類中使用super來引用父類的成分,如果一個類從另外一個類繼承,我們new這個子類的執行個體對象的時候,這個子類對象裡面會有一個父類對象。怎麼去引用裡面的父類對象呢?使用super來引用,super是目前對象裡面的父對象的引用。

二.知識點介紹

1、this

2、Super

3、This/super差別

4、代碼塊

三.知識點詳解   

1、this

this是自身的一個對象,代表對象本身,可以了解為:指向對象本身的一個指針。

三種用法:(this的用法在java中大體可以分為3種)

(1) 普通的直接引用:

this相當于是指向目前對象本身。

代碼示範:

package com.Test;

    public class Test {
        String s = "磊哥的java曆險記-@51部落格";

        public Test(String s1) {
            System.out.println("s = " + s1);
            //this目前對象,調用s屬性
            System.out.println("1 -> this.s = " + this.s);
            //把參數值賦給成員變量,成員變量的值改變
            this.s = s1;
            System.out.println("2 -> this.s = " + this.s);
        }

        public static void main(String[] args) {
            Test x = new Test("HelloWorld!");
            //驗證成員變量值的改變
            System.out.println("s=" + x.s);
        }
    }      
java之this,super和代碼塊精選
(2) 形參與成員名字重名,用this來區分:

代碼示範:

package com.Test;

        //建立人類
        class Person {
            private int age = 10;
            public Person(){
                System.out.println("初始化年齡:"+age);
            }
            //get方法
            public int GetAge(int age){
                this.age = age;
                return this.age;
            }
        }
        //主方法 
        public class Test {
            public static void main(String[] args) {
                //建立Person對象
                Person Lei = new Person();
                //對象調用方法,列印輸出
                System.out.println("磊哥的年齡是: "+Lei.GetAge(25));
            }
        }      
java之this,super和代碼塊精選
(3)引用構造函數

這個和super放在一起講,見下面。

(4)用到一些内部類和匿名類

如事件處理,當在匿名類中用this時,這個this則指的是匿名類或内部類本身。這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名。

代碼示範:

package com.Test;

public class Test {
    int i = 1;
    private  final  static  String name = "磊哥的java曆險記-@51部落格";
    public Test() {
        //建立線程,線程問題後面會講,現在就是測試用一下
        Thread thread = new Thread() {
            public void run() {
                for (int j=0;j<5;j++) {
                    Test.this.run();//調用外部類的方法
                    try {
                        //線程睡眠1000毫秒
                        sleep(1000);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        }; // 注意這裡有分号
        //線程開始
        thread.start();

    }
    public void run() {
        System.out.println("i = " + i);
        i++;
    }
    //主方法調用
    public static void main(String[] args)
            throws Exception {
        new Test();
        System.out.println("============="+name+"=============");

    }
}      
java之this,super和代碼塊精選
java之this,super和代碼塊精選
(5)this同時傳遞多個參數

代碼示範:

package com.Test;

public class Test {
        String x;
        String y;

        static void showtest(Test tc) {//執行個體化對象
            System.out.println(tc.x + " \n" + tc.y);
        }
        void seeit() {
            showtest(this);
        }

        public static void main(String[] args) {
            Test p = new Test();
            p.x = "磊哥的java曆險記";
            p.y = "@51部落格";
            p.seeit();
        }
    }      
java之this,super和代碼塊精選

2、super

super可以了解為是指向自己超(父)類對象的一個指針,而這個超類指的是離自己最近的一個父類。

super也有三種用法:

(1)普通的直接引用

與this類似,super相當于是指向目前對象的父類,這樣就可以用super.xxx來引用父類的成員。

(2)子類中的成員變量或方法與父類中的成員變量或方法同名

代碼示範:

package com.Test;

public class Test {
        String name;
        void value() {
            name = "磊哥的java曆險記";
        }
    }
    //繼承父類
    class City extends Test {
        String name;
        void value() {
            name = "_@51部落格";
            super.value();      //調用父類的方法
            System.out.println(super.name);
            System.out.println(name);

        }

        public static void main(String[] args) {
            City c=new City();
            c.value();
        }
    }      
java之this,super和代碼塊精選

可以看到,這裡既調用了父類的方法,也調用了父類的變量。若不調用父類方法value(),隻調用父類變量name的話,則父類name值為預設值null。

(3)引用構造函數

super(參數):調用父類中的某一個構造函數(應該為構造函數中的第一條語句)。

this(參數):調用本類中另一種形式的構造函數(應該為構造函數中的第一條語句)。

代碼示範:

package com.Test;

class Test {
    public static void prt(String s) {
        System.out.println(s);
    }
    //構造方法(1)
    Test() {
        prt("父類·無參數構造方法: ");
    }
    //構造方法(2)
    Test(String name) {
        prt("父類·含一個參數的構造方法: ");
    }
}
class Chinese extends Test {
    Chinese() {
        super(); // 調用父類構造方法(1)
        prt("子類·調用父類”無參數構造方法“: ");
    }
    Chinese(String name) {
        super(name);// 調用父類具有相同形參的構造方法(2)
        prt("子類·調用父類”含一個參數的構造方法“: "+name);
    }
    Chinese(String name, int age) {
        this(name);// 調用具有相同形參的構造方法(3)
        prt("子類:調用子類具有相同形參的構造方法:his age is " + age+"  昵稱:"+name);
    }
    public static void main(String[] args)
    {
        Chinese cn = new Chinese();
        cn = new Chinese("磊哥的java曆險記");
        cn = new Chinese("磊哥的java曆險記", 25);
    }
}      
java之this,super和代碼塊精選
java之this,super和代碼塊精選

3、this/super差別

(1) super(參數):調用基類中的某一個構造函數(應該為構造函數中的第一條語句)

(2) this(參數):調用本類中另一種形成的構造函數(應該為構造函數中的第一條語句)

(3) super:super.變量名   

super.成員函資料名(實參)

(4) this:它代表目前對象名(在程式中易産生二義性之處,應使用this來指明目前對象;如果函數的形參與類中的成員資料同名,這時需用this來指明成員變量名)

(5) 調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隐含地調用super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。

(6) super()和this()類似,差別是,super()從子類中調用父類的構造方法,this()在同一類内調用其它方法。

(7) super()和this()均需放在構造方法内第一行。

(8) 盡管可以用this調用一個構造器,但卻不能調用兩個。

(9) this和super不能同時出現在一個構造函數裡面,因為this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,是以在同一個構造函數裡面有相同的語句,就失去了語句的意義,編譯器也不會通過。

(10) this()和super()都指的是對象,是以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。

(11)  從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。

4.代碼塊

    在Java中,我們想解決一定的問題,需要很多代碼才能解決,這個時候,我們就需要使用”{}”将我們的代碼整理成一塊兒代碼,那麼“{}”括起來的代碼被稱為代碼塊。

(1) 、局部代碼塊

    普通代碼塊就是直接定義在方法或語句中,以”{}”劃定的代碼區域,此時隻需要關注作用域的不同即可,方法和類都是以代碼塊的方式劃定邊界的。

代碼示範:
package com.Test;

class Test{
    public static void main(String[] args) {
        //第一個代碼塊
        {
            String x = "磊哥的java曆險記";
            System.out.println("普通代碼塊: " + x);
        }

        //第一個代碼塊
        String x= "磊哥的java曆險記_@51部落格";
        System.out.println("代碼塊之外: " + x);
    }
    
}      
java之this,super和代碼塊精選

(2)、構造代碼塊

    直接定義在類中成員位置的代碼塊,優先于構造方法執行,構造代碼塊用于執行所有對象均需要的初始化動作,每建立一個對象均會執行一次構造代碼塊。

代碼示範:
public classPerson {
       privateString name;
       privateint age;
       static{
           System.out.println("靜态代碼塊執行了");
       }
       {
           System.out.println("構造代碼塊執行了");
       }
       Person(){
       System.out.println("Person無參數的構造函數執行");
       }
       Person(intage){
           this.age= age;
           System.out.println("Person(age)參數的構造函數執行");
       }
    }
    classPersonDemo{
       publicstatic void main(String[] args) {
           Personp = new Person();
           Personp1 = new Person(23);
       }
    }      
java之this,super和代碼塊精選

(3)、靜态代碼塊

    靜态代碼塊是定義在成員位置,使用static修飾的代碼塊。

特點:

它優先于主方法執行、優先于構造代碼塊執行,當以任意形式第一次使用到該類時執行。

    該類不管建立多少對象,靜态代碼塊隻執行一次。

    可用于給靜态變量指派,用來給類進行初始化。

  代碼示範:
package com.Test;

public class Test {
        private String name;
        private int age;
        //靜态代碼塊 磊哥的java曆險記_@51部落格
        static{
            System.out.println("靜态代碼塊執行了");
        }
    }
    class Person{
        private String name;
        //成員代碼塊 又叫構造代碼塊 對象級别的代碼塊,每次建立對象都會執行一次
        {
            System.out.println("我是構造代碼塊");
        }
        //靜态代碼塊 類級别的代碼塊,隻有第一次建立對象時才運作,之後建立對象就不執行了
        static{
            System.out.println("靜态代碼塊");
        }

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

        public Person(){
            super();
        }

        public String getName() {
            return name;
        }

        public void setName(String name){
            this.name = name;
        }
    }

    class TestDemo{
        public static void main(String[] args){
            int a =10;
            //局部代碼塊限定變量作用域範圍
            {
                System.out.println(a);
                int b =20;
                System.out.println(b);
            }
            //  System.out.println(b);
            Person p = new Person();
            Person p2 = new Person("磊哥");
            Person p3 = new Person("磊哥");
            Person p4 = new Person("磊哥");
            Person p5 = new Person("磊哥");
        }
    }      

 代碼截圖和結果大家自己看:

java之this,super和代碼塊精選
java之this,super和代碼塊精選

 結語:

代碼和舉例都是一些簡單易懂的例子,希望我的文章能給兄弟們帶來收獲,哪怕一點也行,如果有模拟問題可以在下面評論,看到就會回複!