1、若一个类中只有私有构造方法,这个类不能被继承或直接创建实例。
package privateConstructionMethod;
public class Fu {
private Fu(){
}
private void method(){
System.out.println("我是父类private方法");
}
public void method1(){
System.out.println("我是父类public方法");
}
}
package privateConstructionMethod;
public class Zi extends Fu{
}
上面操作会报错:There is no default constructor available in 'privateConstructionMethod.Fu'
2、解决办法:在该类中调用该构造方法创建实例后将堆地址返回,再由另一个类的相应引用类型(类似指针)接收这个实例。
private Fu(){
//私有构造方法
}
public static Fu createInstance(){
//在本类中创建自己的实例
return new Fu();
}
package privateConstructionMethod;
public class Zi{
public static void main(String[] args){
Fu f = Fu.createInstance();
f.method1();
}
}
注意!!!createInstance方法要声明为静态(static),这样才能被类名直接调用。
输出:我是父类public方法
3、在Fu类中加上默认的public构造方法后,此类可以被继承。但在Zi类中super也不能调用Fu的私有构造方法。
public Fu(){
//默认构造方法
}
private Fu(String mass){
//私有构造方法
System.out.println(mass);
}
public class Zi extends Fu{
public Zi(){
super("调用私有的有参构造方法");
}
...
这将会报错:'Fu(java.lang.String)' has private access in 'privateConstructionMethod.Fu'
4、补充:private方法用super也不能调用
public class Zi extends Fu{
public void test(){
//注意:非静态方法不能在静态方法中直接调用,可以通过实例在静态方法中调用
super.method1();//public方法
super.method();//private方法只在该类可见
}
}
会报错:'method()' has private access in 'privateConstructionMethod.Fu'