当前位置: 首页 > 面试题库 >

用构造函数初始化变量

闽经纬
2023-03-14
问题内容

我有两个班,第一个是我的主班,第二个是我的编辑框架班。

public class RecordTableGUI extends JFrame implements ActionListener {
    String newName;
    public RecordTableGUI(String newReceivedName) {
        newName = newReceivedName;
        System.out.println("new name in new constructor : " + newName);  //prints new name correctly
    }
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == editButton) {
            Object oldName = table.getValueAt(table.getSelectedRow(), 1);
            System.out.println("old name: " + oldName);  // prints old name correctly

            this.setVisible(false);
            new UpdateGUI(String.valueOf(oldName));
            System.out.println("new name in problem area: " + newName); // why null?
        }
    }
}

我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时okButton,它将newName发送给我的第一个类。

我的第二堂课:

public class UpdateGUI extends JFrame implements ActionListener {
String oldName, newName;
    public UpdateGUI(String oldname) {
    oldName = oldname;
....
}
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == okButton) {
    newName = tf.getText();      //tf is JTextfield
    new RecordTableGUI(newName);
    this.setVisible(false);
    }
}

我的问题是,为什么newName为null?

更新:

public class RecordTableGUI extends JFrame implements ActionListener {
    public RecordTableGUI(String newReceivedName) {
    setNewName(newReceivedName);
}
        public void actionPerformed(ActionEvent e) {
        if (e.getSource() == editButton) {
            Object oldName = table.getValueAt(table.getSelectedRow(), 1);
        System.out.println("old name: " + oldName);

        RecordTableGUI recordObject = new RecordTableGUI();
        UpdateGUIDialog updDialog = new UpdateGUIDialog(String.valueOf(oldName), recordObject);
        }

    }

UpdateGUIDialog类:

public class UpdateGUIDialog extends JDialog implements ActionListener {
    RecordTableGUI recordtablegui;
    public UpdateGUIDialog(String old, RecordTableGUI recordGUI) {
    oldName = old;
    recordtablegui = recordGUI;
}
    @Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == okButton) {
    newName = tf.getText();
    recordtablegui.setNewName(newName);
    this.dispose();

}
}
 }

输出:

old name:james      //prints correctly
new name: null       //prints null
new name in set method: rrr      //prints correctly

我需要打印rrr而不是null。


问题答案:

Java对象有点像真实对象。并new顾名思义:它创建了一个新对象。让我们举一个简单的例子:

Box box1 = new Box();
Box box2 = new Box();
box1.fillWithCandies(candies);

box1是一个装满糖果的盒子。box2是一个不同的盒子,不包含任何东西,因为只box1装满了糖果。

在您的代码中,updateGUI的actionPerformed()方法RecordTableGUI使用新名称创建一个新对象。那不会改变第一个。

如果要updateGUI修改现有的RecordTableGUI对象,则需要具有对该对象的引用:

public class updateGUI extends JFrame implements ActionListener {

    private RecordTableGUI recordTableGUIToUpdateWhenOKIsClicked;

    public updateGUI(RecordTableGUI recordTableGUIToUpdateWhenOKIsClicked, ...) {
        this.recordTableGUIToUpdateWhenOKIsClicked = 
            recordTableGUIToUpdateWhenOKIsClicked;
        ...
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == okButton) {
            newName = tf.getText();
            this.recordTableGUIToUpdateWhenOKIsClicked.setNewName(newName);
        }
    }
}

在使用Swing之前,您应该使用简单的示例进行练习。您还应该遵守Java命名约定。并且updateGui该类应该是JDialog,而不是JFrame。



 类似资料:
  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添

  • 映射对构造函数没有限制或要求 (__init__ )类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。 sqlAlchemy ORM不调用 __init__ 从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle 模块,调用低级 __new__ 方法,然后在实例上悄悄地恢复属

  • 生成类对象时,其成员可以用类的构造函数初始化。构造函数是与类同名的成员函数。程序员提供的构造函数在每次生成类对象(实例化)时自动调用。构造函数可以重载.提供初始化类对象的不同方法。数据成员应在类的构造函数中初始化或在生成对象之后设置其数值。 常见编程错误 6.7 类的数据成员只能在类定义中初始化。 常见编程错误 6.8 试图声明构造函数的返回类型和返回植是个语法错误。 编程技巧 6.5 适当时候(

  • 问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段

  • 本文向大家介绍C++构造函数初始化顺序详解,包括了C++构造函数初始化顺序详解的使用技巧和注意事项,需要的朋友参考一下 1.构造函数、析构函数与拷贝构造函数介绍 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值。不能重载

  • 我试图从WebClient中替换RestTemplate,因为根据Java文档,RestTemple将被弃用。Spring团队建议尽可能使用WebClient。 之前的RestTempalte代码如下 我想从WebClient替换RestTemplate。所以我实现了类WebClientConnection,如下所示 我使用这个依赖项 Webclient create 上有堆栈溢出错误 如何正确地