阿里云【名师课堂】Java面向对象开发35 ~ 37:this关键字

35、this调用属性

this可以:

  • 调用本类属性
  • 调用本类方法(普通、构造)
  • 表示当前对象(相对概念)

调用本类属性

观察一段程序

class Person{
	private String name ;
	private int age ;
	
	public Person(){}
	public Person(String n,int a){
		name = n ;
		age = a ;
	}
	
	public String getInfo(){
		return "Name is " + name + " Age is " + age ;
	}
}

public class ThisDemo {
	public static void main(String args[]) {
		System.out.println(new Person("Dexter",20).getInfo()) ;
    }
}

在这里插入图片描述
分析:当前类中的构造方法的核心目的在于:为类中的nameage两个属性进行初始化。

  • 但是现在构造方法的参数声明不准确:public Person(String n,int a)中的na究竟是什么?
  • 一个比较好的做法是将参数的名称和属性名称统一起来,如下:
	public Person(String name,int age){
		name = name ;
		age = age ;
	}

在这里插入图片描述

  • 想法虽好,但是实施起来是不对的,这称为参数与属性同名问题。所以为了明确的标记出要使用的是属性还是方法的参数,在属性前统一加上this
  • 改正版代码
class Person{
	private String name ;
	private int age ;
	
	// this.属性:当前对象(方法)中的属性
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	
	public String getInfo(){
		return "Name is " + this.name + " Age is " + this.age ;
	}
}

public class ThisDemo {
	public static void main(String args[]) {
		System.out.println(new Person("Dexter",20).getInfo()) ;
    }
}

在这里插入图片描述

  • 完整的写一遍(加上setter、getter等):
class Person{
	private String name ;
	private int age ;
	
	public Person(){}
	public Person(String name,int age){
		setName(name) ;
		setAge(age) ;
	}
	
	// this.属性:当前对象(方法)中的属性
	public void setName(String name){
		this.name = name ;
	}
	public void setAge(int age){
		this.age = age ;
	}
	public String getName(){
		return name ;
	}
	public int getAge(){
		return age ;
	}
	public String getInfo(){
		return "Name is " + this.name + " Age is " + this.age ;
	}
}

public class ThisDemo {
	public static void main(String args[]) {
		/*
		Person per = new Person() ;
		per.getName("Dexter") ;
		per.getAge(20) ;
		System.out.println(per.getInfo()) ;
		// 或者
		Person per = new Person("Dexter",20) ;
		System.out.println(per.getInfo()) ;
		*/
		System.out.println(new Person("Dexter",20).getInfo()) ;

    }
}
  • 只要在类的方法中访问有类的属性,就一定要在属性前追加this关键字。

36、this调用方法

调用本类方法

众所周知,类的方法有:

  • 普通方法:this.方法名称(参数···)
  • 构造方法:this(参数···)

调用本类普通方法

class Person{
	private String name ;
	private int age ;
	
	// this.属性:当前对象(方法)中的属性
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
		this.print() ;  // 本类的普通方法不加也不影响使用,但是好的习惯是加上
	}
	
	public void print(){
		System.out.println("调用本类普通方法") ;
	}
	public String getInfo(){
		return "Name is " + this.name + " Age is " + this.age ;
	}
}

public class ThisDemo {
	public static void main(String args[]) {
		System.out.println(new Person("Dexter",20).getInfo()) ;
    }
}

在这里插入图片描述

调用本类构造方法

  • 回顾:构造方法与普通方法最大区别:
  • 构造方法:使用关键字new实例化新对象的时候使用,且使用一次
  • 普通方法是在对象实例化完成之后(构造方法已经执行过了)可以调用多次。
  • Java里支持类构造方法的互相调用
class Person{
	private String name ;
	private int age ;
	
	// 现在希望不管调用哪个构造方法都要求执行一段信息输出
	public Person(){  // 
		System.out.println("调用本类构造方法") ;
	}
	public Person(String name){
		this.name = name ;
		System.out.println("调用本类构造方法") ;
	}
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
		System.out.println("调用本类构造方法") ;
	}
	
	public String getInfo(){
		return "Name is " + this.name + " Age is " + this.age ;
	}
}

public class ThisDemo {
	public static void main(String args[]) {
		System.out.println(new Person().getInfo()) ;
		System.out.println(new Person("Dexter").getInfo()) ;
		System.out.println(new Person("Dexter",20).getInfo()) ;
    }
}

在这里插入图片描述

  • 上述代码存在的问题:有冗余的重复语句,好的代码应该是没有这么多重复的。
    • 重复的代码:
      在这里插入图片描述
  • 因此我们要消除掉重复数据,使用this解决问题:
    this互调用的操作
class Person{
	private String name ;
	private int age ;
	// 现在希望不管调用哪个构造方法都要求执行一段信息输出
	public Person(){  // 
		System.out.println("调用本类构造方法") ;
	}
	public Person(String name){
		this() ;  // 调用本类的无参构造
		this.name = name ;
	}
	public Person(String name,int age){
		this(name) ;  // 调用本类的一个参数构造
		this.age = age ;
	}
	
	public String getInfo(){
		return "Name is " + this.name + " Age is " + this.age ;
	}
}

public class ThisDemo {
	public static void main(String args[]) {
		System.out.println(new Person().getInfo()) ;
		System.out.println(new Person("Dexter").getInfo()) ;
		System.out.println(new Person("Dexter",20).getInfo()) ;
    }
}

在这里插入图片描述

  • 注意: 两个要求
  • this()的调用必须是构造器中的第一个语句。
  • 使用this()调用构造方法的时候请留有出口。
    • 何谓出口?➡ 某个构造方法里不能使用任何this()调用别的构造方法,否则会产生递归构造器调用

37:表示当前对象

在一个类的使用中肯定会产生若干个对象,程序类不会记住具体有多少个对象产生了,它唯一可能知道的就是当前正在操作本类的对象是哪一个。
范例:观察当前对象

class Person{

}

public class ThisDemo {
	public static void main(String args[]) {
		Person per1 = new Person() ;
		System.out.println("【main方法】" + per1) ;
    }
}
  • 类中没有任何方法,该对象直接输出,输出的是对象的相对地址编码。
    在这里插入图片描述
    范例:观察下列程序
class Person{
	public void method() {
		System.out.println("【方法】" + this) ;
    }
}

public class ThisDemo {
	public static void main(String args[]) {
		Person per1 = new Person() ;
		System.out.println("【main方法】" + per1) ;
		
		per1.method() ;  // per1这个对象调用了method()方法,则this = per1
		System.out.println("***********************") ;
		
		Person per2 = new Person() ;
		System.out.println("【main方法】" + per2) ;
		
		per2.method() ;  // per2这个对象调用了method()方法,则this = per2
		System.out.println("***********************") ;
    }
}

在这里插入图片描述

  • 可以看出,整个过程中this()的定义没有变,只要有某一个对象调用了本类中的方法,this就表示当前执行的对象。
    • 因此,this表示对象并不是一个绝对的概念,而是一个相对的概念。
posted @ 2020-06-09 23:30  溺水的情书  阅读(127)  评论(0编辑  收藏  举报