哈KK成长之路–this关键字

Java this关键字详解

一.this关键字的意义

this 关键字通常用来表示当前对象本身,或当前类的一个实例,通过this可以调用本对象的所有方法和属性。其实简单来说,this就是所在函数所属类的所属对象的引用,哪个对象调用了this所在的函数,this就代表哪个对象。

其实学到面向对象的this关键字的时候,很多人多少在概念上会被绕进去,博主就是其中之一。所以在此我想通过list集合,Comparable内部比较器来详细解释this关键字,希望能够帮助大家从源头理解this关键字的作用。以下是案例。

有一个Monkey类:

public class Monkey implements Comparable<Monkey>{
    private String name;
    private int age;

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

    @Override
    public String toString() {
        return "Monkey{" +
                "name='" + name + ''' +
                ", 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;
    }

    @Override
    public int compareTo(Monkey o) {
        return this.getAge()-o.getAge();
    }

}

这是Monkey类的测试类:

public class TestM {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System .in);
        ArrayList<Monkey> monkeys = new ArrayList<>();
        Monkey monkey1=new Monkey("飞飞1",1);
        Monkey monkey2=new Monkey("飞飞2",2);
        Monkey monkey3=new Monkey("飞飞3",3);
        Monkey monkey4=new Monkey("飞飞4",4);
        Monkey monkey5=new Monkey("飞飞5",5);
      
        monkeys.add(monkey1);
        monkeys.add(monkey2);
        monkeys.add(monkey3);
        monkeys.add(monkey4);
        monkeys.add(monkey5);
        //打乱
        Collections.shuffle(monkeys);
        System.out.println(monkeys);
        //排序
        Collections.sort(monkeys);
        System.out.println(monkeys);
        //交换
        Collections.swap(monkeys,0,2);
        System.out.println(monkeys);
        //查找--前提是集合先升序排序
        Collections.sort(monkeys);
        System.out.println(Collections.binarySearch(monkeys,new Monkey("肉肉",5)));
    }
}
在这我们通过list集合创建了五只monkey对象并存入list集合中去,实际上我们创建了五只猴子,也就是五个对象。然后比较器写的方法是用来实现将五只猴子通过年龄大小来进行从小到大的排序的。


然后利用五只猴子分别调用有参构造方法将信息分别传递给Monkey类中有参构造里的形参name和形参age,我们可以直接将这个过程理解为一个将实际参数传递给形式参数的过程。然后再将形参name和age的值赋给this.name和this.age。到这,就可以理解为monkey1.name=monkey1通过有参构造传过去的实际姓名 monkey1.age=monkey1通过有参构造传过去的实际年龄,以此类推monkey2,3,4,5。所以就能理解为什么说this是用来代表当前对象。


然后是**比较器**里的this.getAge() 和o.getAge()。其实是可以简单理解为其中一只猴子用了这种办法来和其它四只猴子包括它自己进行年龄上的比较,后面定义的o是用来表示属于Monkey大类的五只猴子的。而this只能用来代表五只猴子中的一只,五只猴子中的哪一只猴子用了这个办法那么哪只猴子就是this。所以this.getAge()就可以和o.getAge()区分开来。因为五只猴子都用了这个办法来比较年龄,所以就实现了通过年龄进行排序。

this关键字的应用

1.使用this来区分同名变量

成员变量与方法内部的变量重名时,要在方法内部调用成员变量,就需要用到this关键字。

public class Monkey{
    private String name;
    private int age;

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

上面有参构造里的用法就是非常典型的使用this来区分同名变量。

2.作为方法名来初始化对象

也就是相当于调用本类的其它构造方法,他必须作为构造方法的第一句。如下:

public class Monkey{
    private String name;
    private int age;
    //无参构造
    public Monkey(){
		this("哈KK",21);
	}
    //有参构造
    public Monkey(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

值得注意的是:
1.在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
2.不能在构造方法以外的任何方法内调用构造方法。
3.在一个构造方法内只能调用一个构造方法

3.作为参数来传递

需要在某些完全分离的类中调用一个方法,并将当前对象的一个引用作为参数传递时。

public class Demo{
	public static void main(String[] args){
	B b=new B(new A);
	}
}

class A{
	public A(){
		new B(this).print(); //匿名对象
		}
	public void print(){
		System.out.println("hello from A!");
		}
}

class B{
	A a;
	public B(A a){
		this.a=a; 
		}
	public void print(){
		a.print();
		System.out.println("hello from B!");	
		}
}	

运行结果:
Hello from A!
Hello from B!

如果对象只使用一次,就可以作为匿名对象,代码中new B(this).print();等价于(new B(this)).print(),先通过new B(this)创建一个没有名字的对象,再调用它的方法。

以上就是我对this关键字的理解
最后祝大家“键盘敲烂,年薪百万”!!

匿名

发表评论

匿名网友