Внутренний класс Java и наследование - PullRequest
7 голосов
/ 19 августа 2011

Я сейчас читаю Thinking In Java и столкнулся с одной маленькой проблемой. Я делаю упражнение 12 из главы 8.

Создайте интерфейс хотя бы с одним методом в своем собственном пакете. Создайте класс в отдельном пакете. Добавьте защищенный внутренний класс, который реализует интерфейс. В третьем> пакете, наследуйте от своего класса и, внутри метода, верните объект защищенного> внутреннего класса, передавая данные в интерфейс во время возврата.

Итак, я создал эти файлы .java:

A.java

    package c08;
    public interface A
    {
        void one();
    }

Pr2.java

    package c082;
    import c08.*;
    public class Pr2 
    {
        protected class InPr2 implements A
        {
           public void one() {System.out.println("Pr2.InPr2.one");}
           protected InPr2() {}
        }
    }

Ex.java

    package c083;
    import c082.*;
    import c08.*;
    class Cl extends Pr2
    {
        A foo() 
        {
            InPr2 bar=new InPr2();
            return bar;
        } 
    }

И моя среда IDE NetBeans подчеркивает

    InPr2();

и говорит, что: InPr2 () имеет защищенный доступ в C082.Pr2.InPr2, и мне интересно, почему. Если бы я не указал явно, что конструктор в InPr2 должен быть защищен, он был бы доступен только в пакете C082, но когда я наследую класс Pr2, не должен ли он быть доступен в классе Cl, потому что InPr2 защищен? Все нормально, когда я меняю конструктор на public.

Ответы [ 6 ]

4 голосов
/ 19 августа 2011

Конструктор InPr2 защищен, это означает, что его могут вызывать только классы, наследуемые от InPr2 ( не Pr2). Классы, которые наследуются от Pr2, могут видеть класс Pr2, но они не могут вызывать его защищенные члены, как защищенный конструктор.

2 голосов
/ 19 августа 2011

Он должен работать так же хорошо, как у вас, за исключением изменения protected InPr2() {} на public InPr2() { }. Другими словами: «Каждый может создать экземпляр этого класса, ЕСЛИ он увидит этот класс для начала».

1 голос
/ 19 августа 2011

Даже если класс InPr2 доступен в Cl, его конструктор не . Защищенный конструктор доступен только для подклассов и классов в одном пакете.

0 голосов
/ 06 декабря 2013

Переменные защищенного члена, методы и конструкторы не доступны вне пакета, если они не наследуются. Когда мы пытаемся создать объект InPr2, компилятор выдаст ошибку, так как защищенный конструктор недоступен за пределами пакета. Создание объекта зависит также от модификатора доступа Конструктора.

Вы можете сделать одну вещь: InPr2 может быть унаследован внутри класса C.

0 голосов
/ 07 августа 2013

ни один класс в Java не может быть защищен.

0 голосов
/ 19 августа 2011

Изменение:

Pr2.java

package c082;
import c08.*;
public class Pr2 
{
    protected class InPr2 implements A
    {
       public void one() {System.out.println("Pr2.InPr2.one");}
       // This constructor was available only
       // to a class inheriting form Pr2.InPr2 - protected InPr2() {}
       public InPr2() {}
    }
}

Конструктор из Pr2.InPr2 был просто доступен для класса, если он расширен Pr2.InPr2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...