在 Class 的构造函数上使用受保护的访问修饰符
Protected access modifier use on Class's Constructor
我很清楚在 public class 的构造函数中使用私有、默认和 public 访问修饰符。
如果构造函数是私有的,则 class 对象只能在 class 中创建。
如果构造函数是默认的,则 class 对象只能在该包的 classes 中创建。
如果构造函数是public,class对象可以在任何class中创建。
我不清楚受保护的构造函数。示例:
默认构造函数
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 class 在其他包中并且其构造函数是默认的,因此它对隐式调用 super() 的 Test class 默认构造函数不可见。此外,由于构造函数不可见,无法创建其对象。
受保护的构造函数
但是 class Test extending 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对象?
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
这只是一个常规实例化,并且仍在使用或尝试使用不存在的 public 构造函数。如果您在应用程序的其他任何地方调用它,它将产生相同的 effect/result。
我很清楚在 public class 的构造函数中使用私有、默认和 public 访问修饰符。
如果构造函数是私有的,则 class 对象只能在 class 中创建。
如果构造函数是默认的,则 class 对象只能在该包的 classes 中创建。
如果构造函数是public,class对象可以在任何class中创建。
我不清楚受保护的构造函数。示例:
默认构造函数
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 class 在其他包中并且其构造函数是默认的,因此它对隐式调用 super() 的 Test class 默认构造函数不可见。此外,由于构造函数不可见,无法创建其对象。
受保护的构造函数
但是 class Test extending 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对象?
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
这只是一个常规实例化,并且仍在使用或尝试使用不存在的 public 构造函数。如果您在应用程序的其他任何地方调用它,它将产生相同的 effect/result。