class Temp
{
private Temp(int data)
{
System.out.printf(" Constructor called ");
}
protected static Temp create(int data)
{Temp obj = new Temp(data);
return obj;
}
public void myMethod()
{
System.out.printf(" Method called ");
}
}
public class Test
{
public static void main(String[] args)
{
Temp obj = Temp.create(20); //How this is a method call?
obj.myMethod();
}
}
Конструктор класса всегда следует за одной и той же сигнатурой:
[модификатор доступа -> защищенный, общедоступный, закрытый, по умолчанию] [имя класса] (параметры)
Итак, в вашем коде,
private Temp(int data) {
System.out.printf(" Constructor called ");
}
ваш конструктор.
Чтобы использовать ваш класс Temp
, по крайней мере, его нестатические члены, вам понадобится экземпляр класса, чтобы иметь возможность его использовать, но, поскольку ваш конструктор объявлен как private, экземпляр может быть создан только в том же классе.
Вот что вы делаете здесь:
protected static Temp create(int data)
{Temp obj = new Temp(data);
return obj;
}
Этот метод является статическим, то есть он «существует», как только класс загружается в память, даже без создания экземпляра класса.
Поскольку он объявлен защищенным, а не закрытым, он может использоваться подклассами Temp
и классами, которые находятся в том же пакете, что и Temp
, например, ваш класс Test
.
Ваш класс Test
вызывает этот метод, который вызывает конструктор и возвращает созданный экземпляр в класс Test
. Этот способ работы используется в определенных сценариях, например, если вы хотите ограничить количество экземпляров, создаваемых на виртуальную машину, например, с шаблоном Singleton
.