java中this关键字的疑惑

this关键字表示当前的对象,按这种理解,下面的代码中就有点问题了,代码如下:

public class Person implements Comparable {
    private String name;
    private int age;

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

    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(Object o) {
        if (o instanceof Person) {
            Person p = (Person) o;
            int temp = this.age - p.age;//这里的this.age和p.age难道不是始终相等?
            return temp == 0 ? this.name.compareTo(p.name) : temp;
        }

        return 0;
    }

}


上述代码是给Person类加一个比较功能(先比较age,如果age相同则再比较name),通过实现Coparatable接口并重写compraTo()方法来实现,但是this.age和p.age不是应该始终相等吗?因为this表示当前Person的一个对象,而p也是当前Person类的一个对象,p和this的hash值应该是相同的,怎么这里表示的意思是不同,忘大神解释下?

7个回答

   public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // type (and possibly null) check

            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
                Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                                //在这里做了显示的调用
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }

这是我在TreeSet源码中找到的一段,,看到我注释的哪一行,,就是对你那个接口的显示调用,

     do {
                parent = t;
                                //在这里做了显示的调用
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);

就是这一段,,,意思是对集合进行排序。。。

有问题还可以追问。

兄弟,不一样的,如a. compareTo(b):this指的是a,你那个p相当于指的是b。

在楼主写的理解中“this表示当前Person的一个对象,而p也是当前Person类的一个对象”这句是错的。
重写的 compareTo(Object o)方法,在方法中this指的是compareTo这个方法的调用者,而代码中的p是你的参数对象。
也就是说this指向的是当前调用者(因为方法是这个对象调出来的,自然方法里面的this就应该指向它)这个对象而不是方法参数里的对象。
所以楼主对'this关键字表示当前的对象'中的‘当前’这俩字理解有偏差!!!

首先你要清楚,类和对象的区别

类:是对客观事物的一种抽象表述,包含对其进行的属性和方法
对象:是类的对应的一个客体,是类实例化的一个表示,也就是说一个类可以有创造多个对象,每个对象拥有自己的属性字段信息,
对象与对象之间信息是不同的(对象属性值引用同一对象,可能相同,目前若不理解,先忽略这句),而对象之间的方法是共享的。

举个例子,比如人(Person)是一个类,可以有叫“张三”人,可以叫“李四”的人,他们都有自己的年龄(age)

一天,张三知道了李四的年龄,张三拿自己年龄(this.age)和李四去比( obj.age obj为参数 ),由于方法的是对象公用的,
也就得有方法如何表示自己,那么this就应运而生了。

以上解释可根据java的内存模型得到验证,深入理解请查阅相关资料。

加入调用的时候用的是:

     Persion pesion1 = new Persion("xiaowang",10); //pesion1  指的是小王,,它10岁
     Persion pesion2 = new Persion("xiaoli",12); //pesion2  指的是小李,,它12岁
        persion1.compareTo( pesion2)//此时   你所说的this指的是,,persion1,,,p指的是persion2

            persion2.compareTo( pesion1)//此时   你所说的this指的是,,persion2,,,p指的是persion1

(1)this 是当前对象,,也就是调用这个方法的对象
(2)p 是传入的对象,

我感觉已经很详细了,,有疑问还可以追问,,给个采纳,谢谢

Small_Mouse0
小鼠标丶 我把TreeSet中调用那个接口的源码,,贴在下面了。
大约 2 年之前 回复
tianbiandetianbian
SeuAlanJiang 回复小鼠标丶: 哈哈,哥们,回复不好贴代码啊,我重新自己自问自答了一个,贴了完整代码,帮忙看下呗,万分感谢!
大约 2 年之前 回复
Small_Mouse0
小鼠标丶 私信发给我吧,,,你的代码我看不到,,
大约 2 年之前 回复
Small_Mouse0
小鼠标丶 不好意思,你的完整代码我看不到,,
大约 2 年之前 回复
Small_Mouse0
小鼠标丶 哈哈,嗯,我知道,,这个接口是用来排序的,,道理是一样的,,你可以去看他的排序代码(也是用这个方法来对比两个对象谁大谁小的),,,,你的集合在排序的时候会显示的调用(排序肯定得比大小对吧)
大约 2 年之前 回复
tianbiandetianbian
SeuAlanJiang 这个是主函数类:
大约 2 年之前 回复
tianbiandetianbian
SeuAlanJiang 这种很显式地调用,我知道this和p所引用的对象具体是哪个,但是我的场景不是这种明显的调用,而是用TreeSet集合存储Person对象,按照age的大小来存,如果age大小相等,就按照name的字符串大小存,完整代码如下:
大约 2 年之前 回复

