Я понимаю, что с помощью частных модификаторов доступа по умолчанию и общего доступа можно использовать конструктор открытого класса.Использование модификатора защищенного доступа на конструкторе класса
Если конструктор является закрытым, объект класса может быть создан только в этом классе.
Если конструктор по умолчанию, объект класса может быть создан только в классах этого пакета.
Если конструктор является общедоступным, объект класса может быть создан в любом классе.
Я не понимаю, с защищенным конструктором. Пример:
По умолчанию Конструктор
package com.test;
public class PracticeParent {
PracticeParent(){ //Constructor with default access modifier
System.out.println("PracticeParent default constructor");
}
}
package com.moreTest;
import com.test.PracticeParent;
public class Test extends PracticeParent { //Error. Implicit super constructor PracticeParent() is not visible for default constructor. Must define an explicit constructor
public static void main(String[] args) {
PracticeParent pp=new PracticeParent(); //Error. The constructor PracticeParent() is not visible
}
}
Я понимаю эти ошибки. Поскольку класс ParentPractice находится в другом пакете, а его конструктор по умолчанию, он не отображается для конструктора по умолчанию класса Test, который вызывает super() неявно. Кроме того, его объект не может быть создан из-за отсутствия видимости конструктора.
Protected Конструктор
Но с классом Test простирающейся ParentPractice и ParentPractice защитив конструктор, не первая ошибка, т.е. ошибка в вызове супер() неявно из конструктора Test по умолчанию. Неявный суперструктор PracticeParent() отображается для конструктора по умолчанию для Test, но объект PracticeParent не может быть создан. Ошибка показывает, что конструктор PracticeParent() не отображается.
package com.test;
public class PracticeParent {
protected PracticeParent(){ //Constructor with protected access modifier
System.out.println("PracticeParent default constructor");
}
}
package com.moreTest;
import com.test.PracticeParent;
public class Test extends PracticeParent { //No Error
public static void main(String[] args) {
PracticeParent pp=new PracticeParent(); //Error. The constructor PracticeParent() is not visible
/*Test t=new Test(); outputs "PracticeParent default constructor"*/
}
}
Почему происходит вызов super(), но невозможно создать новый объект PracticeParent?
Это означает, что подкласс может использовать только защищенные свойства родительского класса, которые он наследует. Ни один класс вне этого подкласса не может использовать эти унаследованные свойства. Правильно? – Ashish
@Ashish 'protected' означает только сам класс, а классы, которые наследуют его, могут использовать этот метод или свойство. –
Защищенные свойства суперкласса, расширенные подклассом вне пакета, становятся неявными для этого подкласса. Это похоже на то, что подкласс имеет свои собственные частные свойства, и ни один другой класс не может получить доступ к этим свойствам, кроме этого подкласса. – Ashish