前言:
本篇主要講兩塊,一個是this和super的用法,再一個就是代碼塊的概念,文章每一部分的概念解釋,代碼,示範效果,都會貼在文章的對應地方,幫助大家了解和加深印象!
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwVZnFWbp1zczV2YvJHctM3cv1Ces0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLjRGZyE2M1ETN4cDMxU2NwEzN1cjY3gTNkFmZjJ2NyQGZ3ImMxAzLchDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
一.介紹
在程式設計語言裡面每一個定義的方法裡,都會有一個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);
}
}
(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));
}
}
(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+"=============");
}
}
(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();
}
}
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();
}
}
可以看到,這裡既調用了父類的方法,也調用了父類的變量。若不調用父類方法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);
}
}
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);
}
}
(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);
}
}
(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("磊哥");
}
}
代碼截圖和結果大家自己看:
結語:
代碼和舉例都是一些簡單易懂的例子,希望我的文章能給兄弟們帶來收獲,哪怕一點也行,如果有模拟問題可以在下面評論,看到就會回複!