Розніца паміж абараняемым выклікам метаду з аднолькавых і розных пакетаў

Па маім разуменні, абаронены метад можна атрымаць любы клас у тым жа пакеце, але толькі падкласы гэтага класа могуць атрымаць доступ з іншых пакетаў.

package Parent;

public class Parent {
    protected void display() {
    //Code here
    }

}
import Parent;

package Child;

class Child extends Parent{
    void view(Parent p1) {
        this.display();//Success
        p1.display(); //Error
    }

    void next(Parent p2) { 
        p2.foo(); //Success
    }
}   

Тут this.display() з'яўляецца паспяховым, паколькі даччыны клас адказвае за рэалізацыю. Але p1.display() не працуе p1 не з'яўляецца часткай Дзіця класа. Як мы можам апраўдаць такія паводзіны ў выпадку доступу да абароненых метадам з класаў у адным пакеце?

0
Абароненыя метады могуць быць даступныя падклас класа.
дададзена аўтар christopher, крыніца
Пакуль не ясна, што вы маеце на ўвазе. Вы здзіўлены паводзінамі, ці ж вы разумееце, што гэта тое, што кажа ў спецыфікацыі, і вы спрабуеце вызначыць прычыну гэтага?
дададзена аўтар Jon Skeet, крыніца

8 адказы

ваш

p1.display();

мае патэнцыял працуе метад, рэалізаваны ў любы ўпакоўцы, у залежнасці ад таго, якога менавіта Бацька падкласа вы атрымалі. Гэта было б відавочным парушэнне намеры за абараняецца </кодам>, які спецыяльна, каб класы, прызначаныя для пашырэння, каб забяспечыць інкапсуляваць метады іх дзецям.

Калі выклік быў дазволены, гэта было б трывіяльна проста для жуліка класа для доступу да інкапсуляванага метадам з класа цалкам чужога яму.

2
дададзена

ваш

p1.display();

мае патэнцыял працуе метад, рэалізаваны ў любы ўпакоўцы, у залежнасці ад таго, якога менавіта Бацька падкласа вы атрымалі. Гэта было б відавочным парушэнне намеры за абараняецца </кодам>, які спецыяльна, каб класы, прызначаныя для пашырэння, каб забяспечыць інкапсуляваць метады іх дзецям.

Калі выклік быў дазволены, гэта было б трывіяльна проста для жуліка класа для доступу да інкапсуляванага метадам з класа цалкам чужога яму.

2
дададзена

Прыклад вы Прадстаўленая выкліку метаду з выкарыстаннем асобніка Parent перадаецца дзіцяці. У спецыфікацыі паказваецца, што доступ да метаду поля або асобніка павінен быць з падкласа, калі аб'ём абаронены. Звярніце ўвагу на частку спецыфікацыі, якая заяўляе, доступ дазволены, калі і толькі калі тып выказвання Q ўяўляе S або падклас S . У вашым прыкладзе ExpressionName з'яўляецца p1, які з'яўляецца асобнікам Parent , што робіць яго тып не Дзіця або падклас Дзіця таму доступ забаронены ,

<�Р> Няхай З клас, у якім абвешчаны абаронены член. доступ   дазваляецца толькі ў межах цела падкласа S з C. </р>      <�Р> Акрамя таго, калі ідэнтыфікатар пазначае поле асобніка або метад асобніка, то: </р>      <�Р> Калі доступ ажыццяўляецца з дапамогай кваліфікаванага імя Q.Id, дзе Q ўяўляе сабой ExpressionName, то доступ дазволены, калі і толькі калі тып   выразы Q ўяўляе S або падклас S. </р>      <�Р> Калі доступ ажыццяўляецца з дапамогай выразы доступу поля E.Id, дзе Е ўяўляе сабой першаснае выраз, або з дапамогай выразы выкліку метаду E.Id (...),   дзе Е з'яўляецца першасным выразам, то доступ дазволены, калі і   толькі калі тып Е S або падклас S. </р>

Я думаю, што я бачу ў гэтым сэнсу вашай спробе зрабіць, так як Дзіця з'яўляецца падклас Parent , калі мы перадаем асобнік Parent у метад на Child мы павінны быць у стане назваць яго абароненыя метады. Правілы спецыфікацыі забараняюць гэта.

Спецыфікацыя

1
дададзена

Прыклад вы Прадстаўленая выкліку метаду з выкарыстаннем асобніка Parent перадаецца дзіцяці. У спецыфікацыі паказваецца, што доступ да метаду поля або асобніка павінен быць з падкласа, калі аб'ём абаронены. Звярніце ўвагу на частку спецыфікацыі, якая заяўляе, доступ дазволены, калі і толькі калі тып выказвання Q ўяўляе S або падклас S . У вашым прыкладзе ExpressionName з'яўляецца p1, які з'яўляецца асобнікам Parent , што робіць яго тып не Дзіця або падклас Дзіця таму доступ забаронены ,

