Java中oop通过super继承子类变量
这个标题并不能很好地表达我的意思,我很抱歉,但我很难更好地表达它,因为我不太理解正在发生的事情,因为我缺乏面向对象的知识和经验
我正在制作一个基本的游戏,让玩家和一个“英雄”精灵在棋盘上奔跑,被一个“坏人”精灵追赶。因为这两个精灵共享5-6个方法,我决定制作一个超级类“精灵”和两个类“英雄扩展精灵”和“坏人扩展精灵”。现在来看所有这些超级方法,包括:
getX(); getY(); getBounds(); render();
为了工作,我需要超级类来追踪“英雄”和“坏人”的位置。所以我实现了如下“精灵”:
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;
}
}
当我想给“英雄”和“坏人”对象提供不同的起始坐标时,问题就出现了。目前,如果我将它们设置为不同的,则第二次调用“Sprite”会覆盖第一次调用,并且两次调用都从同一个位置开始(如果你的目标是从“坏人”处跑开,这将非常令人沮丧)。 “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”中实现?只是一个想法,但我已经很困惑了,所以不知道
谢谢
# 1 楼答案
出现这个问题是因为
x
和y
在Sprite
类中被声明为静态字段从JLS 8.3.1.1. static Fields
使用以下代码:
更改您的精灵类,如下所示:
坏人班:
英雄类:
从Main class中执行以下操作://从其中创建两个类的对象