我们无法从静态方法访问非静态实例,但可以启动一个类。怎么样?

时间:2014-08-17 14:26:28

标签: java

我们无法从静态方法访问非静态实例。但是main()方法是静态的并且首先运行。在main方法中的任何其他类的初始化期间,它将调用构造函数。这个构造函数是静态的吗? JVM的基本流程是什么?

3 个答案:

答案 0 :(得分:4)

JVM调用 main 方法来运行项目范围之外的方法。

当JVM调用main方法时,正在调用的类存在 no object 。所以它必须有静态方法才允许来自类。

答案 1 :(得分:1)

  

在main方法中的任何其他类的初始化期间,它将调用构造函数。

如果您的意思是 instantiation ,那么它会。创建类的实例会调用构造函数,无论new调用是在main还是在其他任何地方进行的。

如果你真的意味着类初始化(通常发生隐式),那么不,它不会。类的初始化不涉及类构造函数。

例如

    public class Example {
        private static int foo = OtherClass.someMethod();
        static {
            // do something
        }
        public Example() {
            // do something
        }
    }

类初始化执行foostatic初始化程序块的初始化程序,但不执行构造函数。创建Example的实例会调用Example()构造函数。

  

那个构造函数是静态的吗?

构造函数始终是静态的......在new不需要现有实例的意义上。

答案 2 :(得分:0)

是的,我们无法从静态块访问非静态变量,因为非静态变量是实例变量&只能通过使用new运算符创建类对象或使用Class.newInstance()之类的反射来访问。然而,静态变量是类级别&它的值对于每个对象都是不变的。这意味着无需创建类的对象来访问这些变量。您可以使用类名(不同的类)或直接(在同一个类中)访问静态变量,如: -

public class HelloWorld {
    private static String message = "Hello";
    public static void main(String[] args) {
        System.out.println(message);
        System.out.println(HelloWorld1.sayHello);
    }
}

public class HelloWorld1 {
    public static String sayHello = "Hello1";
}

main()方法:

public static void main(String[] args) {}

在Java中,main()方法是静态的&它是JVM的切入点。因为, main()方法不属于Java中的任何类。当我们在任何用户定义的类中定义main()方法时,它将属于该类。 因为它是静态的&在同一个类中,不需要使用类名访问它。主要方法可直接用于JVM。

JVM的工作原理:

当需要执行任何Java类时, ClassLoader 就会出现。 Java类加载器是Java运行时环境的一部分,可以将Java类动态加载到Java虚拟机中。

Java Code execution process

图片取自: Understanding JVM Internals

当JVM开始执行Java文件时,它就是

  1. 首先编译 .java文件&将其转换为.class文件,其中包含bytecode,即机器语言或汇编语言。每次处理相同的字节码时, JVM都可以与JIT (即时)编译器一起使用将字节代码转换为本机代码

  2. 加载 .java文件&必要的软件包使用System Class Loader& BoostrapperClassLoader resp。

  3. 加载后,JVM将查看.class文件& 存储所有信息,如变量,包,方法等等。将它们保存到记忆中&初始化所有字段变量

  4. JVM然后开始解释字节码&以人类可读的形式显示结果。

相关问题