Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类'上使用受保护的访问修饰符;s构造函数_Java_Oop_Constructor_Access Modifiers_Modifier - Fatal编程技术网

Java 在类'上使用受保护的访问修饰符;s构造函数

Java 在类'上使用受保护的访问修饰符;s构造函数,java,oop,constructor,access-modifiers,modifier,Java,Oop,Constructor,Access Modifiers,Modifier,我很清楚在公共类的构造函数上使用private、default和public访问修饰符 如果构造函数是私有的,则只能在该类中创建类对象 如果构造函数是默认的,则只能在该包的类中创建类对象 如果构造函数是公共的,则可以在任何类中创建类对象 我对受保护的构造函数不清楚。例如: 默认构造函数 package com.test; public class PracticeParent { PracticeParent(){ //Constructor with default acc

我很清楚在公共类的构造函数上使用private、default和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()的测试类默认构造函数不可见。此外,由于构造函数的不可见性,无法创建其对象

受保护的构造函数

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,并且ParentPractice具有受保护的构造函数,所以没有第一个错误,即从测试的默认构造函数隐式调用super()时出错。隐式超级构造函数PracticeParent()对于测试的默认构造函数可见,但无法创建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
extend
PracticeParent
,这意味着
Test
本身可以使用受保护的构造函数,因为它继承了它

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

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

这意味着子类只能使用其继承的父类的受保护属性。该子类之外的任何类都不能使用这些继承属性。对吗?@Ashish
protected
仅表示类本身,从类继承的类可以使用该方法或属性。由包外部的子类扩展的超类的受保护属性对该子类是隐式的。就像子类有它自己的私有属性,除了这个子类之外,没有其他类可以访问这些属性。@亚希什是一个语句还是一个问题?你可以同时考虑这两个属性。讨论。