从超类(JAVA)访问私有变量

时间:2013-11-07 17:48:23

标签: java inheritance

好的,所以我在整个学期学习了java,并认为我对继承和超级/子类有了清晰的认识。今天我们被赋予了作为一个叫做敌人的超类的任务,包括不同类型的敌人的子类。我做的一切都很好,我的所有子类都在工作,但当我回去阅读我们必须遵循的指导原则时,我发现了这句话:

  

“超类的所有成员变量必须是私有的。对变量的任何访问都必须通过子类中的受保护方法来完成。”

据我所知,这对我来说毫无意义。如果变量在超类中是私有的,那么即使从子类中也不允许访问?讨论子类中受保护方法的最后一部分对我来说也没有任何意义。这对超类有什么帮助和/或允许任何访问?

从我对继承的了解,以下是我的想法:

                Access Levels
 Modifier    Class  Package Subclass    World
 public        Y      Y        Y        Y
 protected     Y      Y        Y        N
 no modifier   Y      Y        N        N
 private       Y      N        N        N

如果我在这里理解错误,请解释一下!如果我不是正确理解的话,我不想面对教师给我们错误的指示!

6 个答案:

答案 0 :(得分:17)

部分

Any access to an a variable must be done through protected methods in the sub classes.

...只是意味着子类必须调用超类中定义的受保护方法。由于这些方法受到保护,因此子类可以访问它们。

首先,你要定义一个这样的基类:

public class Base {

    private int x;  // field is private

    protected int getX() {  // define getter
        return x;
    }

    protected void setX(int x) {  // define setter
        this.x = x;
    }
}

然后你会在你的子类中使用它:

class Child extends Base{

    void foo() {
        int x = getX(); // we can access the method since it is protected.
        setX(42);  // this works too.
    }
}

答案 1 :(得分:2)

根据我的理解,这句话的措辞可能不正确,这对我来说是完全合理的:
1.超类具有私有字段和受保护的方法来访问它们 2.子类使用该方法访问字段。

答案 2 :(得分:2)

这些只是赋值的约束,而不是Java本身。您可以为超类提供受保护的数据成员,然后直接从子类访问这些成员。但是,教授可能希望教你如何保护超类可以保护其数据成员免受子类的直接访问,受保护的方法将是一种方法。

答案 3 :(得分:2)

当您继承其他类时,您无法直接访问您的私有属性。因此,如果你有一个名为“A”的类和其他名为“B”的类,并且使B扩展为A,则B不能访问A的私有属性。

认为这就像一种保护。这样,您可以在类“A”中编写一些您不希望其他类通过继承访问它的属性。

“B”类可以直接在“A”类中访问public,protected和default属性。但是,如果您出于任何原因想要访问“A”类中的私有属性,可以在“A”中编写一个方法来返回此属性。

public class A{
    private int foo;
    public int getFoo(){
       return this.foo;
    }
}

public class B extends A{
    public void doSomething(){
       getFoo(); //return the private foo attribute of superclass
    }
}

答案 4 :(得分:1)

你的想法是正确的,从字面上讲,你无法访问超类的私人领域。您的作业文本使用的措辞不是100%严格,但在Java用语中是100%习惯:所谓的“getter”方法,也称为“访问者”方法,被视为“访问字段”,即使严格地说,它们只是返回字段的当前值 - 这与访问字段本身绝对不同。您只需要习惯Java行话中的这个(以及更多)约定。

答案 5 :(得分:1)

package com.action.product;

public class ProductAction{
  public static String strCategoryName;

  public String getStrCategoryName() {
    return strCategoryName;
  }
  public void setStrCategoryName(String strCategoryName) {
    this.strCategoryName = strCategoryName;
  }

}

-----------------------------------------------------------------------

package com.DAO.product;

public class ProductDAO extends ProductAction {

   @SuppressWarnings("static-access")
   public String addnewProductValidation(){
       System.out.println("======through_name======="+super.strCategoryName);

       System.out.println("======through_getters======="+super.getStrCategoryName());

   }
}

可以将变量初始化为静态。无需创建对象