2013-11-07 4 views
8

Хорошо, поэтому я изучил весь Java-курс Java и подумал, что у меня есть четкое представление о наследовании и супер/подклассах. Сегодня нам дали назначение для создания суперкласса, называемого врагом, с подклассами разных типов врагов. Я сделал все в порядке, и все мои подклассов работают, но когда я вернулся, чтобы прочитать руководящие принципы, мы должны следовать, я нашел это предложение:.Доступ к частной переменной из суперкласса (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 

Если я понять что-то здесь пожалуйста объяснить! Я не хочу противостоять инструктору о том, чтобы дать нам ошибочные инструкции, если я тот, кто не понимает это правильно!

+2

Вы правы, однако - эти инструкции плохо сформулированы. Похоже, вас просят получить доступ к приватным переменным через «методы защиты» [определенные] в подклассах », тогда как на самом деле это означает« методы защиты »[называемые] в подклассах». – yshavit

ответ

16

Часть

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. 
    } 
} 
+0

Хорошо, это имеет смысл для меня, спасибо. – NerdsRaisedHand

2

Вероятно, предложение не сформулировано правильно, от того, что я понимаю, что это имеет смысл для меня:
1. суперкласс имеет закрытые поля и защищенные методы доступа к ним
2. подклассы доступ к полям, используя которые методы.

2

Это просто ограничения уступки, не Сама Java. Вы можете предоставить членам данных, защищенным суперклассами, а затем получить доступ к ним непосредственно из подкласса. Тем не менее, профессор, вероятно, хочет научить вас, как суперкласс может защитить своих членов данных от прямого доступа подкласса, и защищенные методы могли бы это сделать.

1

Вы правы в своем мышлении, что, в буквальном смысле, вы не можете получить доступ к частному полю суперкласса. В тексте вашего задания используется формулировка, которая не является 100% строкой, но на уровне 100% обычна в языке Java: так называемые методы «getter», также называемые «аксессуар», рассматриваются как «доступ к полю», хотя , строго говоря, они просто возвращают текущее значение поля —, что определенно не то же самое, что дает доступ к самому полю. Вам просто нужно привыкнуть к этим (и многим другим) соглашениям на Java-жаргоне.

2

Когда вы наследуете другой класс, вы не можете напрямую обращаться к своим приватным атрибутам.Итак, если у вас есть класс под названием «A» и другой, называемый «B», и сделать B extends 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 
    } 
} 
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()); 

    } 
} 

инициализировать переменные как статические. Нет необходимости создавать объект

Смежные вопросы