Использование спецификатора частного доступа в наследовании Java - PullRequest
0 голосов
/ 05 февраля 2012

Мы можем получить доступ к методам Суперкласса, который состоит из операций над частными элементами данных и распечатать результаты. Но почему я не могу распечатать частные элементы данных Суперкласса с помощью объекта SubClass, вызывающего их в моей основной функции?Кто-нибудь, пожалуйста, объясните мне.

Вот пример ниже.

class SuperClass1
{
    private int a;
    private int b;

    SuperClass1(int p,int q)
    {
        a=p;
        b=q;
    }
    SuperClass1(SuperClass1 obj)
    {
        a=obj.a;
        b=obj.b;
    }
    SuperClass1()
    {
        a=-1;
        b=-1;
    }

    int Vol()
    {
        return a*b;
    }
}

class SubClass1 extends SuperClass1
{
    int c;

    SubClass1(int p,int q,int r)
    {
        super(p,q);
        c=r;
    }
    SubClass1(SubClass1 obj)
    {
        super(obj);
        c=obj.c;
    }
    SubClass1()
    {
        super();
        c=-1;
    }
}


public class Super 
{
    public static void main(String[] args) 
    {
        SubClass1 obj1=new SubClass1();
        //System.out.println("The values of obj1 are:"+obj1.a+""+obj1.b+""+obj1.c);
        int vol=obj1.Vol();
        System.out.println("The volume is :"+vol);
    }
}

Ответы [ 4 ]

2 голосов
/ 05 февраля 2012

безопасность и инкапсуляция

Суперкласс позволяет своим подклассам использовать только открытые и защищенные методы / поля.

Это позволяет разработчику суперкласса изменять реализацию этих методов, если он видит это лучше, без нарушения правильности подкласса.

Пример учебника - комплексное число класс.
Программисту, использующему этот класс, нужна только его функциональность, ему все равно, имеет ли реализация поля imaginary и real или с полями radius и theta [два разныхспособы представления комплексного числа.

Это дает разработчику класса ComplexNumber больше свободы, если он хочет изменить класс в более поздних версиях, а также позволяет пользователю меньше беспокоиться: ему не нужно заботиться обо всех деталяхо некоторых позаботятся о нем.

Бонус : обратите внимание, что вы можете нарушить это поведение и получить доступ к закрытым полям и методам, используя reflection - но когдатак что все ставки сняты, и вы делаете это под свою ответственность.

1 голос
/ 05 февраля 2012

Ваш вопрос не очень ясен без примера, но я подозреваю, что "методы, которые состоят из операций над частными элементами данных" , не частные. Неважно, что они работают , получая доступ к частным данным - сами они не являются частными. Было бы довольно бессмысленно иметь модификаторы доступа, если бы общедоступные методы могли обращаться только к другим публичным членам и т. Д.

Весь смысл инкапсуляции заключается в том, что только сам класс должен заботиться о деталях реализации, таких как рассматриваемые поля, но может предоставлять контракт с точки зрения его открытого (и защищенного) API. Код за пределами класса не должен заботиться о деталях частной реализации.

0 голосов
/ 05 февраля 2012

Частные участники не наследуются; только защищенные и публичные члены.

Если возможно, вы можете выполнить одно из следующих действий:

  1. Сделать частные свойства суперкласса защищенными
  2. Сделать открытыми получателями (и установщиками, если необходимо) для частных свойств
0 голосов
/ 05 февраля 2012

JLS говорит:

Члены класса, которые объявлены закрытыми, не наследуются подклассы этого класса. Только члены класса, которые объявлены Защищенные или публичные наследуются подклассами, объявленными в пакете кроме того, в котором объявлен класс.

Итак, чтобы ответить на ваш вопрос. Нет, частные члены не доступны для подклассов.

...