Java类构造函数问题

Java类构造函数问题,java,Java,构造函数的默认类型是什么,例如public/private/astract等 我们可以改变java中构造函数的类型吗 当我将构造函数创建为私有时,它不允许访问类为什么?是的,您可以在java中更改构造函数的类型。 默认情况下,构造函数不是公共的。对于具有默认访问修饰符的类,构造函数访问也是默认的。对于内部类,该类可以具有任何访问修饰符,因此构造函数也将具有相同的访问修饰符,除非我们定义具有不同访问修饰符的构造函数 如果是单身,则使用private。注意,如果这样做,则不能从类外部实例化该类 对于

构造函数的默认类型是什么,例如public/private/astract等

我们可以改变java中构造函数的类型吗


当我将构造函数创建为私有时,它不允许访问类为什么?

是的,您可以在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 A()
    -protected access意味着只有
    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;
        }
    }
    
  • A()
    -如果省略了访问修饰符(如public或private),则称为包私有。包私有构造函数只能由同一包中的类或该类的子类访问

您可能会发现:

|类|包|子类|世界
公共| 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忘记了那个案例…已编辑。