在Java中调用new时,是否会创建构造函数或类的副本?

use*_*033 2 java class object

我目前正在从事Java任务,由于某种原因,它可以工作 - 但在我看来,它不应该!我所拥有的是一个主要方法,通过调用创建三个新按钮

panel.add(new ButtonApp());
Run Code Online (Sandbox Code Playgroud)

ButtonApp是我的ButtonApp类中定义的构造函数.

在我的课程开始时,我有一个声明如下的变量:

public int clicks = 0;
Run Code Online (Sandbox Code Playgroud)

此变量的目的是跟踪用户单击其特定ButtonApp的次数.每次点击后都会调用点击++.

现在,在我看来,每次单击按钮时,点击变量shoudl都会增加,因此,如果单击左键,它也会增加中间和右侧按钮.

基本上我所拥有的快速短伪代码是:

public class ButtonApp() {
    public int clicks =0;

    public static void main(String[] args) {
        //create JPanel/Frame etc etc
        panel.add(new ButtonApp());
        panel.add(new ButtonApp());
        panel.add(new ButtonApp());
    }

    public ButtonApp(){
        //creates a new button
        this.actionListener(this);
    }

    public void update(){
        clicks++;
    }

    public void actionPerformed (ActionEvent event){
        update();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不总是clicks在这里增加一个变量吗?

Sea*_*oyd 8

我不总是在这里增加一个点击变量吗?

不,您正在处理实例变量.每个对象创建一个此变量的副本new

如果您将代码更改为:

public static int clicks =0;
Run Code Online (Sandbox Code Playgroud)

您确实只有一个可以多次更改的变量(静态字段属于该类,实例字段属于该实例)

参考:

(全部来自Java教程>学习Java语言>类和对象部分)


Jim*_*son 5

new()创建类'DATA的实例 - 即任何成员变量.代码不重复.在您的情况下,每个类都有自己的"点击"成员变量.

如果你声明clicksstatic,那么它将是一个"类变量",属于类本身而不是它的实例,然后只有一个副本.但是,您没有将其声明为静态,因此每个实例(即由new()创建的每个"事物")都会获得自己的副本.