JavaSE之面向对象编程—类与对象(上)—— 4

一、首先介绍一下this关键字的用法:
总的来说this共有三类用法:
1.this调用本类属性
2.this调用本类方法
3.this表示当前对象
下面通过栗子来具体的解释每种用法:
1.this调用本类属性
注意:一个文件只能有一个公有的类,并且文件名应该和公有的类名一致;如果定义一个类没有用public修饰那么它就是私有类。

class KeyWord{//私有类
	private String name;
	private int age;
	
	public Person(String name,int age){
		name=name;
		age=age;
	}
	public String getPersonInfo(){
		return "姓名"+name+",年龄"+age;
	}
}
	public class Test{//公有类
	public static void main(String[] args){
		Person per = new Person("张三",20);
		System.out.println(per.getPersonInfo());
	}
}

在这里插入图片描述
通过上面代码的运行结果我们可以看到,当参数和属性名相同的时候,类中的属赋值性无法被正确的赋值。因为它不知道这个属性到底是谁的属性,所以我们需要加上this关键字,当创建对象的时候就会表示当前给当前对象属性赋值。

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

赋值以后的结果:
在这里插入图片描述
注意:只要在访问类中的属性就一定要加上this关键字。
2.this调用本类方法
(1)调用普通方法:this.方法名称(参数)
(2)调用构造方法:this(参数)
(1)this调用普通方法
栗子:

class Person{
	private String name;
	private int age;
	
	public Person(String name,int age){
		this.name=name;
		this.age=age;
		this.print();//调用本类普通方法(原则上这可以不用加this)
	}
	public String getpersonInfo(){
		return "姓名"+name+",年龄"+age;
	}
	public void print(){
		System.out.println("****************");
	} 
}
public class Test1{
	public static void main(String[] args){
		Person per=new Person("张三",20);
		System.out.println(per.getpersonInfo());
	}
}

在这里插入图片描述
注意:虽然在调用本类普通方法时可以不用加this,但是建议还是加上免得混淆。
(2)this调用构造方法
观察构造方法存在的问题:

class Person{
	private String name;
	private int age;
	public Person(){
		System.out.println("****产生一个新对象*****");
	}
	public Person(String name){
		System.out.println("****产生一个新对象*****");
		this.name=name;
	}
	public Person(String name,int age){
		System.out.println("*****产生一个新对象*****");
		this.name=name;
		this.age=age;
	}
	public String getPersonInfo(){
		return "姓名"+name+",年龄"+age;
	}
}
public class Test1{
	public static void main(String[] args){
		Person per1=new Person();
		Person per2=new Person("张三");
		Person per3=new Person("张三",20);
		System.out.println(per1.getPersonInfo());
		System.out.println(per2.getPersonInfo());
		System.out.println(per3.getPersonInfo());
	}
}

在这里插入图片描述
对于以上的代码中构造方法的问题出现在,构造方法重载的时候我们写了大量重复的代码;那么为了减少这样的操作,我们必须可以通过调用this方法。在java中,支持this方法的相互调用。
将上面的程序段通过 相互调用this修改为:

class Person{
	private String name;
	private int age;
	public Person(){
		System.out.println("****产生一个新对象*****");
	}
	public Person(String name){
		System.out.println("****产生一个新对象*****");
		this();//调用本类无参构造函数
		this.name=name;
	}
	public Person(String name,int age){
		System.out.println("*****产生一个新对象*****");
		this(name);//调用本类中有一个参数的构造函数
		this.age=age;
	}
	public String getPersonInfo(){
		return "姓名"+name+",年龄"+age;
	}
}
public class Test1{
	public static void main(String[] args){
		Person per1=new Person();
		Person per2=new Person("张三");
		Person per3=new Person("张三",20);
		System.out.println(per1.getPersonInfo());
		System.out.println(per2.getPersonInfo());
		System.out.println(per3.getPersonInfo());
	}
}

运行的结果和上面是一样的。但是需要注意的是:我们在构造方法中使用this调用的时候,this语句一定是放在第一句的,否则就不能起作用。
3.使用this表示当前对象

class Person{
	public void print(){
		System.out.println("[print]方法:"+this);//这个this表示谁待用它,就是哪个对象
	}
}
public class Test1{
	public static void main(String[] args){
		Person p1= new Person();
		System.out.println("[main]方法"+p1);//后面连接的是对象p1
		p1.print();//p1调用print()方法
		System.out.println("=========");
		Person p2 = new Person();
		System.out.println("[main]方法"+p2);
		p2.print();
	}
}

运行结果:
在这里插入图片描述
通过这段代码以及它的运行结果我们可以看到,只要对象调用了本类中的方法,那么这个this就表示当前执行的对象。上面的p1、p2分别调用,这个this分别表示p1、p2两个对象,所以输出的main和print方法后面的都是用一个编码,表示同一个对象。

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/83858915