частен метод при наследяване в Java

Имам объркване относно използването на частни методи в наследяването, например:

public class A {
    private void say(int number){
        System.out.print("A:"+number);

    }
}

public class B extends A{
    public void say(int number){
        System.out.print("Over:"+number);
    }
}

public class Tester {
    public static void main(String[] args) {

        A a=new B();
        a.say(12);

    }
}

Въз основа на кодовете по-горе, объркан съм относно наследяването на частния метод, частният метод наследен ли е от class A до B? Или методите say в двата класа са напълно несвързани? Тъй като кодът има грешка, когато се изпълнява в метод main(), изглежда, че class B не може да извика частния метод от class A.


person pei wang    schedule 19.10.2013    source източник
comment
Не можете да замените частните методи.   -  person Kanagaraj M    schedule 19.10.2013
comment
защитените методи се наследяват. частните методи не се наследяват. A няма публичен say() метод, следователно тази програма не трябва да се компилира. Ако го принудите с ((B)a).say(12), тогава ще стане.   -  person Apprentice Queue    schedule 19.10.2013


Отговори (6)


Ако искате подклас да има достъп до метод на суперклас, който трябва да остане private, тогава protected е ключовата дума, която търсите.

  • Private позволява достъп само на класа, съдържащ члена.
  • Protected позволява членът да бъде достъпен в рамките на класа и всичките му подкласове.
  • Public позволява на всеки да има достъп до члена.
person nhgrif    schedule 19.10.2013
comment
благодаря за отговора, сега разбирам, че protected е решението, ако трябва да остана частен в подклас, но когато имаме частен екземпляр в суперклас, можем да използваме метода getter, за да го извикаме в подкласа, защо частният метод не може да направи същия начин? - person pei wang; 19.10.2013
comment
Ако имате private член, който има protected или public метод за получаване, инструментът за получаване може да се използва за достъп до метода private. Защо? Тъй като гетерът има protected или public видимост. - person nhgrif; 19.10.2013
comment
Но за горните кодове не можах да генерирам методи Getter и Setter за клас A, тъй като няма частен екземпляр - person pei wang; 19.10.2013
comment
Обикновено getter и setter се отнасят за публични методи, които позволяват достъп до частни променливи. В този случай имате метод private. Ако искате да извикате този метод, можете да направите две неща. Можете да промените видимостта на метода на protected или public, или можете да направите нещо подобно на getter, като това: public void getSayMethod(int someNum) { say(someNum); } За мен няма смисъл... но можете да го направите. - person nhgrif; 19.10.2013
comment
Здравей nhgrif, използвайки метода getter, опитах A.a=new A(); и A.a=нов B(); и двамата отпечатват, A:12. Това означава ли, че независимо кой обект използвам (нов A или нов B), той винаги отпечатва едно и също нещо - person pei wang; 19.10.2013
comment
Опитайте B b = new B(); b.say(12);. Също така опитайте по-описателни имена на класове и променливи. - person nhgrif; 19.10.2013

Причината да получавате грешката е, че say(int) е лично. Това няма нищо общо с наследството. Можете да извикате частен метод член само в неговия клас на дефиниция.

За да отговоря на въпроса ви за наследяването, B.say() е различен метод - той дори не е отменящ метод A.say(), тъй като производните класове не могат да наследяват частни методи от своя базов клас. Само protected и public методи/променливи могат да бъдат наследени и/или заменени.

person Lews Therin    schedule 19.10.2013
comment
Здравей Люс, благодаря ти за отговора, мисля, че ако имаме частни екземпляри в суперклас, можем да използваме метода getter, за да го извикаме в неговия подклас, така че ако имаме частни методи в суперклас, има ли някакво решение да ги извикаме в подкласа? - person pei wang; 19.10.2013
comment
Подкласовете имат достъп до protected и public членове. Можете да създадете private променлива с public или protected сетер и получател, които подкласовете могат да използват за достъп до private променливата. - person nhgrif; 19.10.2013
comment
Ако те са частни методи/инстанции, тогава не трябва да има причина този метод да се извиква извън неговия клас. Опитвайки се да го направя, това е кодова миризма. Но след като казахте, че винаги можете да създадете публичен getter и setter в базовия клас, за да извикате частния метод.. но тогава има причина, поради която е измислено капсулирането. - person Lews Therin; 19.10.2013

Тук се случват две неща.

Първо, имайте предвид разликата между типа на препратката и типа на обекта.

Когато кажеш

A a = нов B();

препратката е a от тип A, но обектът е от тип B. Така че, когато извикате a.say(12);, вие гледате B от A API/интерфейс/перспектива.

Второ, тъй като разглеждате B от гледна точка на A, ще получите грешка, защото A няма публичен метод, наречен say(). Разбира се, B го прави, но не забравяйте, че третирате B като A. Когато направите това, вие губите всякаква способност (освен ако не кастнете по-късно, но не се тревожете за това засега) да препращате към онези B методи, за които A не знае.

В крайна сметка B всъщност никога не наследява say() от A, тъй като не може да го види на първо място, а A няма публичен метод say(), до който всеки да има достъп.

Сега, ако искате наистина да се забавлявате, направете say() защитено в A и частно в B и вижте какво ще се случи.

person Vidya    schedule 19.10.2013
comment
Тъй като say() тук е метод на екземпляр, не трябва ли A a = new B(); извикване на метода say() в B поради полиморфизъм (късно свързване)? - person Hello World; 19.07.2020

Частен означава, че имате достъп до него само в този клас и никъде другаде.

person Ducksauce88    schedule 19.10.2013

Подкласовете могат да извикват или заместват само protected или public методи (или методи без модификатори за достъп, ако суперкласът е в същия пакет) от своите суперкласове. Методите private остават в класа, в който са декларирани, и не са видими за никой друг клас, независимо как е свързан.

person Josh    schedule 19.10.2013

Частните методи се наследяват в подклас, което означава, че частните методи са налични в дъщерен клас, но не са достъпни от дъщерен клас, защото тук трябва да помним концепцията за наличност и достъпност.

person Incredible 1710    schedule 30.08.2020