如何从父类访问私有字段

3

我正在尝试着组合创建一个超类和一个子类,但是我发现当我执行以下操作时,无法访问父类中的私有字段:

abstract class Ball{
    private int size;
    protected Ball(int size){
        this.size = size;
    }    
    public abstract void setSize(int size);  
    public abstract int getSize();           
}

class SoccerBall extends Ball
{
    public SoccerBall(int size){
        super(size);
    }
    @Override
    public void setSize(int size){this.size = size;}//size not inherited
    @Override
    public int getSize(){return size;}              //size not inherited    
}

我知道私有字段不会被继承到子类。访问它的唯一方法(可能除了反射之外)是使用getter和setter。

所以我的问题:

(Q1) 如果我想将字段保留在父类中并保持为私有,而不是受保护的。我应该在getter和setter中使用abstract,以便使私有字段可供其子类访问吗?

(Q2) 如果我将字段(大小)设置为私有,如何实现getter和setter以使私有字段可供子类访问?


你为什么要考虑公开抽象的 get/set 方法来访问私有属性? - Jakub Kubrynski
@JakubKubrynski 你的意思是在这种情况下,size更适合被保护吗?我将它设置为私有是因为我在许多场合看到父类持有私有字段。一些SO解决方案也提到这样做是可以的,但必须通过getter和setter来访问它。但现在我在想,我们应该如何使用getter和setter访问私有字段呢? - user3437460
在这种情况下,不需要对getter/setter进行抽象化,因为抽象化意味着你只是期望实现类创建并遵循方法签名以符合要求。实现类应该负责在内部定义"size"变量。否则,如果你想定义getter/setter的工作方式(例如将值存储在变量中),你应该提供具体的方法。实现者可以根据自己的方便进行重写。 - subdigit
哥们,我觉得我现在明白了。非常感谢你们。 - user3437460
2个回答

1
如果我想将父类中的字段保持为私有而不是受保护的,那么我是否应该不将getter和setter声明为抽象方法,以使私有字段对其子类可访问?
是的,因为该字段是私有的,只有在父类中定义了getter和setter才能访问。getter和setter不应声明为抽象方法。
如果我将字段(size)设为私有,我应该如何实现我的getter和setter以使私有字段可以被子类访问?
只需在包含私有字段的父类中实现一个普通的getter和setter即可。
abstract class Ball{
    private int size;
    protected Ball(int size){
        this.size = size;
    }    
    protected void setSize(int size){
        this.size = size;
    }
    protected int getSize(){
        return size;
    }          
}

子类

class SoccerBall extends Ball{
    public SoccerBall(int size){
        super(size);
    }       
    @Override
    public void setSize(int size){
        super.setSize(size);
    }
    @Override
    public int getSize(){
        return super.getSize();
    }               
}

备注:我已经找到了一种使它工作的方法。有些善良的人可以给我一些建议,这是否是实际的做法?或者还有其他方法存在吗? - user3437460

0

不要试图直接访问值,而是将大小的访问级别更改为“protected”。这样,它就会被大部分封装起来,除非子类访问。


那么你会在哪里实现getter和setter方法呢? - user3437460
实际上,你应该将size设置为受保护的。这样,除了在子类内部,外部无法访问它。起初我没有意识到getSize和setSize方法是抽象的:P - IsaacDorenkamp
获取器和设置器不一定需要是抽象的。我只是想让有经验的人向我展示从父类访问私有字段的正确方式。 - user3437460
你不能这样做,除非使用子类可访问的方法或者仅仅改变变量的访问级别。 - IsaacDorenkamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接