Java面向对象程序设计:this的用法

this可以算是Java里面比较复杂的关键字,this的使用形式决定了它的灵活性,在程序里面,使用this可以实现以下三类作用的描述:

  • 当前类中的属性:this.属性
  • 当前类中的方法(普通方法、构造方法):this()、this.方法名称();
  • this描述当前对象

this调用本类属性

现在的分析可以发现,利用构造方法或者是setter方法都可以进行类中的属性赋值,但是在赋值的时候,采用的是如下的定义形式:

class Person{
	private String name ;
	private int age;
	public Person (String n ,int a)
	{
		name=n;
		age=a;
	}
	public void tell()
	{
		System.out.println("姓名:"+name+"  年龄:"+age);
	}
//省略setter和getter
}
public class JavaDemo{
	public static void main(String [] args)
	{
		Person per =new Person("张三",18);
		per.tell();
	}
}

这是一个简单的Java程序,但是有一些有问题的地方。

	public Person (String n ,int a)
	{
		name=n;
		age=a;
	}

这个问题出现在参数名称上,可以发现,这个时候构造方法中两个参数的目的是为了类中的name或age属性初始化,但是现在却发现,此时现在的代码n和a的参数名称不行,如下改动:

	public Person (String name ,int age)
	{
		name=name;
		age=age;
	}

此时的结果为空

此时的结果为空。无法进行属性的正确设置。

在Java中“{}”是作为一个结构体的边界符号,那么在程序里面当进行变量(参数、属性都成为变量)使用的时候,以“{}”作为一个查找边界,所以按照就近取用的原则,所以此时的构造方法并没有能够访问类中的属性,但是为了明确类中的属性与参数的区别,往往会在属性前追加一个“this”,表示本类属性

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

在这里插入图片描述
在以后程序开发过程中,只要是访问本类中属性的时候,一定要加上“this”直接访问。

使用this调用方法

this也可以实现方法的调用,考虑构造方法与普通方法

  • 构造方法调用(this()):使用关键字new实例化对象的时候才会调用构造方法。
  • 普通方法调用(this.方法名称()):实例化对象产生之后就可以调用普通方法。

范例:调用类中的普通方法

class Person{
	private String name ;
	private int age;
	public Person (String name ,int age)
	{
		//this.name=name;
		//this.age=age;
		this.setName(name);
		this.setAge(age);//加与不加this都表示本类方法。
	}
	public void tell()
	{
		System.out.println("姓名:"+name+"  年龄:"+age);
	}
    public void setName(String name)
    {
    	this.name=name;
    }
    public void setAge(int age)
    {
    	this.age=age;
    }
    public String getName(String name)
    {
    	return this.name;
    }
    public  int getAge(int age)
    {
    	return this.age;
    }
}
public class JavaDemo{
	public static void main(String [] args)
	{
		Person per =new Person("张三",18);
		per.tell();
	}
}

	public Person (String name ,int age)
	{
		//this.name=name;
		//this.age=age;
		this.setName(name);
		setAge(age);//加与不加this都表示本类方法。
	}

除了普通方法的调用之外,还需要进行构造方法的调用,对于构造方法的调用,肯定是要放在构造方法中执行。现在假设说类中一共定义有三个构造方法,但是不管调用哪个构造方法,都执行一行输出语句:“一个新的Person类的对象实例化”

传统做法实现:

class Person{
	private String name ;
	private int age;
	public Person()
	{
		System.out.println("*** 一个新的Person类的对象实例化 ***");
	}
	public Person (String name)
	{
		System.out.println("*** 一个新的Person类的对象实例化 ***");
		this.name=name;
	}
	public Person (String name ,int age)
	{
		this.name=name;
		this.age=age;
		System.out.println("*** 一个新的Person类的对象实例化 ***");
	}
	public void tell()
	{
		System.out.println("姓名:"+name+"  年龄:"+age);
	}
    //setter、getter略
}
public class JavaDemo{
	public static void main(String [] args)
	{
		Person per =new Person("张三",18);
		per.tell();
	}
}

但是如果

System.out.println("*** 一个新的Person类的对象实例化 ***");

是一个十行的代码,就会造成程序里面代码重复。
如果想要评价一个代码的好坏:

  • 代码结构可以复用,提供的是一 个中间独立的支持
  • 我们的目标是:没有重复代码;

利用this构造调用优化:

class Person{
	private String name ;
	private int age;
	public Person()
	{
		System.out.println("*** 一个新的Person类的对象实例化 ***");
	}
	public Person (String name)
	{
		this();//调用本类无参构造方法;
		this.name=name;
	}
	public Person (String name ,int age)
	{
		this(name);//调用本类单个参数构造方法
		this.age=age;
	}
	public void tell()
	{
		System.out.println("姓名:"+name+"  年龄:"+age);
	}
    //setter、getter略
}
public class JavaDemo{
	public static void main(String [] args)
	{
		Person per =new Person("张三");
		per.tell();
	}
}

在这里插入图片描述

对于本类构造方法的互相调用需要注意以下几个问题:

  • 构造方法必须在实例化新对象的时候调用,所以“this”只能放在构造方法的首行。普通方法里面不能用this调用构造方法。
  • 构造方法互相调用的时候保留程序的出口,别形成死循环。
posted @ 2020-11-01 15:28  Zeker62  阅读(56)  评论(0编辑  收藏  举报