首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中用Super继承子类变量

在Java中用Super继承子类变量
EN

Stack Overflow用户
提问于 2016-04-07 12:11:38
回答 1查看 1K关注 0票数 1

这个标题没有很好地表达我的意思,我很抱歉,但是我很难更好地表达它,因为我不太明白由于缺乏面向对象的知识和经验所发生的事情。

我正在构建一个基本的游戏,它将让玩家在一个有“英雄”精灵的棋盘上跑来跑去,被一个'badGuy‘精灵追逐。由于这两个精灵共享5-6个方法,所以我决定创建一个超类'Sprite‘和两个类'Hero’和'BadGuy扩展雪碧‘。对于所有这些超级方法,包括:

代码语言:javascript
复制
getX(); getY(); getBounds(); render();

为了工作,我需要一个超级班来追踪“英雄”和“坏家伙”的位置。所以我就这样实现了‘雪碧’

代码语言:javascript
复制
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’中运行,这将非常令人沮丧)。“英雄”和“BadGuy”目前是这样初始化的:

代码语言:javascript
复制
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‘来实现呢?只是一个想法,但我已经很困惑了,所以不知道。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-07 12:20:13

您会遇到这个问题,因为xySprite类中被声明为静态字段。

来自JLS 8.3.1.1.静态场

如果一个字段被声明为静态的,那么不管最终创建了多少个类的实例(可能为零),字段的一个化身都是存在的。当类初始化时,静态字段(有时称为类变量)被具体化(§12.4)。

使用以下代码:

更改您的雪碧类如下:

代码语言:javascript
复制
public class Sprite {

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

BadGuy类:

代码语言:javascript
复制
public class BadGuy extends Sprite {
    public BadGuy(int x, int y) {
       super(x, y);
        ...
    }
  ....
}

英雄班:

代码语言:javascript
复制
public class Hero extends Sprite {
    public Hero(int x, int y) {
       super(x, y);
        ...
    }
  ....
}

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

代码语言:javascript
复制
public static void main(String[] args){
 Hero hero = new Hero(20,20);
 BadGuy badGuy= new BadGuy(860,560);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36475809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档