gpt4 book ai didi

java - Java中通过super继承子类变量

转载 作者:行者123 更新时间:2023-11-30 07:28:39 26 4
gpt4 key购买 nike

这个标题没有很好地表达我的意思,我很抱歉,但我很难更好地表达它,因为由于缺乏 OOP 知识和经验,我不太明白发生了什么。

我正在构建一个基本游戏,玩家将在带有“英雄” Sprite 的棋盘上奔跑,并被“坏人” Sprite 追逐。因为这两个 Sprite 共享 5-6 个方法,所以我决定创建一个父类(super class)“Sprite”和两个类“Hero extends Sprite”和“BadGuy extends Sprite”。现在介绍所有这些 super 方法,包括:

getX(); getY(); getBounds(); render();

为了工作,我需要 super 类来跟踪“Hero”和“badGuy”的位置。所以我像这样实现了“Sprite”:

package game.sprites;

import javafx.scene.shape.Rectangle;

import javax.swing.*;
import java.awt.*;

public class Sprite {

public static int x;
public static int y;
private int imageWidth;
private int imageHeight;
public Image image;

public Sprite(int x, int y) {
Sprite.x = x;
Sprite.y = y;
}

public static void render(Graphics g, Image image) {
g.drawImage(image, x, y, null);
}

public Image loadImage(String filePath) {...}

public void getImageDimensions() {...}

public Rectangle getBounds() {
return new Rectangle(x, y, imageWidth, imageHeight);
}

public Image getImage() {
return image;
}

public int getX() {
return x;
}

public int getY() {
return y;
}
}

当我想为“Hero”和“BadGuy”对象提供不同的起始坐标时,问题就出现了。目前,如果我将它们设置不同,“Sprite”的第二次调用将覆盖第一个调用,并且两者都从同一位置开始(如果您的目标是从“badGuy”运行,这将非常令人沮丧)。'Hero' 和 'BadGuy' 目前是这样初始化的:

public class BadGuy extends Sprite {

public BadGuy() {
super(x, y);
initBadGuy();
}

public void initBadGuy() {
loadImage("resources/craft.gif");
getImageDimensions();
x = 860; // Hero x = 20;
y = 560; // Hero y = 20;
}

所以我试图做的是让子类覆盖 Sprite 的 x 和 y。但我用谷歌搜索了一下,我知道这是一个非常糟糕的主意,因此这是不可能的。所以我的问题是这样的:如何让“Sprite”继承子类“x”和“y”变量,并在调用某个子类时执行必要的方法。

现在我看看它 - 子类的构造函数和 init<>() 都是相同的,所以也许它们可以在“Sprite”中实现?只是一个想法,但我已经很困惑了,所以不知道。

谢谢。

最佳答案

您遇到此问题是因为 xy 在您的 Sprite 类中被声明为静态字段。
来自 JLS 8.3.1.1. static Fields

If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized (§12.4).

使用以下代码:

更改您的 Sprite 类,如下所示:

public class Sprite {

public int x;
public int y;
....
}

BadGuy 类:

public class BadGuy extends Sprite {
public BadGuy(int x, int y) {
super(x, y);
...
}
....
}

英雄等级:

public class Hero extends Sprite {
public Hero(int x, int y) {
super(x, y);
...
}
....
}

从主类执行以下操作://从您要创建两个类的对象的位置

public static void main(String[] args){
Hero hero = new Hero(20,20);
BadGuy badGuy= new BadGuy(860,560);
}

关于java - Java中通过super继承子类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36475809/

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