частный метод в наследовании в 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, используя метод получения, я попробовал 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
Если они являются частными методами/экземплярами, то не должно быть причин вызывать этот метод вне его класса. Попытка сделать это - запах кода. Но, сказав, что вы всегда можете создать общедоступный геттер и сеттер в базовом классе для вызова частного метода... но тогда есть причина, по которой была изобретена инкапсуляция. - person Lews Therin; 19.10.2013

Здесь происходит две вещи.

Во-первых, имейте в виду различие между типом ссылки и типом объекта.

Когда ты говоришь

А = новый Б();

ссылка 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