-2

我们都知道我们不能创建具有私有构造函数的类的对象。所以问题是这个类可以创建多少个实例。请在下面找到示例代码。

public class Test
{
    public int val ;
    private Test(int sent)
    {
        val=val +sent;
    }
    public static void Callme(int  GetVal)
    {
        Test obj=new Test(GetVal);
        Console.WriteLine(obj.val);
    }
}
public class Program
{
    public static void Main()
    {       
        Test.Callme(10);
        //Console.WriteLine(Test.val);
        Test.Callme(20);
        //Console.WriteLine(Test.val);
    }
}

据我所知,它应该创建该类的 2 个对象。需要帮助理解这一点。

4

4 回答 4

4

我们都知道我们不能创建具有私有构造函数的类的对象。

嗯,这不准确。您可以通过使用该类的静态成员来创建仅具有私有构造函数的类的对象(实例),就像在问题中的代码中一样。
您不能做的是从代码中的其他任何地方创建该类的实例。

这个类可以创建多少个实例

在您的代码示例中,有两个 class 实例Test

我认为您可能会感到困惑的是您希望第二个Console.WriteLine打印30,但它打印了20。那是因为public int val ;是实例成员。如果它是静态成员,那么它会打印30

于 2019-04-03T11:42:13.537 回答
1

也许你正在寻找这样的东西:

public static Test Callme(int GetVal)
{
    Test obj = new Test(GetVal);
    Console.WriteLine(obj.val);
    return obj;
}

然后创建新实例,例如:

Test test1 = Test.Callme(10);
Test test2 = Test.Callme(20);

这样您就可以轻松访问每个实例的成员。例如 test1.val

于 2019-04-03T11:50:55.483 回答
0

Callme方法是静态方法。静态方法不需要调用对象实例。它们没有 this(关键字)引用,可以直接在类上调用。在你的情况下Test.CallMe(someValue)。请注意,这里不涉及对象实例。如果CallMe不是静态方法,您将需要一个实例/对象来调用它。例如

Test ob = new Test();
ob.CallMe(someValue);

您的示例说明的是私有字段/方法的使用。当构造函数或字段之类的方法用 private 关键字标记时,该方法/字段只能从声明类中调用/访问。

这意味着CallMe可以访问构造函数,因为CallMe它是类的成员,而构造函数是类的成员,因此它们都可以相互访问。

当一个类只有一个构造函数并且该构造函数是私有的时,它实际上意味着该类的实例只能从该类中创建。

因此,在当前示例CallMe中,每次调用时都会创建一个类的实例。如果您调用CallMe2 次,您将创建该类的 2 个实例。

于 2019-04-03T11:47:20.970 回答
0

因为 Callme 方法是静态的,所以它在使用之前由系统在某个时间点进行实例化,然后保留在内存中以供将来调用。无论创建了多少个类的实例,都只会创建一个类的静态成员的副本。

于 2019-04-03T11:48:02.763 回答