liujia5276 2012-04-15 20:17
浏览 259
已采纳

关于构造方法初始化的问题

[code="java"]class A {

int a = f();

int f() {

return 1;

}

}

class B extends A {  
    int b = 37;  
    int f() {  
        return b;  
    }  
}  

public class CtorDemo4 {  
    public static void main(String args[]) {  
        B bobj = new B();  
        System.out.println(bobj.a);  
        System.out.println(bobj.f());  
    }  
}  [/code]

代码如上,
输出:0
37
在我看来,a应该是等于1啊,它不是应该调用的是A类里面的f()方法吗?
本人菜鸟,希望各位多多指点,感激不尽。

  • 写回答

4条回答 默认 最新

  • jep1983 2012-04-15 23:45
    关注

    class A的方法f没有执行,对象的成员属性如果是int,会给它一个默认值0。引申一下修改了你的原始代码:
    [code="java"]class A {
    static int a_static = 20 ;
    static{
    System.out.println("执行A的静态代码块");
    System.out.println("class A 输出 a_static---"+a_static);
    }

    {
        System.out.println("执行A的普通代码块");
    }
    int a = f();
    
    int f() {
        System.out.println("f()");
        return 1;
    }
    
    public A(){
        System.out.println("执行A的构造方法");
    }
    

    }

    class B extends A {
    int b = 37;
    {
    System.out.println("执行B的普通代码块");
    }
    static int b_static = 10;
    static{
    System.out.println("执行B的静态代码块");
    System.out.println("class B 输出 b_static---"+b_static);

    }
    int f() {
        return b;
    }
    
    public B(){
        System.out.println("执行B的构造方法");
    }
    

    }

    public class CtorDemo4 {
    public static void main(String args[]) {
    B bobj = new B();
    System.out.println(bobj.a);
    System.out.println(bobj.f());
    }
    }
    [/code]
    输出:
    执行A的静态代码块
    class A 输出 a_static---20
    执行B的静态代码块
    class B 输出 b_static---10
    执行A的普通代码块
    执行A的构造方法
    执行B的普通代码块
    执行B的构造方法
    0
    37

    类中的静态变量和静态代码块,是class级别的变量和代码块,不依赖于类的实例,所以会在构造方法之前进行,也就是在你new对象之前。为了保证类能够正确初始化,非静态代码块会在构造方法进行之前执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!