java中this调用属性和方法


文章内容选自尚硅谷

this调用属性和方法

  • this可以理解为当前对象的意思
  • this可以用来调用属性,意思为当前对象的属性

java的命名原则有一条为见名知意,在方法中,如果出现了类的属性变量和类内方法形参同名的情况,一般遵循的是就近原则

package com.atguigu.java2;

public class PersonTest {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setAge(1);
		System.out.println(p1.getAge());
	}
}

class Person{
	private String name;
	private int age;
	
	public void setName(String n){
		name = name;
	}
	
	public String getName(){
		return name;
	}
	public void setAge(int age){
		age = age;
	}
	public int getAge(){
		return age;
	}
}

运行结果为

0

	public void setName(String n){
		name = name;
	}

setName方法中的name两个都为形参的name,属性的name的使用范围为类的整个大括号内,方法的name使用范围为方法内部,遇到这种情况一般都是就近原则,即两个name都被视为形参(局部变量),当调用完方法后局部变量就被出栈了,没有给类的属性赋值。

因此,要想声明前一个name为属性变量,加上关键字this即可。

class Person{
	private String name;
	private int age;
	
	public void setName(String n){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
}

运行结果为

1

这儿this理解为当前对象。this一般都是被省略掉的,比如

	public String getName(){
		return this.name;
	}

也是正确的,只不过通常情况下不用this关键字,只是发生以上的重名情况要用this来进行区分。

this.方法

this.方法一般都省略掉
比如在

	public void eat(){
		System.out.println("人吃饭");
		this.study();
	}
	public void study(){
		System.out.println("人学习");
	}

Person类中加入了以下两个方法,this.study()有没有这个this都无所谓。

this调用构造器

  • 构造器有时也称构造方法,在构造器内部给属性赋值的时候,也可以使用this.属性,来区别于形参。
  • this调用构造器的用法为this(形参列表),形参列表必须是另一个构造器的形参列表,这样就可以在本构造器内调用另一个构造器的全部方法。
	public Person(){
		eat();
		//person初始化时,假设以下还需40行代码
	}
	
	public Person(String name){
		this.name = name;
		//person初始化时,假设以下还需40行代码
	}
	
	public Person(int age){
		this.age = age;
		//person初始化时,假设以下还需40行代码
	}
	
	public Person(String name,int age){
		this.name = name;
		this.age = age;
		//person初始化时,假设以下还需40行代码
	}

在原来的类中加入构造器,以上的4个构造器构成了构造器的重载,假如每个构造器的初始化都要有40多行重复的代码,就会造成代码的冗余。因此采用this的构造器调用。

package com.atguigu.java2;

public class PersonTest {
	public static void main(String[] args) {
//		Person p1 = new Person();
//		p1.setAge(1);
//		System.out.println(p1.getAge());
		Person p2 = new Person("xiaoihuang",18);
		System.out.println("name="+p2.getName()+",age="+p2.getAge());
	}
}

class Person{
	private String name;
	private int age;
	
	public Person(){
		eat();
		String info = "person初始化时,假设以下还需40行代码";
		System.out.println(info);
	}
	
	public Person(String name){
		this();
		this.name = name;
		
	}
	
	public Person(int age){
		this();
		this.age = age;
	}
	
	public Person(String name,int age){
		this(age);
		this.name = name;
//		this.age = age;
		setName(name);
	}
	
	public void setName(String n){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
	
	public void eat(){
		System.out.println("人吃饭");
		this.study();
	}
	public void study(){
		System.out.println("人学习");
	}
}

运行结果为

人吃饭
人学习
person初始化时,假设以下还需40行代码
name=xiaoihuang,age=18

代码分析

分析代码,在main方法中调用的构造器是

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

这个构造器,该构造器调用了前一个构造器

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

这一步已经给age的属性赋值了,但是在这个构造器中还调用了前一个构造器

	public Person(){
		eat();
		String info = "person初始化时,假设以下还需40行代码";
		System.out.println(info);
	}

因此输出了

人吃饭
人学习
person初始化时,假设以下还需40行代码

此时还没有给name赋值,采用setName(name);方法在public Person(String name,int age)构造器内赋值,这就是全部的执行过程。

采用调用构造器的方法,可以不断利用上一个构造器的内容,因此避免了代码的冗余,增强了可读性。在this调用构造器的时候,有几点注意事项

  • this(形参列表);语句只能够至于方法体的首行。
  • 一个构造器只能使用一次this(形参列表);不能调用多个构造器,调用多个构造器,总有this语句不在首行的情况。
  • this调用构造器时不能自己调用自己,也不能相互调用
  • this调用构造器时不能形成闭环,比如说有A,B,C,D四个构造器形成构造器的重载,A调用B,B不能调用A,B只能调用C或者D,假如B调用C,则C不能调用B,也不能调用A,因为一旦调用了A或者B,就构成了闭环,C只能调用D,D谁也不能调用。因此,假如说有n个构造器重载,最多调用n-1次。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值