这种很显式地调用,我知道this和p所引用的对象具体是哪个,但是我的场景不是这种明显的调用,而是用TreeSet集合存储Person对象,按照age的大小来存,如果age大小相等,就按照name的字符串大小存,完整代码如下:
主函数类

import java.util.Iterator;
import java.util.TreeSet;

import com.sun.org.apache.bcel.internal.generic.NEW;

import bean.Person;

public class TreeSetTest {

public static void main(String[] args) {
    TreeSet ts = new TreeSet();
    ts.add(new Person("jy", 22));
    ts.add(new Person("ab", 23));
    ts.add(new Person("ji", 11));
    ts.add(new Person("cc", 18));
    for (Iterator it = ts.iterator(); it.hasNext();) {
        System.out.println(it.next());
    }

}

}

Person类:

public class Person implements Comparable {
private String name;
private int age;

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

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(Object o) {
    if (o instanceof Person) {
        Person p = (Person) o;
        int temp = this.age - p.age;//这里的this.age和p.age难道不是始终相等?
        return temp == 0 ? this.name.compareTo(p.name) : temp;
    }

    return 0;
}

@Override
public String toString() {
    return this.name+","+this.age;
}

}

结果:
ji,11
cc,18
jy,22
ab,23

结果是按照定义的排序进行存储的,但是没有那种很明显的调用comparaTo()方法,能否解释下.(可能我需要去看底层的add()源码)

tianbiandetianbian
SeuAlanJiang 回复fsy351: 感谢,很有帮助,膜拜大神!
大约 2 年之前 回复
fsy351
fsy351 给你个blog看吧,之前我看过的 http://www.cnblogs.com/lixiaolun/archive/2012/12/25/2832775.html
大约 2 年之前 回复

