Java中super继承子类变量
Inherit subclass variable by super in Java
这个标题没有很好地表达我的意思,我很抱歉,但我很难表达得更好,因为我缺乏OOP知识和经验,不太明白这是怎么回事。
我正在构建一个基本游戏,它将让玩家 运行 绕着一个带有 'hero' 精灵的棋盘,被一个 'badGuy' 精灵追逐。因为两个精灵共有5-6个方法,所以我决定做一个超class'Sprite'和两个classes'Hero extends Sprite'和'BadGuy extends Sprite'。现在对于所有这些超级方法,包括像这样的东西:
getX(); getY(); getBounds(); render();
为了工作我需要超级 class 来跟踪 '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' objects 不同的起始坐标时,问题就出现了。目前,如果我将它们设置不同,第二次调用 '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;
}
所以我试图做的是让子classes 覆盖 Sprite 的 x 和 y。但我用谷歌搜索了一下,我知道这是一个非常糟糕的主意,因此这是不可能的。所以我的问题是这样的:如何让 'Sprite' 继承 subclass 'x' 和 'y' 变量并在某些 subclass 时执行必要的方法打电话。
现在我看了一下 - 构造函数和 init<>() 对于子 class 是相同的,所以也许它们可以在 'Sprite' 中实现?只是一个想法,但我已经很困惑了,所以不知道。
谢谢。
您遇到此问题是因为 x
和 y
在您的 Sprite
class.
中被声明为静态字段
来自 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 Class:
public class Sprite {
public int x;
public int y;
....
}
坏人class:
public class BadGuy extends Sprite {
public BadGuy(int x, int y) {
super(x, y);
...
}
....
}
英雄class:
public class Hero extends Sprite {
public Hero(int x, int y) {
super(x, y);
...
}
....
}
From Main class 执行以下操作://从您要创建两个 class 对象的地方
public static void main(String[] args){
Hero hero = new Hero(20,20);
BadGuy badGuy= new BadGuy(860,560);
}
这个标题没有很好地表达我的意思,我很抱歉,但我很难表达得更好,因为我缺乏OOP知识和经验,不太明白这是怎么回事。
我正在构建一个基本游戏,它将让玩家 运行 绕着一个带有 'hero' 精灵的棋盘,被一个 'badGuy' 精灵追逐。因为两个精灵共有5-6个方法,所以我决定做一个超class'Sprite'和两个classes'Hero extends Sprite'和'BadGuy extends Sprite'。现在对于所有这些超级方法,包括像这样的东西:
getX(); getY(); getBounds(); render();
为了工作我需要超级 class 来跟踪 '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' objects 不同的起始坐标时,问题就出现了。目前,如果我将它们设置不同,第二次调用 '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;
}
所以我试图做的是让子classes 覆盖 Sprite 的 x 和 y。但我用谷歌搜索了一下,我知道这是一个非常糟糕的主意,因此这是不可能的。所以我的问题是这样的:如何让 'Sprite' 继承 subclass 'x' 和 'y' 变量并在某些 subclass 时执行必要的方法打电话。
现在我看了一下 - 构造函数和 init<>() 对于子 class 是相同的,所以也许它们可以在 'Sprite' 中实现?只是一个想法,但我已经很困惑了,所以不知道。
谢谢。
您遇到此问题是因为 x
和 y
在您的 Sprite
class.
中被声明为静态字段
来自 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 Class:
public class Sprite {
public int x;
public int y;
....
}
坏人class:
public class BadGuy extends Sprite {
public BadGuy(int x, int y) {
super(x, y);
...
}
....
}
英雄class:
public class Hero extends Sprite {
public Hero(int x, int y) {
super(x, y);
...
}
....
}
From Main class 执行以下操作://从您要创建两个 class 对象的地方
public static void main(String[] args){
Hero hero = new Hero(20,20);
BadGuy badGuy= new BadGuy(860,560);
}