在Java中通过super继承子类变量

时间:2016-04-07 12:11:39

标签: java oop inheritance subclass superclass

这个标题并不能很好地表达我的意思,我道歉,但我很难表达得更好,因为我不太清楚由于缺乏OOP知识而发生了什么和经验。

我正在建立一个基本的游戏,这将让玩家围绕着一个拥有英雄'精灵,被一个' badGuy'追赶精灵。因为这两个精灵分享了5-6种方法,所以我决定制作一个超级精灵' Sprite'两个班级' Hero延伸了Sprite'并且' BadGuy扩展了Sprite'。现在为所有这些超级方法,包括:

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

上班我需要超级班来跟踪“英雄”的位置。并且' 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;
    }
}

当我想给“英雄”提供不同的起始坐标时,问题就出现了。和'BadGuy'对象。目前,如果我将它们设置为不同,则第二次调用' Sprite'覆盖第一个并且都在同一个地方开始(如果你的目标是从'badGuy')开始,这将是非常令人沮丧的。 '英雄'和'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 个答案:

答案 0 :(得分:1)

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

  

如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。静态字段(有时称为类变量)在初始化类时实现(第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);
        ...
    }
  ....
}

从Main类执行以下操作://从哪里创建两个类的Object

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