2015-07-23 3 views
2

Я понимаю, что с помощью частных модификаторов доступа по умолчанию и общего доступа можно использовать конструктор открытого класса.Использование модификатора защищенного доступа на конструкторе класса

Если конструктор является закрытым, объект класса может быть создан только в этом классе.

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

Если конструктор является общедоступным, объект класса может быть создан в любом классе.

Я не понимаю, с защищенным конструктором. Пример:

По умолчанию Конструктор

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?

ответ

1
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" 
     } 
    } 

Что вы делаете здесь есть Test расширить PracticeParent, а это означает, что Testсам может использовать защищенный конструктор, поскольку он наследует его.

PracticeParent pp=new PracticeParent();  //Error. The constructor 

Это просто обычные конкретизации и до сих пор использует или пытается использовать публичный конструктор, который не существует. Это приведет к тому же эффекту/результату, который был бы, если бы вы назвали его где-нибудь еще в своем приложении.

+0

Это означает, что подкласс может использовать только защищенные свойства родительского класса, которые он наследует. Ни один класс вне этого подкласса не может использовать эти унаследованные свойства. Правильно? – Ashish

+0

@Ashish 'protected' означает только сам класс, а классы, которые наследуют его, могут использовать этот метод или свойство. –

+0

Защищенные свойства суперкласса, расширенные подклассом вне пакета, становятся неявными для этого подкласса. Это похоже на то, что подкласс имеет свои собственные частные свойства, и ни один другой класс не может получить доступ к этим свойствам, кроме этого подкласса. – Ashish

Смежные вопросы