Java 无法在子类中访问抽象类中的私有字段

Java 无法在子类中访问抽象类中的私有字段,java,Java,我有一个类,它代表了我简单游戏中的每个对象(玩家、敌人、光束等等——它们都有很多共同点,比如速度、位置、dmg)。所以我把这个类命名为Thing。下面是它的样子: public abstract class Thing { private Image image; private float x; private float y; private float speed; private final int WIDTH; private final

我有一个类,它代表了我简单游戏中的每个对象(玩家、敌人、光束等等——它们都有很多共同点,比如速度、位置、dmg)。所以我把这个类命名为Thing。下面是它的样子:

public abstract class Thing {
    private Image image;
    private float x;
    private float y;
    private float speed;
    private final int WIDTH;
    private final int HEIGHT;

    public Thing(String filename, float x, float y, float speed) {
        try {
            Image image = ImageIO.read(new File(filename));
        } catch (Exception e) {}
        this.x = x;
        this.y = y;
        this.speed = speed;
        WIDTH = image.getWidth(null);
        HEIGHT = image.getHeight(null);
    }

    //Zwraca ksztalt do sprawdzania czy contains...
    public Rectangle2D getShade() {
        return new Rectangle2D.Float(x, y, WIDTH, HEIGHT);
    }

    public Image getImage() {
        return image;
    }

    public Point2D getPoint() {
        return new Point2D.Float(x, y);
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }
}
我已经扩展了类播放器:

public class Player extends Thing {
    public Player(String filename, float x, float y, float speed) {
        super(filename, x, y, speed);
    }

    public void moveToPoint(Point2D targetPoint) {
        int targetX = (int)targetPoint.getX();
        int targetY = (int)targetPoint.getY();
        if ( ((int)x+20 < targetX+3) && ((int)x+20 > targetX-3) ) {
            return;
        }
        float distanceX = targetX - x;
        float distanceY = targetY - y;
        //Dodanie 20px wymiarow statku
        distanceX -= 20;
        distanceY -= 20;
        //Ustalenie wartosci shiftow
        float shiftX = speed;
        float shiftY = speed;
        if (abs(distanceX) > abs(distanceY)) {
            shiftY = abs(distanceY) / abs(distanceX) * speed;
        }
        if (abs(distanceY) > abs(distanceX)) {
            shiftX = abs(distanceX) / abs(distanceY) * speed;
        }
        //Zmiana kierunku shifta w zaleznosci od polozenia
        if (distanceX < 0) {
            shiftX = -shiftX;
        }
        if (distanceY < 0) {
            shiftY = -shiftY;
        }
        //Jezeli statek mialby wyjsc poza granice to przerywamy
        if ( (((int)x+shiftX < 0) || ((int)x+shiftX > 260)) || ((y+shiftY < 0) || (y+shiftY > 360)) ) {
            return;
        }
        //Zmiana pozycji gracza
        x += shiftX;
        y += shiftY;
    }
}
公共类播放器扩展了东西{
公共播放器(字符串文件名、浮点x、浮点y、浮点速度){
超级(文件名,x,y,速度);
}
公共无效移动点(点2D目标点){
int targetX=(int)targetPoint.getX();
int targetY=(int)targetPoint.getY();
如果(((int)x+20targetX-3)){
返回;
}
浮动距离x=targetX-x;
浮动距离y=targetY-y;
//Dodanie 20px wymiarow statku
距离x-=20;
距离y-=20;
//瓦托西酒店
浮动移位Tx=速度;
浮动移位=速度;
如果(abs(距离X)>abs(距离Y)){
换档=abs(距离Y)/abs(距离X)*速度;
}
如果(abs(距离Y)>abs(距离X)){
shiftX=abs(距离X)/abs(距离Y)*速度;
}
//Zmiana kierunku shifta w zaleznosci od polozenia
如果(距离X<0){
shiftX=-shiftX;
}
如果(距离<0){
shiftY=-shiftY;
}
//Jezeli statek mialby wyjsc poza granice至przerywamy
如果(((int)x+shiftX<0)| |((int)x+shiftX>260))| |((y+shiftY<0)| |(y+shiftY>360))){
返回;
}
//斯米亚纳·波兹吉·格拉查
x+=shiftX;
y+=移位;
}
}
这就是问题所在,因为我的IDE在x、y和速度字段下面加了红色下划线,告诉我不能从Player类访问这些字段。我试图将它们更改为private和default,但之后出现了一个错误。我做错了什么?当我从类中创建一个新的对象来扩展它时,我想复制所有的字段并初始化它们,就像在构造函数中所说的那个样。那么如何修复它呢?

你需要使用
getX()
getY()
等等,因为
x
y
speed
是类
东西的
私有变量


Player扩展了Thing
这一事实并不意味着Player可以访问
private
字段<代码>物品
提供的
公共
获取。。。设置…
以访问其
private
变量。

将变量
x
y
speed
更改为protected,或使用访问器
getX()
getY()
getSpeed()
getSpeed()
)来解决访问问题


将它们更改为默认值后出现的错误是调用的是
abs(…)
,而不是
Math.abs(…)
。将
abs(…)
的所有实例更改为
Math.abs(…)
,以消除新的错误。

标题中“问题”一词并非无故禁止。如果每个人都将自己的问题命名为“Java问题”,那么仅仅通过查看标题,你怎么会知道它是关于什么问题的呢?试着在标题中描述具体的问题本身,而不是使用“问题”这个词:)但我不想从Thing类访问字段。我想在玩家类中创建新字段。我们在想同一件事吗?请注意,我还尝试使用受保护的前缀(所以不需要getter),并且出现了错误。您根本没有在Thing类中定义x、y、speed变量,您需要像在Thing类中一样定义它们。顺便问一下,在Player类中定义它们的动机是什么?我改为protected,现在又出现了一个错误。动机是玩家、光束和敌人都有速度、x、y、宽度和高度,这些场总是以相同的方式定义的。所以我决定把这段代码放在抽象类中,这样我就不必把它复制到子类中了更改了要保护什么?当它们在抽象类中并且您想要重用它们时,那么getX。。。应该是方法(您最近的注释与以前的注释相矛盾)。已经存在
getPoint
,因此无需向
Thing
类添加任何内容
Point2D
可能是一个不适合在这里使用的类,原因有很多。像往常一样,我建议使用一个不可变的值类来表示该点(使用
int
,因为这似乎是游戏逻辑的基础)。