天天看點

this是什麼?this的概念是什麼?

我們來說this這個關鍵字

我們先看this的概念

調用類中的屬性 this.屬性

調用類中的方法 this.方法()

調用類中的構造 this()

class Person3{
	private String name;
	private int age ;
	
	public Person3() {
	}
	
	public Person3(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}
public class ThisDemo {
		public static void main(String[] args) {
			Person3 p = new Person3("MOHAN",19);
		System.out.println(p.getName()+"--->"+p.getAge());
		}
}   
           

此代碼輸出結果:MOHAN--->19 此輸出結果為正常結果

我們再來看下面代碼

class Person3{
	private String name;
	private int age ;
	
	public Person3() {
	}
	
	public Person3(String name, int age) {
     //兩處代碼差別就在這個裡
		name = name;
		age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class ThisDemo1{
		public static void main(String[] args) {
			Person3 p = new Person3("MOHAN",19);
		System.out.println(p.getName()+"--->"+p.getAge());
		}
}
           

此代碼輸出結果:null--->0

為什麼是這樣的結果呢?

我們來說一下我們可以說ThisDemo代碼中

public Person3(String name, int age) {
        this.name = name;
        this.age = age;
    }
           

這個是有this的 那我們來說this的作用 翻譯過來是‘這個’的意思

Person3 p = new Person3("MOHAN",19);
           

這時 name=“MOHAN” age=19; 賦給了this.name age賦給了 this.age

這個this指向了我們本類中的屬性;然後通過執行個體化對象中指派之後;

進行輸出

System.out.println(p.getName()+"--->"+p.getAge());
           

就可以直接找到我們的值;

然後我們再看ThisDemo2中

public Person3(String name, int age) {
     //兩處代碼差別就在這個裡
		name = name;
		age = age;
	}
           

好這時我們就可以看出來 兩個代碼的差別。這個代碼是沒有this的

這時候我們來看我們

Person3 p = new Person3("MOHAN",19);
           

這個時候 name=“MOHAN” age=19; 賦給了name age賦給了age

雖然都是name 和 age 但是根據我們的就近原則;

這個時候我們來舉個例子

我們來說 如果我現在需要一根筆我的辦公桌上有一根和我的家裡有一根

我是不是要的辦公桌上的,誰傻乎乎的去家裡拿是吧!我們的this如果指向家裡的那隻有去家裡拿了,這個就是this。

現在我們有一個程式

要求:在一個類中有三個構造方法,但是不管怎麼樣都要列印:“新的對象産生了”

class Person4{
	private String name;
	private int age ;
	
	public Person4() {
		System.out.println("新的對象産生了");
	}
	public Person4(String name) {
		System.out.println("新的對象産生了");
		this.name = name;
	}
	public Person4(String name, int age) {
		System.out.println("新的對象産生了");
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class ThisDemo03 {
		public static void main(String[] args) {
			Person4 p = new Person4("MOHAN",19);
		System.out.println(p.getName()+"--->"+p.getAge());
		}
}
           

輸出結果為:

新的對象産生了

MOHAN--->19

但是問題來了 我們每一個構造方法中都要寫 一個 輸出語句既不節省資源還不美觀。

那麼我們來用this()

class Person5{
	private String name;
	private int age ;
	
	public Person5() {
		System.out.println("新的對象産生了");
	}
	public Person5(String name) {
		this();
		this.name = name;
	}
	public Person5(String name, int age) {
		this(name);
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class ThisDemo5 {
		public static void main(String[] args) {
			Person5 p = new Person5("MOHAN",19);
		System.out.println(p.getName()+"--->"+p.getAge());
		}
}
           

輸出結果為:

新的對象産生了

MOHAN--->19

我們可以看到輸出結果是一樣的代碼簡便美觀了許多

提示:要知道我們的構造方法是對象操作前最早調用的,是以使用this調用構造方法的時候調用代碼必須放在構造方法的首行,不然不但編譯會報錯,執行結果也一定會報錯。

但是要注意:我們在使用this調用構造方法的時候必須要保證有一個構造方法是沒有使用this()調用的,而此構造方法也會被作為調用的出口,一般這個出口都會使用無參構造來完成。如果都互相調用會進行死循環會報錯!

以上是this使用最多的兩種情況但是this有一個最終的概念----表示目前對象目前對象正在調用目前類中方法的對象,稱為目前對象。

我們來看一下代碼

class Person6{
	public void print(){
		System.out.println(this);
	}
}
public class ThisDemo6 {
		public static void main(String[] args) {
			Person6 p1 = new Person6();
			Person6 p2 = new Person6();
			p1.print();
			System.out.println(p1);
			p2.print();
			System.out.println(p2);
		}
}
           

輸出結果:[email protected]

                    [email protected]

                    [email protected]

                    [email protected]

有此結果可以得出之前的this屬性就是代表目前對象的屬性

class A{
	private B b = null;
	public void fun(){
		this.b= new B(this);
		this.b.fun();
	}
	public void print(){
		System.out.println("hello world");
	}
}
class B{
	private A a =null;
	public B(A a){
		this.a =a;
	}
	public void fun(){
		this.a.print();
	}
}
public class ThisDemo7 {
		public static void main(String[] args) {
			new A().fun();
		}
}
           

輸出結果為:hello world

這個結果隻是為了告訴我們A類的本方法,

接下來我們來說對象的比較

問?一個對象能不能在外部直接通路類中的私有成員

一個對象在類的内部能否通路私有成員呢?

class Person0{
	private String name;
	private int age ;
	
	public Person0() {
	}
	public Person0(String name, int age) {
		this.name= name;
		this.age = age;
	}
	
	public void fun(Person0 demp){
		demp.name ="mohan";
		demp.age = 20;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class CompareDemo01 {
		public static void main(String[] args) {
			Person0 p = new Person0("MOHAN",19);
			p.fun(p);
		System.out.println(p.getName()+"--->"+p.getAge());
		}
}
           

輸出結果為:mohan--->20

我們可以看到輸出的是我們方法中賦的值,這個就是說明一個對象在類的内部可以直接問通路私有成員。

以上代碼隻用于在類的比較中。

class Person02{
	private String name;
	private int age ;
	
	public Person02() {
	}
	public Person02(String name, int age) {
		this.name= name;
		this.age = age;
	}
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class CompareDemo02 {
		public static void main(String[] args) {
			Person0 p2 = new Person0("MOHAN",19);
			Person0 p1 = new Person0("MOHAN",19);
			if(p1.getName().equals(p2.getName())&&p1.getAge()==p2.getAge()){
				System.out.println("是同一個人");
			}
		}
}
           

輸出結果:是同一個人

此時這個比較操作應該放在類的内部 充當一個功能

就像這樣

class Person03{
	private String name;
	private int age ;
	
	public Person03() {
	}
	public Person03(String name, int age) {
		this.name= name;
		this.age = age;
	}
	public boolean compaer(Person03 per){
		if(this==per){
			return true;
		}
		if(this.name.equals(per.name)&&this.age==per.age){
			return true;
		}else{
			return false;
		}
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class CompareDemo03 {
		public static void main(String[] args) {
			Person03 p2 = new Person03("MOHAN",19);
			Person03 p1 = new Person03("MOHAN",19);
			if(p1.compaer(p1)){
				System.out.println("是同一個人");
			}
		}
}
           

輸出結果:是同一個人

總結:this是在Java中比較難了解的一個關鍵字,我們在我們的代碼中總是見到,

this屬性就是代表目前對象的屬性

使用this調用構造方法的時候必須要保證有一個構造方法是沒有使用this()調用的

感謝收看!同時也歡迎各位大佬支出那裡不好,新手上路~多多關照