在csdn上看到的怪问题

博客围绕Java代码展开,通过test2、test3、test4三个类的继承关系,探讨了继承中属性和方法的调用问题。指出继承中方法可覆盖,但属性无覆盖作用,this传当前对象句柄,方法调用最近父类方法,还提及与C全局变量副作用类似及调试工具情况。

public class test2 {
    public String user = "test2";

    public test2() {
    }

    public String getUser(){
        System.out.println(this.user);  //这里打印的为什么是"test2",而不是"test4"
        user = getPassword();    //这里执行的为什么是test3的方法,而不是本身定义的方法呢
        return user;
    }
   
    public String getPassword(){
        System.out.println(this.user);
        return "hello test2";
    }
}

public class test3 extends test2{
    public String user = "test3";
   
    public test3() {
    }

    public String getPassword(){
        System.out.println(this.user);
        return "hello test3";
    }
}

public class test4 extends test3{
    public String user = "test4";
   
    public test4() {
    }
   
    public static void main(String[] args){
        test4 t4 = new test4();
        t4.getUser();
    }
}

输出结果是:test2,test3
被给分人的解答是:

1.这是个作用域的问题!
由于在继承中,只是针对方法的覆盖,对于属性并没有覆盖的作用。

那样来说,user这个属性,在一个test4的对象里面就有3份!

在test4的作用范围内,他就是test4,test3的范围内就是test3.

这个问题,可能比较难以让人理解。但是你想一下类代码的调用方式你就明白了!

如果你学过c的话,你肯定知道,全局变量带来的副作用,哈哈,跟这个类似!

不过这个问题,好像还真不是个一般的问题,我用jb跟踪执行的时候,那个user一直是test4,但是实际输出的就不是了!

不知道jb的调试工具,对这个问题怎么考虑的!
2.this传的是当前调用方法的对象的句柄,在本例中是test4,而它有三个user属性,它们是有各自的属性域的,即在test2中只显示"test2",即在test3中只显示"test3"(若在test3中也重写一段getuser(),那就会显示"test3",感觉就是三个属性只在自己娘家才会显现出对应的那个);对于方法,则只是调用最近一层父类的方法,所以调用test3的getpassword()方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值