this就是指向你当前实例化的对象。你实例化一个对象,调用一个该对象的非静态方法的时候,在帧栈中的局部变量表的第一个下标的槽就是this,它指向你当前调用方法的对象。就可以通过this来操作该对象啦!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
this关键字疑惑
rn这里的this关键字是起到什么用处? 有没有相关的解释资料
【Java】this关键字的使用
this的常用用法: &nbsp;&nbsp;&nbsp;&nbsp;1、在程序产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指代调用该方法的对象,构造方法中,this总是指向正要初始化的对象; &nbsp;&nbsp;&nbsp;&nbsp;2、使用this关键字调用重载的构造方法,避免相同的初始化代码,但只能在构造方法中用,并且必须位于构造方法第一句; &nbsp;&n...
java中的this关键字
java中的this关键字用法总结。
Java中的this关键字
this关键字在程序中的常用用法 通过this关键字访问一个类的成员变量,解决与局部变量名称冲突问题。 class Person{ String name; int age; // 定义两个参数的构造方法 private Person(String name,int age) { this.name = name; this.age = age; } 通过this关...
浅谈Java中的This关键字
在Java中提供一个this关键字,其实这个关键字很简单,花点时间去看看相关的资料就会很容易明白怎么去使用这个关键字,下面开始讲解this这个关键字。 首先我们应该知道this代表的什么,它代表的是一个对象的引用,下面在代码里面解释: this是什么? 代码1:解释this是对象的引用 package com.hua.www.override; public class TestTh
java中this关键字的用法
java中this关键字的用法一览
JAVA中this关键字
this 引用的就是本类的对象,比如在局部变量或方法参数覆盖了成员变量时。 public void setName(String name){ this.name = name; //第二个name指的是形参name } 2.this作为方法的返回值 public Book getBook(){ return this; //返回Book类引用 } 3.t...
java中this关键字的作用
this关键字 this当前对象引用(调用当前方法的对象的引用/) 1)使用this调用成员变量,解决成员变量与局部变量的同名冲突 public void setName(String name){ this.name=name; } 2)使作this调用成员方法 pubilc void play(){ this.print();//this可以省略,直接调用print(),也不建议加this }...
Java中this关键字的学习
       利用this关键字来调用构造方法,只有在无参数构造方法中第一句使用this调用有参数的构造方法。        this关键字的三个作用,一个是调用本类里的属性,一般就如this.name=name;第二个就是调用本类中的方法,包括普通方法和构造方法,调用普通方法时在this后添加方法名,调用构造方法时,只需要在this中放入对应的参数就行;第三个就是调用当前对象,也就是调用当前类...
java中this关键字
今天有个逗比要我说我name=name到底是什么鬼,我是!!!∑(゚Д゚ノ)ノ.然后………..(当我是煞笔吗????)第一种this引用成员变量public class Demo7 { String name="成员变量"; public void print(String name){ System.out.println("类中的属性 na
java中this关键字的使用
1.this调用本类属性 运行结果: 2.this调用本类方法 this可以调用本类中的普通方法和构造方法: 调用普通方法:this.方法名称(); 调用构造方法:this( );–表示调用本类无参构造 this(参数);–表示调用本类有参构造 输出结果: 注: ① this调用构造方法的语句必须在构造方法首行 ② 使用this调用构造方法时,请留有出口 3.this表示当前对象 只要对...
在java中的this关键字问题?
在java中我们经常用的this.***来看当前类的属性和方法之类的东西。rn但当用到如:this == orn这样写,是不是也是指当前类呢?还是其它的东西呢?rn那位大哥能给我详细的解释一下this 这个关键字的用法吗?rn
详解Java中的this关键字
[code=&quot;java&quot;]使用this调用本类中的属性 现在观察以下代码,看会有那些问题: public void setName(String name){ name = name ; } 这里面的两个name都是setName方法中的name参数。 此时,特别希望可以通过一个指定的标识明确的表示要把传入的name参数的值给类中的属性,所以此时就需要使用th...
Java中this关键字
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。(在方法内部调用同一个类的另一个方法,不必使用this,可以直接调用,当前方法中的this引用会自动应用于同一类中的其他方法。)this三种主要用法1、返回对当前对象的引用(也可以将当前对象传递给其他方法)例:public class Leaf{ int i = 0; Leaf increment() { ...
java中的super关键字和this关键字
super关键字: 1.super.方法名();用于调用父类中被重写的方法。 2.super(实参);用于在子类构造器中调用父类中的某构造器。 this关键字: 1.用于代替某个对象本身。 2.this(实参);用于在本类构造器中调用本类中的其他构造器。
JAVA中的this关键字
this在java中表示出以下三个概念: 1、调用类中的属性或方法 类中各个方法的参数列表中常见和属性同名的参数,如用于封装的方法setName(String name),这时用this.name表示类的属性,以区分形参和属性。 比较Person1和Person2,同样的类,区别只在构造方法的参数,Person1传递的参数是n和a,不够直观,Person2直接用name和age作为形参,和类
JAVA中this关键字的使用
1.为了解决可读性的问题,通过this关键字可以明确的访问一个类的成员变量,解决与局部变量命名的问题,写一个小的例子。 eg:class Person { int age; public Person(int age) { this.age=age; } public getAge() { return this.ag
java中this关键字作用
在Thingking In Java 一书中,指出this关键字有两个作用 一、对当前对象的引用  比如,有这一段代码: public class L1 { private int i=0; public L1 increment(){ i++; return this;//通过return返回对当前对象的引用。 } public L1 (int i){ th
Java中this关键字 & static关键字
文章目录1. this关键字1.1 this调用本类属性1.2 this调用本类方法1.2.1 this调用普通方法1.2.2 this调用构造方法 1. this关键字 this关键字主要有以下三个方面的用途: this调用本类属性 this调用本类方法 this表示当前对象 1.1 this调用本类属性 先看一段代码: class Person{ private String na...
java中this关键字的理解
this关键字: 1、调用本类中的属性(成员变量); 2、调用本类中的方法; 3、调用本类中的其他构造方法,调用时要放在构造方法的首行。 例: public class Person(){   private  String name;   private String phone; public void SetName(String name){     this.name ...
Java中this关键字的详解
在java的学习中,当接触到类这一章的时候,就会避免不了的接触到this关键字。 首先,this关键字指向的是当前对象的引用 作用:              this.属性名称                                    指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)                class Test_08{ publ...
java中This关键字
要解释什么叫this 首先要知道在JAVA中什么叫引用。 引用: 首相要明白什么是变量。变量的实质就是一小块存储单元,而这小块存储单元里存储着变量的值,并且这小块存储单元拥有地址。 列1: int a = 1; a就是变量名,而1就是值。 这时a 引用了 存储单元里的值 1. 而当a成为一个对象的时候,这个变量就成了引用变量
Java中this关键字使用
this关键字用来表示当前对象本,或当前类的一个实例,通过this可以调用本对象的所有属性和方法。例如:public class Demo{ public int x = 10; public int y = 15; public void sum(){ // 通过 this 点取成员变量 int z = this.x + this.y; ...
Java中this关键字的用法
this关键字必须放在非静态方法里面。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。this的主要用途包含以下几个方面:1.使用this关键字引用成员变量2.使用this关键字引用成员方法3.使用this关键字代表自身类的对象4.使用this关键字在自身构造...
JAVA 中this关键字用法
this表示当前对象,谁调用这个属性或者方法谁就是这个当前对象,this一共有两种用法 第一种:访问属性或者方法  this一般出现在构造方法中,表示当前对象的属性,因为在构造方法中形参和字段名是相同的,为了区分两个不同,可以在字段名前面加个this关键字表示当前对象的属性,将形参的值赋给当前对象的属性。this也可以调用方法,但是一般很少用。 第二种:调用构造方法 一般在一个类中,构造方...
关于Jquery中的this关键字的用法的疑惑
我看网上都是说this都是指向当前的DOM对象,但是在Jquery中也能用this,我有些不理解。例如:rn[code=html]rnrn rn rn rn rn rn rn rn rn rn --请选择城市--rn 济南rn 郑州rn 太原rn 长春rn rn rn rnrn[/code]rnrn这里面只有JQuery对象,this去哪里指向一个DOM对象呢?请各位帮忙释疑一下
java 中this关键字???
![图片说明](https://img-ask.csdn.net/upload/201904/03/1554306488_351945.png)rnrnrnrn不是很懂 this和1,2 之间的关系,为什么在我所只是的第一步中要调用this 这个无参的方法呢?
Java中this关键字概述
this关键字 在类的方法定义中使用的this关键字代表使用该方法对象的引用。 当必须指出当前使用方法的对象是谁时要使用this 有时使用this可以处理方法中成员变量和参数重名的情况 this可以看作是一个变量,它的值是当前对象的引用 public class Leaf{ int i=0; Leaf(int i) {this.i=i;} //this.i指Leaf类中的成员变量i,...
对于Java中this关键字的
java中this关键字 今天看到面向对象中 this 关键字的地方 在面向对象中,定义一个类,访问他的私有成员时,可以使用getter和setter这两个成员方法,而使用setter时输入变量时,为防止变量重名,需要通过重新定义变量名或者利用this关键字,防止变量重名。 this可以指向当前存在的变量名,直接指向私有成员,方便使用,在setter成员方法中,尽量多使用this关键字,是代码变得...
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件