gpt4 book ai didi

java - 在类的构造函数中初始化的实例变量在重写方法中变为 null

转载 作者:行者123 更新时间:2023-11-30 04:42:07 27 4
gpt4 key购买 nike

这里我有一个简单的类,它扩展了 ACM 图形库中名为 GRect 的类。Grect 是一个可以绘制到 GCanvas 的基本矩形(也是 ACM 的一部分)。我想要实现的是一个新对象,它是一个矩形,但有一个随矩形移动的附加标签。

在我的代码中,我创建了一个名为labeledRect的类,它扩展了GRect,并包含一个GLabel类型的实例变量“rectLabel”,该变量在labeledRects构造函数中初始化。我想重写 GRect 的一些方法,以便当 labelledRect 移动时, rectLabel 随之移动。

我的问题是,尽管“rectLabel”被声明为实例变量,并在构造函数中初始化,但它在重写方法“setLocation”中变为 NULL。我也尝试在声明时初始化“rectLabel”,但出现了同样的问题。

import acm.graphics.*;

public class labeledRect extends GRect {

//GLabel declared as an instance variable
public GLabel rectLabel;

public labeledRect(double x, double y, double width, double height, String theLabel) {
//Call GRect constructor
super(x, y, width, height);

//Label initialized.
//Location setting and adding to the canvas works fine here.
rectLabel = new GLabel(theLabel);
rectLabel.setLocation(
x + (width / 2) - (rectLabel.getWidth() / 2),
y + (height / 2) + (rectLabel.getAscent() / 2.2));
}

public void setLocation(double x, double y)
{
//Setting GRect's location. Works correctly./
super.setLocation(x, y);

//Attempt to set the label's location
//and get a NullPointer exception for rectLabel
rectLabel.setLocation(
super.getX() - (rectLabel.getWidth() / 2),
super.getY() - (rectLabel.getHeight() / 2));
}
}

最佳答案

鉴于它是一个公共(public)字段,很难准确推断是什么将变量设置为 null。这是你应该改变的第一件事。字段几乎始终应该是私有(private)的。

接下来,您说 setLocation 是一个被重写的方法 - 它是否会在 GRect 构造函数中调用?如果是这样,将在 labeledRect 构造函数中设置值之前调用该函数,这很可能是导致问题的原因。

在 Java 中,父类(super class)构造函数在子类中的任何代码之前执行 - 在实例变量初始值设定项和构造函数主体之前执行。 所有变量都有其默认值。这就是为什么从构造函数调用虚拟方法是一个坏主意。

(顺便说一句,名称 labeledRect 不遵循 Java 命名约定。)

关于java - 在类的构造函数中初始化的实例变量在重写方法中变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com