Java类构造函数问题
构造函数的默认类型是什么,例如public/private/astract等 我们可以改变java中构造函数的类型吗Java类构造函数问题,java,Java,构造函数的默认类型是什么,例如public/private/astract等 我们可以改变java中构造函数的类型吗 当我将构造函数创建为私有时,它不允许访问类为什么?是的,您可以在java中更改构造函数的类型。 默认情况下,构造函数不是公共的。对于具有默认访问修饰符的类,构造函数访问也是默认的。对于内部类,该类可以具有任何访问修饰符,因此构造函数也将具有相同的访问修饰符,除非我们定义具有不同访问修饰符的构造函数 如果是单身,则使用private。注意,如果这样做,则不能从类外部实例化该类 对于
当我将构造函数创建为私有时,它不允许访问类为什么?是的,您可以在java中更改构造函数的类型。
默认情况下,构造函数不是公共的。对于具有默认访问修饰符的类,构造函数访问也是默认的。对于内部类,该类可以具有任何访问修饰符,因此构造函数也将具有相同的访问修饰符,除非我们定义具有不同访问修饰符的构造函数 如果是单身,则使用private。注意,如果这样做,则不能从类外部实例化该类 对于私有构造函数,您可以执行类似于单例的操作
public class Foo {
private Foo foo;
private Foo(){} // default you may not see it in the editor but is provided by complier
public static Foo getInstance(){
if(foo==null)
foo=new Foo();
return foo;
}
}
什么是默认的构造函数类型,例如公共/私有/astract等? 对于
默认构造函数
而言,它取决于类的可访问性,如果使用public
声明类,则默认构造函数将为public,如果声明类受保护,则默认构造函数将受保护。当我将构造函数创建为私有时,它不允许访问类为什么?
因为构造函数在类外不可见。如果只有一个构造函数且它是私有的,则表示没有人可以创建类的对象。但是有一种方法可以获取类的对象,即使用单音
public class Foo {
private static Foo foo;
private Foo() { }
public static Foo getInstance() {
if (foo == null) {
foo = new Foo();
}
return foo;
}
}
您可以通过以下方式定义构造函数:
-这意味着其他每个类都可以创建一个public A()
实例A
-protected access意味着只有protected A()
实例或其子类才能访问它,但前提是该子类涉及其父类的实现李>A
-这意味着除了private A()
本身和嵌套或封装类之外,没有其他类可以调用构造函数。它通常用于创建单例;使用静态方法创建对象:A
public class A { private static A instance; // Make constructor private private A() { } public static A getInstance() { // Create an instance if it is not yet created. if (A.instance == null) { A.instance = new A(); } return A.instance; } }
-如果省略了访问修饰符(如public或private),则称为包私有。包私有构造函数只能由同一包中的类或该类的子类访问A()
|类|包|子类|世界
公共| Y | Y | Y
受保护的| Y | Y | Y | N
无修饰语| Y | Y | N | N
私人的
请注意,无修饰符表示不声明修饰符,即省略它。如果编写的构造函数没有访问修饰符:
public class MyClass {
MyClass (int param) {
// constructor code
}
}
然后可访问性是包私有的,与没有访问修饰符的任何方法的可访问性相同。(:“未声明访问修饰符的类成员或构造函数隐式具有包访问权限。”)因此这是构造函数的默认“类型”(实际上是默认的可访问性)。在本例中,包私有构造函数意味着您可以从同一包中的类使用newmyclass(10)
,但不能在包外使用
您可以像使用任何其他方法一样添加辅助功能修饰符:public
、private
或protected
。但是,根据,您不能使用其他修饰符,例如abstract
如果将其设置为私有,则构造函数不能在类外部使用(对于嵌套类,不能在包含它的顶级类外部使用),但可以在类内部使用。这意味着您的类可以定义一个静态工厂方法,该方法实际上不是构造函数,但用于构造类的对象:
public class MyClass {
private MyClass(int param) { ... }
public static MyClass CreateObject(String something) {
// stuff
return new MyClass(n);
}
}
singleton类也使用类似的习惯用法,其中一个方法像工厂方法一样返回类的实例,但也确保只创建一个实例
私有构造函数也可由其他构造函数使用:
public class MyClass {
private MyClass(boolean isString, String stringParam, int intParam) {
// stuff
}
public MyClass(String stringParam) {
this(true, stringParam, -1);
}
public MyClass(int intParam) {
this(false, null, intParam);
}
}
如果您声明了一个
private
构造函数,并且在类中的任何地方都不使用它,那么这是一个惯用法,通常用于定义一个类,其唯一目的是提供静态实用程序方法。您可以调用静态方法,但不能创建类的实例。您认为“私有”是什么意思?私有是指类的访问修饰符。但是当我们创建参数化构造函数时,我们从类外部调用该构造函数。@Altmish当您创建构造函数时,访问修饰符的类型取决于您(公共/私人/等)您要应用。默认情况下,构造函数不是公共的。对于具有默认访问修饰符的类,构造函数访问也是默认的。对于内部类,该类可以具有任何访问修饰符,因此构造函数也将具有相同的访问修饰符,除非我们使用不同的访问修饰符定义构造函数。我们的第一句话不是qui准确。如果你有一个构造函数并且它是私有的,那么外部类就不能创建该类的对象。但是一个类可以有多个构造函数,其中一个是私有的,其他的调用它。ajb我已经更新了我的帖子Thanks这实际上并不完全正确。如果类a
嵌套在另一个类 B
,B可以创建A
的实例,即使A
的所有构造函数都是私有的。@IngoBürk这是正确的;感谢您的注意。我已经更新了答案。另外,这里:私有构造函数可以在该类之外使用,如果它是嵌套类。@IngoBürk忘记了那个案例…已编辑。