Спецификатор защищенного доступа, приводящий к непредвиденной ошибке времени компиляции в дочернем классе в Eclipse - PullRequest
0 голосов
/ 15 мая 2018
// This package and class are in ProtectedAccessSpecifierRnD.java file
package com.j2se.access_specifiers;
public class ProtectedAccessSpecifierRnD {
    protected int protectedIntVar;
    protected String protectedStrVar;
}

Я создаю другой файл, в котором расширяю этот класс для изучения свойств спецификатора защищенного доступа, как показано ниже: -

//This package and class are in ProtectedAccessSpecifierRnD2.java file

package com.j2se.access_specifiers_2;

import com.j2se.access_specifiers.ProtectedAccessSpecifierRnD;

public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{

    public static void main(String[] args) {
        ProtectedAccessSpecifierRnD obj = new ProtectedAccessSpecifierRnD();
/* Here on below line compile time error comes "The field ProtectedAccessSpecifierRnD.protectedStrVar & ProtectedAccessSpecifierRnD.protectedIntVar are not visible"*/
            System.out.println(obj.protectedIntVar+" "+obj.protectedStrVar);
        }
}

Теперь, насколько мне известно, защищенные члены (переменные и методы экземпляра) класса видимы для тех же классов пакетов, а также для других классов пакетов, которые наследуют вышеупомянутый класс.

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

Я очистил и перестроил проект, а также перезапустил затмение.

Буду признателен, если кто-нибудь сможет преодолеть разрыв в моих знаниях java / eclipse / oops, чего бы мне здесь не хватало. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018
ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
System.out.println(obj.protectedIntVar+" "+obj.protectedStrVar);

Это должно работать

0 голосов
/ 15 мая 2018

Ошибка компиляции верна, и я думаю, что вы просто упускаете небольшую точку!

protected модификатор доступа означает

  1. Если класс определен следующим образом:

    package com.j2se.access_specifiers;
    
    public class ProtectedAccessSpecifierRnD {
        protected int protectedIntVar;
        protected String protectedStrVar;
    }
    

все классы в одном пакете могут получить доступ к protected полям через свой объект явно без каких-либо методов установки или получения.

Все дочерние классы в других пакетах могут получить доступ к protected полям родительского класса в своем коде, например, в своих методах или конструкторе:

public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{

    public ProtectedAccessSpecifierRnD2() {
        protectedIntVar = 0;
        protectedStrVar = "Test";
    }
}

Но в своем коде вы создаете объект из родительского класса в коде дочернего класса, и это не должно работать с самого начала.

Вкратце:

Если какой-либо объект создан из вашего родительского класса, только классы в одном пакете могут получить к нему доступ через переменную объекта в явном виде.В других пакетах только дочерние классы могут получить доступ к этим полям protected родительского класса явно в своих методах или конструкторах.

Поскольку ProtectedAccessSpecifierRnD2 расширяет ProtectedAccessSpecifierRnD, он наследует не-приватные и не по умолчанию (без каких-либо модификаторов) поля ProtectedAccessSpecifierRnD.Тогда вы можете сказать, что ProtectedAccessSpecifierRnD2 имеет поля protectedIntVar и protectedStrVar как свои собственные, поэтому очевидно, что вы можете получить к ним доступ через объект из ProtectedAccessSpecifierRnD2, так как эти поля также являются полями ProtectedAccessSpecifierRnD2:

ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
System.out.println( obj.protectedIntVar + " " + obj.protectedStrVar );

Надеюсь, это поможет.

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