Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当类不是实类时,如何在类内创建变量?_Java_Oop - Fatal编程技术网

Java 当类不是实类时,如何在类内创建变量?

Java 当类不是实类时,如何在类内创建变量?,java,oop,Java,Oop,我读过一个类是创建对象的模型,在物理上并不存在,而对象是真实的。但是我们在类中创建变量,甚至操纵它们 当类在物理上不存在时,这怎么可能呢 何时为这些变量创建内存 为这些变量创建的内存在哪里 如果您指的是静态类变量,那么在使用该类之前,它们将被保证初始化,并且类内的任何静态初始化代码都将被保证运行。确切的时间,没有指定IIRC,不同的JVM可能在不同的时间执行此操作。它们基本上和具有全局变量的语言中的全局变量是一样的 所以重申一下:静态的东西是存在的,并且在第一次使用之前就被初始化了。JVM实现负

我读过一个类是创建对象的模型,在物理上并不存在,而对象是真实的。但是我们在类中创建变量,甚至操纵它们

  • 当类在物理上不存在时,这怎么可能呢

  • 何时为这些变量创建内存

  • 为这些变量创建的内存在哪里


  • 如果您指的是静态类变量,那么在使用该类之前,它们将被保证初始化,并且类内的任何静态初始化代码都将被保证运行。确切的时间,没有指定IIRC,不同的JVM可能在不同的时间执行此操作。它们基本上和具有全局变量的语言中的全局变量是一样的

    所以重申一下:静态的东西是存在的,并且在第一次使用之前就被初始化了。JVM实现负责这一点

    但有一个对象:类对象的实例,它是的子类



    另外:事实上,在Java中,类是如此具体地存在,它们可以被序列化,通过网络传输到不同的JVM,在那个里进行反序列化,在那个里创建类的对象并执行代码。在浏览器中运行的普通Java小程序就是一个简单的例子。另一个例子是Jenkins/Hudson CI系统中的从节点,其中从程序非常小,只包含接收、反序列化和实例化这些类的类和对象的代码,这些类和对象由它们所连接的主服务器发送。

    试着这样想。这并不是对任何Java运行时是如何做到这一点的准确解释,而是对类/对象二元性的一种思考方式,可能会对您有所帮助

    在编写类X时,需要描述代码和数据。运行时只需要一些东西的一个副本——例如代码和静态变量——以及每个对象一个其他东西的副本,比如实例变量。您在编写的类文件中描述了这两个方面,即使它们将单独存储

    将每个类的一个副本视为一起存储在一个内存块中——它在C中称为struct。在Java中,第一次在程序中引用类X时,运行时分配该内存块并将其与类X关联

    当程序执行诸如“X x1=new X()”之类的语句时,运行时将分配另一个包含所有实例变量的内存块(或结构),并保留一个指向与x1变量关联的内存块的单独指针

    现在,当程序执行类似“Arc Arc=x1.getArc();”的内容时,运行时使用第一个指针引用方法getArc()中的代码,使用第二个指针引用与x1关联的实例变量,并使用这些实例变量执行指定的代码

    JLabel label;
    
    OO编程提供了这种将数据与操作数据的代码相关联的方式,允许我们将程序组织为组合代码和数据的“对象”。运行时为我们跟踪事物的不同副本


    我认为说类不存在是不准确的,它不会以您编写它的形式存在。

    类在运行时确实存在于JVM中。你读到的解释是试图把重点放在后面,剩下的细节留待以后再说。学校和书本总是这样


    在Oracle JVM中,类从加载时起就具有物理表示。事实上,每个对象都有一个指向该类的指针,许多对象可以指向同一个类

    我不认为类或对象是物理对象,这让我感到困惑。类通常被描述为对象的蓝图。必须使用
    new
    关键字实例化(创建)对象,实例化对象时,对象的类将用作创建基本默认对象的蓝图。然后,即使在运行时,也可以通过引用内存中存储对象的位置并使用对象类中的方法来操纵对象类中的字段来操纵对象,至少通常应该这样做,这就是所谓的封装,在OOP中非常重要,所以如果您不熟悉封装,我建议您研究一下

    我提到了一个对象可以在运行时进行操作,这是对象和类之间的主要区别。课程也可以使用一种叫做反射的东西,但这是另一天的另一个话题。变量或字段有时被描述为地址,它是对内存中存储对象的位置的引用。对象不是直接访问的,而是通过变量引用的

    JLabel label;
    
    上面的代码是在内存中留出一个位置来存储
    JLabel
    对象,当它被
    new
    关键字实例化时。到目前为止还没有一个对象被创建,我们已经声明了一个变量,它是对内存中对象创建时将被存储的位置的引用。我们不打算直接访问JLabel对象,我们将使用我们创建的“label”变量来引用内存中的实际对象。因此,如果我们创建两个
    JLabel
    对象并实例化它们,就像这样

    JLabel label;
    label = new JLabel();
    JLabel anotherLabel = new JLabel("this is another label");
    
    我们现在有两个JLabel对象。第一个对象首先声明一个引用该对象的变量,然后在单独的行上实例化它。第二个对象声明对它的引用,并在一行中实例化它。您可以以任何一种方式创建对象,并且使用这两种方法的原因不同。当一个对象被创建时,至少有一个构造函数被调用,第一个对象调用
    JLabel
    类中不带参数的构造函数;第二个对象使用
    JL中的构造函数