Java 无法在子类中访问抽象类中的私有字段
我有一个类,它代表了我简单游戏中的每个对象(玩家、敌人、光束等等——它们都有很多共同点,比如速度、位置、dmg)。所以我把这个类命名为Thing。下面是它的样子: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
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
,因为这似乎是游戏逻辑的基础)。