有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    出现这个问题是因为xySprite类中被声明为静态字段
    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).

    使用以下代码:

    更改您的精灵类,如下所示:

    public class Sprite {
    
        public int x;
        public int y;
        ....
    }
    

    坏人班:

    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);
            ...
        }
      ....
    }
    

    从Main class中执行以下操作://从其中创建两个类的对象

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