繁体   English   中英

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

[英]We cant access non static instance from a static method, but can initiate a class. how?

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

JVM调用main方法来运行超出项目范围的方法。

当JVM调用main方法时,被调用的类存在任何对象 因此,它必须具有静态方法才能允许此类。

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

如果您要实例化 ,则可以。 创建一个类的实例,调用构造函数中,无论是new的呼叫在由main或其他地方。

如果您确实的意思是类初始化(通常会隐式发生),那么不会。 类的初始化不涉及类的构造函数。

例如

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

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

那构造函数是静态的吗?

构造函数始终是静态的……从某种意义上说, new不需要现有实例。

是的,我们无法从静态块访问非静态变量,因为非静态变量是实例变量,并且只能通过使用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代码执行过程

图片来自: 了解JVM内部

JVM开始执行Java文件时,它将

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

  2. 使用系统类加载器和BoostrapperClassLoader分别加载 .java文件和必要的软件包。

  3. 加载后,JVM将查找.class文件并存储所有信息,如变量,包,方法等,并将其保存到内存中并初始化所有字段变量

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM