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

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

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

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

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

Access Levels Modifier Class Package Subclass World public YYYY protected YYYN no modifier YYNN private YNNN 

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

那个部分

 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.子类使用该方法访问字段。

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

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

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

“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 } } 

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

 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()); } } 

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