所有对象都是用java创建的吗?主方法中是静态对象吗?

所有对象都是用java创建的吗?主方法中是静态对象吗?,java,object,memory,memory-management,static,Java,Object,Memory,Memory Management,Static,为了访问类的非静态成员/变量,您需要首先在publicstaticvoidmainstringargs[]方法中创建一个对象 这是否意味着创建的所有对象都是静态的 我需要一个清晰的解释,并且我需要知道如何为类的静态方法/变量分配内存 我知道这听起来像个天真的问题,但我需要知道它。不,他们不是。如果这是真的,那么任何非静态的东西都不可能存在,因为所有普通Java程序都是从mainString[]方法开始的 对象从来都不是静态的 您可以创建类,比如说对象的蓝图: public class Aa {

为了访问类的非静态成员/变量,您需要首先在publicstaticvoidmainstringargs[]方法中创建一个对象

这是否意味着创建的所有对象都是静态的

我需要一个清晰的解释,并且我需要知道如何为类的静态方法/变量分配内存


我知道这听起来像个天真的问题,但我需要知道它。

不,他们不是。如果这是真的,那么任何非静态的东西都不可能存在,因为所有普通Java程序都是从mainString[]方法开始的

对象从来都不是静态的

您可以创建类,比如说对象的蓝图:

public class Aa {

    public void doSomething() { ... }

    public static void doMore() { ... }

}
您可以创建该类的实例,即如下所示的对象:

new Aa();
如果运行一个类,Java虚拟机将启动并搜索mainString[]方法。因为还没有对象的任何实例,所以必须将该方法声明为静态

见:

有时,您希望拥有对所有对象通用的变量。这是通过“静态”修改器完成的。声明中包含静态修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。类的每个实例都共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量

所以你不需要一个类的实例,也就是一个对象来获取它

我建议你读这本书

记忆力 您问题的记忆部分可能已得到回答。

您声明:

为了访问类的非静态成员/变量,您需要首先在publicstaticvoidmainstringargs[]方法中创建一个对象

这只是部分正确。对为了使用类的非静态成员,确实需要创建类的实例。但是不需要在main方法中创建实例。实际上,您不一定需要在main中创建任何对象。还有其他方法可以创建应用程序的原始对象。。。事实上,您的应用程序甚至可能没有main

这是否意味着创建的所有对象都是静态的

不,有很多原因

你最初的前提并不完全正确。 某些原始对象是通过静态方法创建的,这并不意味着所有对象都是以这种方式创建的。 最重要的原因是Java中没有静态对象! 静态的概念1适用于字段和方法。静态字段或方法不是单个对象实例的成员。但这并不适用于对象实例本身。在Java中,对象始终是独立的实体,它们永远不是其他对象的成员。。。至少在编程语言级别

例如:

public class Example {

    public static String test;

    public static void main(String[] args) {
        test = new String("Hi mum!");
    }
}
测试变量是静态的,我们为它分配一个新创建的字符串对象的引用。但稍后,我们可以将test的值分配给一个非静态变量,或者将一个引用分配给另一个要测试的对象。我们创建的对象与我们可能在非静态上下文中创建的对象没有什么不同

我需要知道如何为类的静态方法/变量分配内存

如果调用new的方法是静态的或非静态的,则为对象分配内存的方式完全相同。 如果要将引用指定给的字段是静态的或非静态的,则为对象分配内存的方式完全相同。 就内存管理而言,静态字段和非静态字段之间有两点不同:

静态字段是垃圾收集根。这意味着它们指向的对象总是可以到达的;i、 它们不会被垃圾收集

静态字段本身属于通常为堆节点的帧。对于较旧的JVM,它们位于permgen堆中,但对于Java8,普通堆和permgen堆之间的区别已经消失。加载类时,JVM分配此帧并将其挂接到其私有类数据结构中

1-static关键字也与嵌套类声明一起使用,但它的含义与嵌套类声明大不相同。我提到这一点只是为了完整


2-如果应用程序或框架实现了热加载,并且您没有类加载器泄漏,那么类及其关联的静态可以被垃圾收集。因此,静态字段并不总是可以永久访问。

为什么您认为在main方法中创建的对象是静态的?请澄清您的具体问题或添加其他详细信息,以突出显示您需要的内容。正如目前所写的那样,很难准确地说出你在问什么。看,自从
publicstaticvoidmain是一个静态方法,我们正在静态方法中创建类的对象。所以我认为创建的对象是静态的,您不能在main方法中访问类的非静态成员,但为了访问它们,您创建了类的实例。这是否意味着我们正在将类转换为静态类?但是Java说不能有一个静态类。这真让我困惑。请提供帮助。为了访问类的非静态成员,必须创建该类的实例。不管你用哪种方法写静态还是非静态,我已经把我的答案扩展了一点,注意大写的单词。
public class Example {

    public static String test;

    public static void main(String[] args) {
        test = new String("Hi mum!");
    }
}