9

好的,所以我整个学期都在学习 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

如果我在这里理解错误,请解释!如果我是一个没有正确理解的人,我不想就给我们错误的指导而与导师对质!

4

6 回答 6

18

那个部分

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.
    }
}
于 2013-11-07T17:52:34.213 回答
2

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

于 2013-11-07T17:53:33.947 回答
2

可能这句话的措辞不正确,据我所知,这对我来说很有意义:
1. 超类有私有字段和受保护的方法来访问它们
2. 子类使用这些方法访问这些字段。

于 2013-11-07T17:52:16.643 回答
2

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

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

“B”类只能直接访问“A”类中的公共、受保护和默认属性。但是,如果您出于任何原因想要访问“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
    }
}
于 2013-11-07T18:04:15.790 回答
1

您的想法是对的,从字面上看,您无法访问超类的私有字段。您的作业文本使用的措辞不是 100% 严格,但在 Java 用语中是 100% 惯用的:所谓的“getter”方法,也称为“accessor”方法,被视为“访问字段”,即使,严格来说,它们只是返回字段的当前值——这绝对不同于授予对字段本身的访问权限。您只需要习惯 Java 行话中的这个(以及更多)约定。

于 2013-11-07T17:57:38.110 回答
0
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());

   }
}

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

于 2014-02-12T06:55:21.023 回答