静态代码块调用问题:

静态代码块调用问题:

提示:LintCode 入门级——2875 · 程序运行结果
例如:给定一个数字 num 表示 new TestB() 的次数,请您计算执行 num 次 new TestB() 后 TestA.num 的值,并在 Solution 类的 printNum 方法中输出。


描述:

详细结构内容 截自LintCode

Main()
在这里插入图片描述
TestA.java
在这里插入图片描述
TestB.java
在这里插入图片描述
Solution实现
要求:并不会去真正的调用 new TestB() 方法,因此不要使用 TestA.num 的方式获取 num 的值。

public class Solution {
    public void printNum(int num) {
		// write your code here
        TestB testB =new TestB();
        for(int i=0;i<num-1;i++)
        {
            TestB testB1 =new TestB();
        }
        System.out.print(testB.num);
    }
}

我的初步分析:

1:首先是涉及到静态代码块调用顺序问题:
以该题目为例,当num=1时,首先会执行 new TestB,由于TestB继承TestA执行顺序:首先执行TestA父类静态代码块,在执行TestB父类静态代码块,在执行TestA匿名代码块和构造方法,然后执行TestB中的匿名代码块和构造方法,注意,static方法只执行一次,所以等到下一次创建new TestB()时,父类A中与子类B中的static代码块不再执行,因此当num=2结果为10,num=3结果为14。

2:然后是作用域的细节问题:
因为要求不要使用 TestA.num 的方式获取 num 的值,所以可以根据继承关系通过本题目约束中的子类对象调用父类成员。那么就需要在循环外创建对象(循环里面创建对象作用域只是循环内),但是在循环外定义也算为执行一次,因此再循环条件改为num-1。


优化方案:

Tips:如果有其他方法,请留言!期待改进,感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值