我們來說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()調用的
感謝收看!同時也歡迎各位大佬支出那裡不好,新手上路~多多關照