2014-11-02 2 views
0

Для защищенного модификатора доступа связанный с ним способ или атрибут должен быть видимым для его подкласса. Это согласно определению.модификатор доступа для защищенного метода

Но есть одна вещь, которую я не могу объяснить здесь. Например, мы имеем следующий код: класс Base:

package com.set.test; 

public class ModifierBase { 
    private int privateInt; 
    int friendlyInt; 
    protected int protectedInt; 
    public int publicInt; 

    private void displayPrivate(){ 
     System.out.println("displayPrivate"); 
    } 
    void displayFriendly(){ 
     System.out.println("displayFriendly"); 
    } 
    protected void displaoyProtected(){ 
     System.out.println("displaoyProtected"); 
    } 
    public void displayPublic(){ 
     System.out.println("displayPublic"); 
    } 
} 

И класс расширяет этот в другом пакете.

package com.another; 

import com.set.test.ModifierBase; 
public class ModifierSubPackgeExtend extends ModifierBase{ 
    public static void main(String[] args) { 
     ModifierSubPackgeExtend m = new ModifierSubPackgeExtend(); 
     ModifierBase mb = new ModifierSubPackgeExtend(); 
    } 
} 

m может получить доступ как к охраняемым, так и к общественным, это круто. Однако mb не может получить доступ к защищенному методу или переменной.

mb.protectedInt //is not accessable 
m.protectedInt //is accessible 

Почему это так?

Но для дружной, имеющих тот же пример:

package com.set.test; 
public class ModifierExtend extends ModifierBase { 
    public static void main(String[] args) { 
     ModifierExtend m = new ModifierExtend(); 
     ModifierBase mb = new ModifierExtend(); 
    } 
} 

Оба м и м.б. могут получить доступ к дружелюбному модификатор.

m.friendlyInt 
mb.friendlyInt 

Они оба прекрасные.

Почему при объявлении с базовым классом и инициализации подкласс имеет различный доступ к защищенным vs объявлять и инициализировать оба подкласса?

+0

Что именно вы пытаетесь достичь? Кроме того, у java нет «дружественного» модификатора. Это разрешение на уровне пакета. –

+0

У меня нет дружественного литерала в качестве ключевого слова. Я просто спрашиваю, почему объявить, что базовый класс имеет другой уровень доступа, сравнивается с объявлением в качестве подкласса. Почему поведение отличается от обычного доступа. –

+0

Нет дружественного доступа, только доступ на уровне пакета. И они находятся в разных пакетах. –

ответ

0

защищенные классы, функции и т. Д. Видны для вашего текущего класса, пакета и подпакетов. Также видны внутри подклассов вашего класса.

Публичные переменные - видимые для всех классов.

Защищенные переменные - видимы только для этих классов, к которым они принадлежат, и любых подклассов.

Дружественные переменные, по умолчанию - не нужны модификаторы, видимые для пакета.

Частные переменные - видны только классу, к которому они принадлежат.

для получения дополнительной информации вы можете прочитать этот документ: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

0

Защищенная переменная-член объявлена ​​в родительском классе, но не доступен из того же экземпляра.

В этом случае он не будет доступен, защищенные нестатические переменные могут быть доступны только из подкласса, если это касается одного и того же экземпляра.

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