A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐青松 中级黑马   /  2014-2-20 11:14  /  1822 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐青松 于 2014-2-20 13:46 编辑

class A {
    int x = 1;

    class B {
        int x = 2;

        void func() {
            int x = 3;
            
            System.out.println("A的X为:"+A.this.x+"  B的X为:"+B.this.x+"  func的X为:"+this.x);
        }
    }
}
怎么去理解A.this.x/B.this.x/this.x。A和B后面的this怎么理解和解释?this.x这里的this可以去掉吗?

评分

参与人数 1技术分 +2 收起 理由
何伟超 + 2 看这么活跃,多给你一分。

查看全部评分

12 个回复

倒序浏览
这是代码的全部吗,A.this.x/B.this.x/this.x?这么写是错的吧。没有创建对象是不能直接调用类中的方法和属性的。除非这个类的属性和方法是静态的,就可以直接用: 类名.方法(属性)。this代表的是当前对象,你对象都没有,编译都不会通过。
回复 使用道具 举报
好吧,楼主,首先很感谢你发的这个帖子,因为我在补足运行代码时发生了好多低级的细节小错误,让我学到了好多。估计是这几天没怎么学习,长时间没打代码导致的。待会我会重新发个帖子,把错误分享给大家。言归正传,说正事:
这个代码是没错误的,主要是为了学习内部类的访问规则。
首先说下调用内部类B的方法func()的运行结果:A的X为:1  B的X为:2  func的X为:2
为什么会这样呢?道理很简单,帮你解析下,首先this是代表本类对象的引用!这个要明确。能调用类的方法的就两种方式:一种类名调用,即类名.方法,但是这个要求方法必须是静态的。第二种就是常见的,建立类的对象进行调用。本例中,成员变量x不是静态的,内部类B即方法func()也不是静态的(如果func()静态,内部类B也必须用static修饰),所以得用第二种方式调用,即创建本类对象调用,即是this。A.this.x,B.this.x可以理解为A类或B类的对象的x。首先A的X为:1这很好理解,本类对象调用本类成员变量,如果想调用B的x的值,必须创建内部类B的对象进行调用。B的X为:2  func的X为:2,这更好理解,内部类中,本类有的用本类中的,没有用外部类的。
所以this.x这里的this不可以去掉,如果去掉就变成A.x或者B.x,即类名直接调用,只有静态才可以类名直接调用。啰啰嗦嗦打这么多字好累的说~~o(>_<)o ~~

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报 1 0
疲劳的小马 发表于 2014-2-20 12:26
好吧,楼主,首先很感谢你发的这个帖子,因为我在补足运行代码时发生了好多低级的细节小错误,让我学到了好 ...

感谢你的回答,看了你的回答我懂了this的意义,还有个问题想请教,那要是想把内部类中x=3这个x打印出来,要怎么去实现了?嘻嘻~
回复 使用道具 举报
曾经的迷失 发表于 2014-2-20 11:49
这是代码的全部吗,A.this.x/B.this.x/this.x?这么写是错的吧。没有创建对象是不能直接调用类中的方法和属 ...

A.this.x/B.this.x/this.x是提问,"/"是为了把这三个分开区别,就是问A.this.x  、B.this.x还有this.x分别的意思,以及各自this在这里的意义是什么
回复 使用道具 举报
曾经的迷失 发表于 2014-2-20 11:49
这是代码的全部吗,A.this.x/B.this.x/this.x?这么写是错的吧。没有创建对象是不能直接调用类中的方法和属 ...

这不是代码的全部,我只是把关键部分,有些疑问,我就提出来了
回复 使用道具 举报
e.c 中级黑马 2014-2-20 13:41:00
7#
徐青松 发表于 2014-2-20 13:29
感谢你的回答,看了你的回答我懂了this的意义,还有个问题想请教,那要是想把内部类中x=3这个x打印出来, ...

直接打印x就可以了。
System.out.println("A的X为:"+A.this.x+"  B的X为:"+B.this.x+"  func的X为:"+ x);
回复 使用道具 举报
e.c 发表于 2014-2-20 13:41
直接打印x就可以了。
System.out.println("A的X为:"+A.this.x+"  B的X为:"+B.this.x+"  func的X为:"+ x ...

谢啦~终于懂了。哈哈
回复 使用道具 举报
这个很好理解啊!A.this就是指A内中的this的变量~同理!B的也是~如果你去掉this的话!那么就只会调用本类的this
回复 使用道具 举报
徐青松 发表于 2014-2-20 13:29
感谢你的回答,看了你的回答我懂了this的意义,还有个问题想请教,那要是想把内部类中x=3这个x打印出来, ...

这个更简单啊,把this去掉就好了, 就是把这句System.out.println("A的X为:"+A.this.x+"  B的X为:"+B.this.x+"  func的X为:"+this.x);改成 System.out.println("A的X为:"+A.this.x+"  B的X为:"+B.this.x+"  func的X为:"+x);其实你的输出语句中B.this.x和this.x是一样的,调用方法func()中的x什么都不用写。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
呵呵,感谢版主爱戴,多给1分技术分。thanks
回复 使用道具 举报
徐青松 发表于 2014-2-20 22:42
呵呵,感谢版主爱戴,多给1分技术分。thanks

我也感谢版主,真是太好啦O(∩_∩)O
回复 使用道具 举报
结果肯定是1,2,2。this表示的是对本类的调用,如果你的类中x是静态的,可以去掉this即为类名.方法,如果不是静态的,就必须创建本类对象,就是说必须加上this,后两个结果属于同一个类,所以调用的是x=2同一个属性
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马