受保护的访问修饰符用于Class的构造函数

时间:2015-07-23 19:30:30

标签: java oop constructor access-modifiers modifier

我很清楚在公共类的构造函数上使用私有,默认和公共访问修饰符。

如果构造函数是私有的,则只能在该类中创建类对象。

如果构造函数是默认的,则只能在该包的类中创建类对象。

如果构造函数是public,则可以在任何类中创建类对象。

我不清楚使用受保护的构造函数。例如:

默认构造函数

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类在其他包中,并且其构造函数是默认的,因此对于默认调用super()的Test类默认构造函数不可见。此外,由于构造函数不可见,因此无法创建其对象。

受保护的构造函数

但是使用类Test延伸ParentPractice和ParentPractice具有受保护的构造函数,没有第一个错误,即从Test的默认构造函数隐式调用super()时出错。隐式超级构造函数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 个答案:

答案 0 :(得分: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 

这只是一个常规实例化,仍然使用或尝试使用不存在的公共构造函数。它将产生与在应用程序中的其他位置调用它时相同的效果/结果。