Java中关键字this的使用
@[toc]
基础理解
this是什么?
- 在Java中,this关键字比较难理解,它的作用和其词义很接近。
- 它在方法内部使用,即这个方法所属对象的引用
- 它在构造器内部使用,表示该构造器正在初始化的对象。
this 可以调用类的属性、方法和构造器
什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如:this.name = name;
遇见问题思考3W(what、why、who):这个代码是什么?为什么有这个东西?如何去使用?
this关键字的具体使用
- this可以用来修饰属性、方法、构造器
this修饰属性和方法:
- this理解为:”当前对象的“或“当前正在创建的对象"(构造器中)
- 很多情况下this都可以不写
总的来说:在类的方法中,可以使用”this.属性“或者”this.方法“的方式,调用当前对象的属性或者方法,但是通常情况下都选择了省略,特殊情况下,如果方法的形参和类的属性同名时,我们必须显示的使用“this.变量”的方式,表示此变量是属性而非形参
举例子如下
第一步:形参为了见名知意,和属性重名了,并不报错,如下代码
package ThisUse;
//this关键字的使用
public class A {
public static void main(String[] args) {
Person p1 = new Person();//默认的空参构造器
p1.setAge(1);
System.out.println(p1.getAge());//运行结果:0
}
}
class Person{
private int age;
private String name;
public void setAge(int age){
age=age;
}
public int getAge(){
return age;
}
public void setName(String name){
name=name;
}
public String getName(){
return name;
}
}
第二步:发现运行结构是错的,相当于就近原则,代码中的name和age都用的是形参,这时候用this.属性来区分(用this来区分属性和局部变量),改进后如下代码
package ThisUse;
//this关键字的使用
public class A {
public static void main(String[] args) {
Person p1 = new Person(4);
p1.setAge(1);
System.out.println(p1.getAge());
}
}
class Person{
private int age;
private String name;
//构造器中用this为"当前正在创建的对象"
public Person(int age){
this.age=age;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
this调用构造器
- 降低代码的冗余
- 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其 他的构造器!
- 明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
- 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了 "this(形参列表)"
- "this(形参列表)"必须声明在类的构造器的首行!
- 在类的一个构造器中,最多只能声明一个"this(形参列表)"
练习题:关于this的使用
附加:快速构造set和get方法
idea快捷键:alt+insert或者直接右键也可以
- 也可以直接建构造器:constructor
答案代码:
Boy
package LXT4;
public class Boy {
private String name;
private int age;
public Boy(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void marry(Girl girl){
System.out.println("我想娶:"+girl.getName());
}
public void shout(){
if (this.age>=22){
System.out.println("可以合法登记结婚了");
}else {
System.out.println("不可以合法登记");
}
}
}
Girl
package LXT4;
public class Girl {
private String name;
private int age;
public Girl(){
}
public Girl(String name, int age) {
this.name = name;
this.age = age;
}
public Girl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void marry(Boy boy){
System.out.println("我想嫁给:"+boy.getName());
boy.marry(this);//this是"当前对象",这里谁调marry谁就是this
}
//比较两个对象的大小,如果返回值是正数,当前对象大,如果返回值是负数,当前对象小,返回0,则当前对象(调用这个方法的对象)与形参对象一样大
public int compare(Girl girl){
if(this.age>girl.age){
return 1;
}else if (this.age<girl.age){
return -1;
}else {
return 0;
}
}
}
BoyGirlTest
package LXT4;
public class BoyGirlTest {
public static void main(String[] args) {
Boy boy = new Boy("罗密欧",21);
boy.shout();
Girl girl = new Girl("朱丽叶",18);
girl.marry(boy);
System.out.println("-------");
//compare比较对象大小(比较两个对象的大小,如果返回值是正数,当前对象大,如果返回值是负数,当前对象小,
// 返回0,则当前对象(调用这个方法的对象)与形参对象一样大)
Girl girl1 = new Girl("祝英台", 19);
int compare=girl.compare(girl1);//用gilr(朱丽叶)去调用,girl1赋值给形参,
if(compare>0){
System.out.println(girl.getName()+"更大");
}else if(compare<0){
System.out.println(girl1.getName()+"更大");
}else {
System.out.println(girl1.getName()+"和"+girl.getName()+"一样大");
}
}
}
System.out.println(girl.getName()+"更大");
}else if(compare<0){
System.out.println(girl1.getName()+"更大");
}else {
System.out.println(girl1.getName()+"和"+girl.getName()+"一样大");
}
}
}