静态代码块调用问题:
提示: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:如果有其他方法,请留言!期待改进,感谢