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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴俊灿 中级黑马   /  2016-3-10 23:53  /  1505 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

老师说this指当前对象,谁调用它,它就指向谁

有这样两类,B继承A。
class A{ int i=0; void abc(){
return this.i ; }
}
class B extends A{ int i=1; }
然后z在main()中new一个B的对象
B b=new B();调用b.abc()这时返回的是0.

我理解这时候是调用的A.class中的函数,但是不管调用哪个类中的函数此时this都应该指向调用它的人啊。既然是b调用的,b.i为1,为啥this还是指向了A中的i呢

13 个回复

倒序浏览
应该输出b的i。你写的A类的方法是不能有返回值的,你确定通过编译了?
回复 使用道具 举报
能不能把代码写的再详细点...
回复 使用道具 举报
debuggerx01 来自手机 中级黑马 2016-3-11 10:09:21
板凳
你看下这个讨论贴
http://bbs.csdn.net/wap/topics/390764291
你现在的这个代码不管加不加this,输出的都是A里的i=0,只有B里复写了abc方法(复写的方法里同样不管有没有this都一样),输出的才是B里的i=1……我的理解是,因为你的B里没有复写A里的方法abc,所以对象调用abc方法时实际上运行的还是A里的代码,使用的变量会“就近”在本类中查找。
好像有的大神不认同什么就近的说法,而是从jvm内存的角度解释,可是我看了半天实在看不到,初学水平太低理解不能╮(╯▽╰)╭
回复 使用道具 举报
sl943508135 发表于 2016-3-11 00:59
应该输出b的i。你写的A类的方法是不能有返回值的,你确定通过编译了?

上面那个我用eclipse打了一遍,返回确实是B调用返回A的i;
class C{
        public static void main(String[] args){
                B b=new B();
                System.out.println(b.abc());        //输出结果是0;
        }
}
class A{
        int i=0;                //A的i是0
        int abc(){
                return this.i;
        }
}
class B extends A{
        int i=1;                //B的i是1
}
回复 使用道具 举报
B是子类,它应该继承父类A中的方法abc( ),方法继承后应该输出B中i,为什么又是A中i了,实在不理解?
回复 使用道具 举报
this只能在本类中引用
回复 使用道具 举报
B类继承A类,你虽然建立流B类的对象,但是你调用的是A类的方法,this就指向了它。
回复 使用道具 举报
吴俊灿 发表于 2016-3-11 12:45
上面那个我用eclipse打了一遍,返回确实是B调用返回A的i;
class C{
        public static void main(String[]  ...

这是我在网上看到的解释的我觉得挺好的,你看看
1,子类继承父类,会继承父类的所有属性(properties)和方法(methods),包括private修饰的属性和方法,但是子类只能访问和使用非private的,所以可以这么理解: 子类对象的内部 包涵了一个完整父类对象;
2.  new Zi()就是创建一个子类对象,而子类对象内部包涵了父类对象,所以又要先new Fu(), 也就是说
 创建子类对象 = 创建父类对象 + 其他 
//        Zi() {

//                super(); 这是JVM默认加上去的

//        }
3.子类对象没有重写(Overriding)父类的方法,那么这个方法就还"包涵"在父类对象里,,子类对象用getI()方法,其实质调用的是 子类对象"肚子里的"那个父类对象的方法.

4 return i; JAVA规定,变量前面没有特别说明是谁的变量,那么就适用"就近原则",显然父类对象的属性int i是最近的,下面这个例子可以更好的理解就近原则;
public class Test {
        static int age = 1;
        public static void main(String[] args) {
           System.out.println(age);//输出1 此处没有指明这个age是谁的,适用就近原则,JVM认为age是成员变量static int age;
           int age = 2;
           System.out.println(age);//输出2 此处没有指明这个age是谁的,适用就近原则,JVM认为age是局部变量int age;
           System.out.println(Test.age);//输出1 此处指明了是类Test的age,JVM就不能再用就近原则了.
}
}
虽然子类继承了父类的,如果没有重写,严格意义上来说,只能说子类能直接访问这个属性或者是方法,但是这个方法还是在父类的里面。子类相当于将整个父类放在了自己的里面。所以在没有重写的情况,由于这个方法还是在父类中间的方法,所以返回的还是父类的属性。
回复 使用道具 举报
this是用来区分成员变量与局部变量,你return的是A类的this,所以this指的就是A类的成员变量i=0.B类你只是定义了成员变量i,没有return,在main方法里是调用不出来的.
回复 使用道具 举报
顶一个啊
回复 使用道具 举报
...我来看看
回复 使用道具 举报
??????????????
回复 使用道具 举报
小帆帆 来自手机 中级黑马 2016-3-12 00:23:20
14#
我记得冯佳老师的视频里好像是有讲过这个的,虽然是B.abc()但是是继承父类的方法,B在堆内存里创建了一个完整的父类对象,所以输出的是A里的值,如果在B里把abc()重写,那输出的就是B里的值了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马