阿里云【名师课堂】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()) ;
}
}
分析:当前类中的构造方法的核心目的在于:为类中的name
和age
两个属性进行初始化。
- 但是现在构造方法的参数声明不准确:
public Person(String n,int a)
中的n
和a
究竟是什么? - 一个比较好的做法是将参数的名称和属性名称统一起来,如下:
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 ; // 调用方法时传进来的name赋值给this.name(this表示的当前对象),于是当前对象创建成功
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 this.name ;
}
public int getAge(){
return this.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表示对象并不是一个绝对的概念,而是一个相对的概念。