解释执行java代码的顺序或优先级?

时间:2016-11-21 20:02:26

标签: java initialization

我有这两个类

public class B {
      int  mB = 5;

    public  int getBValue(){
        return mB;
    }
}

public class A {
     int mA = b.getBValue();

    public static void main(String [] args){
         B b = new B();
        System.out.println(mA);
    }
}

编译器说"找不到符号b"。我理解代码首先从main方法执行并按行顺序排列。因此,当编译器读取代码时,它首先进入" B b = new B();"然后b成为定义。这是真的吗?范围错了吗?

我理解的第二种状态:

public class B {
     static int  mB = 5;

    public static int getBValue(){
        return mB;
    }
}

public class A {
     static  int mA = B.getBValue();

    public static void main(String [] args){
        System.out.println(mA);
    }
}

此状态正常。静态属于类本身,不属于任何对象。所以当程序运行时,所有静态加载和初始化。

那么这两个国家之间的关键点在哪里?

2 个答案:

答案 0 :(得分:2)

  

我理解代码首先从main方法执行并按行顺序排列。

这是完全正确的。但是,来自main(或来自任何其他方法)的变量不能在class A的字段初始值设定项中使用,它们在它们自己的上下文中作为类构造函数的一部分执行。 / p>

  

当编译器读取代码首先转到B b = new B();然后b被定义为真的

是的,b定义为其范围的其余部分,即直到main的右括号。

  

那么这两个国家之间的关键点是什么?

本练习的主要内容是,字段初始化程序可以自由访问静态字段和方法;他们无法访问任何其他方法,包括构造函数参数和任何方法的局部变量。此外,参数和当地人对自己方法之外的所有事物都是禁止的。

答案 1 :(得分:0)

这里:

public class A {
     int mA = b.getBValue();

    public static void main(String [] args){
         B b = new B();
        System.out.println(mA);
    }
}

bA实例不可见,因为它是main()方法中的局部变量。其范围仅限于main()方法 为了可见,它应该在A类中声明为静态字段。

这里:

public class B {
     static int  mB = 5;

    public static int getBValue(){
        return mB;
    }
}

public class A {
     static  int mA = B.getBValue();

    public static void main(String [] args){
        System.out.println(mA);
    }
}

有效:

 static  int mA = B.getBValue();

因为在此范围内可以访问B.getBValue()。无论如何,B.getBValue()指的是一个公共静态方法,根据定义,公共静态方法随处可见。由于它是静态的,它不需要任何实例,因为它是公共的,任何类都可以调用它。