<�Р> Няхай З клас, у якім абвешчаны абаронены член. доступ   дазваляецца толькі ў межах цела падкласа S з C. </р>      <�Р> Акрамя таго, калі ідэнтыфікатар пазначае поле асобніка або метад асобніка, то: </р>      <�Р> Калі доступ ажыццяўляецца з дапамогай кваліфікаванага імя Q.Id, дзе Q ўяўляе сабой ExpressionName, то доступ дазволены, калі і толькі калі тып   выразы Q ўяўляе S або падклас S. </р>      <�Р> Калі доступ ажыццяўляецца з дапамогай выразы доступу поля E.Id, дзе Е ўяўляе сабой першаснае выраз, або з дапамогай выразы выкліку метаду E.Id (...),   дзе Е з'яўляецца першасным выразам, то доступ дазволены, калі і   толькі калі тып Е S або падклас S. </р>

Я думаю, што я бачу ў гэтым сэнсу вашай спробе зрабіць, так як Дзіця з'яўляецца падклас Parent , калі мы перадаем асобнік Parent у метад на Child мы павінны быць у стане назваць яго абароненыя метады. Правілы спецыфікацыі забараняюць гэта.

Спецыфікацыя

1
дададзена

Прыклад вы Прадстаўленая выкліку метаду з выкарыстаннем асобніка Parent перадаецца дзіцяці. У спецыфікацыі паказваецца, што доступ да метаду поля або асобніка павінен быць з падкласа, калі аб'ём абаронены. Звярніце ўвагу на частку спецыфікацыі, якая заяўляе, доступ дазволены, калі і толькі калі тып выказвання Q ўяўляе S або падклас S . У вашым прыкладзе ExpressionName з'яўляецца p1, які з'яўляецца асобнікам Parent , што робіць яго тып не Дзіця або падклас Дзіця таму доступ забаронены ,

<�Р> Няхай З клас, у якім абвешчаны абаронены член. доступ   дазваляецца толькі ў межах цела падкласа S з C. </р>      <�Р> Акрамя таго, калі ідэнтыфікатар пазначае поле асобніка або метад асобніка, то: </р>      <�Р> Калі доступ ажыццяўляецца з дапамогай кваліфікаванага імя Q.Id, дзе Q ўяўляе сабой ExpressionName, то доступ дазволены, калі і толькі калі тып   выразы Q ўяўляе S або падклас S. </р>      <�Р> Калі доступ ажыццяўляецца з дапамогай выразы доступу поля E.Id, дзе Е ўяўляе сабой першаснае выраз, або з дапамогай выразы выкліку метаду E.Id (...),   дзе Е з'яўляецца першасным выразам, то доступ дазволены, калі і   толькі калі тып Е S або падклас S. </р>

Я думаю, што я бачу ў гэтым сэнсу вашай спробе зрабіць, так як Дзіця з'яўляецца падклас Parent , калі мы перадаем асобнік Parent у метад на Child мы павінны быць у стане назваць яго абароненыя метады. Правілы спецыфікацыі забараняюць гэта.

Спецыфікацыя

1
дададзена

Калі вы карыстаецеся super.display() ён будзе працаваць. Прычына заключаецца ў тым, што абаронены метады аднаго з бацькоў заўсёды бачныя для даччыных класаў, ці з'яўляюцца яны ў адным пакеце ці не. Калі вы проста кажаце p1.display() ён чакае, што метад быць публічным, бо абодва класа знаходзяцца ў іншым пакеце.

Калі ласка, прачытайце наступнае, каб атрымаць больш разумення па гэтым пытанні.

У Java, розніца паміж змаўчанні грамадскасці, абароненай і прыватныя

1
дададзена

Калі вы карыстаецеся super.display() ён будзе працаваць. Прычына заключаецца ў тым, што абаронены метады аднаго з бацькоў заўсёды бачныя для даччыных класаў, ці з'яўляюцца яны ў адным пакеце ці не. Калі вы проста кажаце p1.display() ён чакае, што метад быць публічным, бо абодва класа знаходзяцца ў іншым пакеце.

Калі ласка, прачытайце наступнае, каб атрымаць больш разумення па гэтым пытанні.

У Java, розніца паміж змаўчанні грамадскасці, абароненай і прыватныя

1
дададзена

Калі вы карыстаецеся super.display() ён будзе працаваць. Прычына заключаецца ў тым, што абаронены метады аднаго з бацькоў заўсёды бачныя для даччыных класаў, ці з'яўляюцца яны ў адным пакеце ці не. Калі вы проста кажаце p1.display() ён чакае, што метад быць публічным, бо абодва класа знаходзяцца ў іншым пакеце.

Калі ласка, прачытайце наступнае, каб атрымаць больш разумення па гэтым пытанні.

У Java, розніца паміж змаўчанні грамадскасці, абароненай і прыватныя

1
дададзена