it-roy-ru.com

Назначение конструктора в Java?

Какова цель конструктора? Я изучал Java в школе, и мне кажется, что конструктор в значительной степени избыточен в том, что мы уже сделали. Пока неизвестно, появится ли цель, но пока она кажется мне бессмысленной. Например, в чем разница между следующими двумя фрагментами кода?

public class Program {    
    public constructor () {
        function();
    }        
    private void function () {
        //do stuff
    }    
    public static void main(String[] args) { 
        constructor a = new constructor(); 
    }
}

Это то, как нас учили делать вещи для заданий, но разве нижеследующие не делают то же самое?

public class Program {    
    public static void main(String[] args) {
        function();
    }        
    private void function() {
        //do stuff
    }
}

Цель конструктора ускользает от меня, но опять же, все, что мы сделали до сих пор, было чрезвычайно элементарно.

19
gator

Конструкторы используются для инициализации экземпляров ваших классов. Вы используете конструктор для создания новых объектов, часто с параметрами, указывающими начальное состояние или другую важную информацию об объекте.

Из официального руководства по Java :

Класс содержит конструкторы, которые вызываются для создания объектов из чертежа класса. Объявления конструктора выглядят как объявления методов, за исключением того, что они используют имя класса и не имеют возвращаемого типа. Например, Bicycle имеет один конструктор:

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}

Для создания нового объекта Bicycle с именем myBike конструктор вызывает новый оператор:

Bicycle myBike = новый велосипед (30, 0, 8);

new Bicycle(30, 0, 8) создает пространство в памяти для объекта и инициализирует его поля.

Хотя Bicycle имеет только один конструктор, он может иметь и другие, включая конструктор без аргументов:

общественный велосипед () { gear = 1; каденция = 10; скорость = 0; }

Bicycle yourBike = new Bicycle(); вызывает конструктор без аргументов для создания нового объекта Bicycle с именем yourBike.

45
LotusUNSW

Конструктор - это, по сути, метод, который вы можете использовать, чтобы гарантировать, что объекты вашего класса рождены действительными . Это основная мотивация для конструктора.

Допустим, вы хотите, чтобы у вашего класса было одно целое поле, которое всегда должно быть больше нуля. Как вы делаете это надежным способом?

public class C {
     private int number;

     public C(int number) {
        setNumber(number);
     }

     public void setNumber(int number) {
        if (number < 1) {
            throws IllegalArgumentException("C cannot store anything smaller than 1");
        }
        this.number = number;
     }
}

В приведенном выше коде может показаться, что вы делаете что-то избыточное, но на самом деле вы гарантируете, что число всегда верно, несмотря ни на что.

«инициализировать экземпляры класса» - это что делает конструктор, но не причина почему у нас есть конструкторы. Вопрос о назначении конструктора. Вы также можете инициализировать экземпляры класса извне, используя c.setNumber(10) в приведенном выше примере. Таким образом, конструктор - не единственный способ инициализации экземпляров.

Конструктор делает это, но способом, который безопасен . Другими словами, один класс решает всю проблему обеспечения того, чтобы его объекты всегда находились в допустимых состояниях. Неиспользование конструктора оставит такую ​​проверку для внешнего мира, что является плохим дизайном.

Вот еще один пример:

public class Interval {
    private long start;
    private long end;

    public Interval(long start, long end) {
        changeInterval(start, end);
    }

    public void changeInterval(long start, long end) {
        if (start >= end) {
            throw new IllegalArgumentException("Invalid interval.");
        }
        this.start = start;
        this.end = end;
    }
    public long duration() {
        return end - start;
    }
}

Класс Interval представляет временной интервал. Время хранится долго. Не имеет смысла иметь интервал, который заканчивается до его начала. Используя конструктор, подобный приведенному выше, невозможно получить экземпляр Interval в любой данный момент в любой точке системы, в которой хранится интервал, который не имеет смысла.

29
Akira

Как упоминалось в ответе LotusUNSW Конструкторы используются для инициализации экземпляров класса.  

Пример:

Скажем, у вас есть класс Animal что-то вроде

class Animal{
   private String name;
   private String type;
}

Давайте посмотрим, что происходит, когда вы пытаетесь создать экземпляр класса Animal, скажем, Dog с именем Puppy. Теперь вам нужно инициализировать name = Puppy и type = Dog. Итак, как вы можете это сделать. Способ сделать это с помощью конструктора, как

    Animal(String nameProvided, String typeProvided){
         this.name = nameProvided;
         this.type = typeProvided;
     }

Теперь, когда вы создаете объект класса Animal, вызывается что-то вроде Animal dog = new Animal("Puppy", "Dog");, и ваш конструктор вызывается и инициализирует name и type для значений, которые вы предоставили, т.е. Puppy и Dog соответственно.

Теперь вы можете спросить, что если бы я не предоставил аргумент своему конструктору что-то вроде 

Animal xyz = new Animal();

Это default Constructor, который инициализирует объект значениями по умолчанию, т.е. в нашем классе Animalname и значения type, соответствующие объекту xyz, будут name = null и type = null

9
Prateek

Конструктор инициализирует объект при его создании. Он имеет то же имя, что и его класс, и синтаксически похож на метод, но конструктор не имеет точного возвращаемого типа . Обычно мы используем конструктор, чтобы присвоить начальное значение переменным экземпляра, определенным классом, или выполнить любой другой запуск процедуры, необходимые для создания полностью сформированного объекта.

Вот пример конструктора:

class queen(){
   int beauty;

   queen(){ 
     beauty = 98;
   }
 }


class constructor demo{
    public static void main(String[] args){
       queen arth = new queen();
       queen y = new queen();

       System.out.println(arth.beauty+" "+y.beauty);

    }
} 

вывод:

98 98

Вот конструкция:

queen(){
beauty =98;
}

Теперь очередь за параметризованным конструктором.

  class queen(){
   int beauty;

   queen(int x){ 
     beauty = x;
   }
 }


class constructor demo{
    public static void main(String[] args){
       queen arth = new queen(100);
       queen y = new queen(98);

       System.out.println(arth.beauty+" "+y.beauty);

    }
} 

вывод:

100 98
4
Ashish Thapa
  • Через конструктор (с параметрами) вы можете «спросить» пользователя этого класса о необходимых зависимостях.
  • Он используется для инициализации переменных экземпляра
  • и передать аргументы конструктору суперкласса (super(...)), который в основном делает то же самое
  • Он может инициализировать (окончательные) переменные экземпляра с помощью кода, который может выдавать исключения, в отличие от инициализатора экземпляра scopes
  • Нужно not слепо вызывать методы из конструктора, потому что инициализация может быть не завершена/не достаточна в локальном или производном классе.
3
Sam

Java-конструктор имеет то же имя, что и имя класса, к которому он принадлежит.

Синтаксис конструктора не включает тип возвращаемого значения, поскольку конструкторы никогда не возвращают значение. 

Конструктор всегда вызывается при создании объекта. пример: - Конструктор по умолчанию

class Student3{  
    int id;  
    String name;  
    void display(){System.out.println(id+" "+name);}  
    public static void main(String args[]){  
        Student3 s1=new Student3();  
        Student3 s2=new Student3();  
        s1.display();  
        s2.display();  
    }  
} 

Результат:

0 null
0 null

Объяснение: В приведенном выше классе вы не создаете никакого конструктора, поэтому компилятор предоставляет вам конструктор по умолчанию. Здесь 0 и нулевые значения предоставляются конструктором по умолчанию.

Пример параметризованного конструктора

В этом примере мы создали конструктор класса Student, который имеет два параметра. Мы можем иметь любое количество параметров в конструкторе.

class Student4{  
    int id;  
    String name;  
    Student4(int i,String n){  
        id = i;  
        name = n;  
    }  
    void display(){System.out.println(id+" "+name);}  
    public static void main(String args[]){  
        Student4 s1 = new Student4(111,"Karan");  
        Student4 s2 = new Student4(222,"Aryan");  
        s1.display();  
        s2.display();  
    }  
}  

Результат:

111 Karan
222 Aryan
1
Naresh Kumar

Конструктор будет полезен для предотвращения получения экземпляров нереальных значений. Для примера установите класс Person с ростом, весом. Там не может быть человек с 0 м и 0 кг

1
rinjan

Он используется для настройки содержимого и состояния вашего класса. Хотя это правда, вы можете сделать более простой пример с методом main, у вас есть только 1 метод main на приложение, поэтому он не остается разумным подходом.

Рассмотрим основной метод, чтобы просто запустить вашу программу, и вы должны знать не больше, чем это сделать. Также обратите внимание, что main () является статическим, поэтому не может вызывать функции, которые требуют экземпляр класса и связанное состояние. Основной метод должен вызывать new Program (). Function (), а конструктор Program не должен вызывать функцию (), если это не требуется для настройки класса.

1
ajwillia.ms

Конструктор в основном используется для инициализации переменных во время создания объекта

1
Praveen Srinivasan

Определение класса определяет API для вашего класса. Другими словами, это план, который определяет контракт, который существует между классом и его клиентами - весь другой код, который использует этот класс. В контракте указывается, какие методы доступны, как их вызывать и что ожидать взамен.

Но определение класса - это спецификация. Пока у вас нет фактического объекта этого класса, контракт является просто «бумажкой». Вот где приходит конструктор.

Конструктор - это средство создания экземпляра вашего класса путем создания объекта в памяти и возврата ссылки на него. То, что должно произойдет в конструкторе, - это то, что объект находится в надлежащем начальном состоянии, чтобы последующие операции над ним имели смысл. 

Этот объект, возвращаемый конструктором, теперь будет соблюдать контракт, указанный в определении класса, и вы можете использовать этот объект для выполнения реальной работы.

Подумай об этом так. Если вы когда-нибудь загляните на веб-сайт Porsche, вы увидите, на что он способен - мощность, крутящий момент и т.д. Но это не весело, пока у вас нет настоящего Porsche для управления.

Надеюсь, это поможет.

1
Vidya

Я думал, что конструктор может работать как база данных, в которой только он определяет переменные и методы для управления ими

Затем я увидел объекты, которые используют переменные и методы, не определенные в его конструкторе. Таким образом, обсуждение, которое имеет для меня наибольшее значение, - это то, что тестирует значения переменных на валидность, но класс может создавать переменные и методы, которые не определены в конструкторе - меньше как база данных и больше как клапан избыточного давления в Steam. локомотив. Он не контролирует колеса и т.д.

Намного меньше определения, чем я думал.

1
user6646964

Давайте рассмотрим, как мы храним данные о 3 студентах. Эти 3 студента имеют разные значения sno, sname и sage, но все 3 студента принадлежат к одному и тому же отделу CSE. Поэтому лучше инициализировать переменную «dept» внутри конструктора, чтобы это значение могли быть приняты всеми 3 объектами ученика.

Чтобы ясно понять, см. Простой пример ниже:

class Student
{
    int sno,sage;
    String sname,dept;
    Student()
    {
        dept="CSE";
    }
    public static void main(String a[])
    {
        Student s1=new Student();
        s1.sno=101;
        s1.sage=33;
        s1.sname="John";

        Student s2=new Student();
        s2.sno=102;
        s2.sage=99;
        s2.sname="Peter";


        Student s3=new Student();
        s3.sno=102;
        s3.sage=99;
        s3.sname="Peter";
        System.out.println("The details of student1 are");
        System.out.println("The student no is:"+s1.sno);
        System.out.println("The student age is:"+s1.sage);
        System.out.println("The student name is:"+s1.sname);
        System.out.println("The student dept is:"+s1.dept);


        System.out.println("The details of student2 are");`enter code here`
        System.out.println("The student no is:"+s2.sno);
        System.out.println("The student age is:"+s2.sage);
        System.out.println("The student name is:"+s2.sname);
        System.out.println("The student dept is:"+s2.dept);

        System.out.println("The details of student2 are");
        System.out.println("The student no is:"+s3.sno);
        System.out.println("The student age is:"+s3.sage);
        System.out.println("The student name is:"+s3.sname);
        System.out.println("The student dept is:"+s3.dept);
    }
}

Результат:

Детали student1 являются
Студентка нет: 101
Возраст студента: 33
Имя студента: Джон
Студенческий отдел: CSE
Детали student2 являются
Студентка нет: 102
Возраст студента: 99
Студента зовут: Питер
Студенческий отдел: CSE
Детали student2 являются
Студентка нет: 102
Возраст студента: 99
Студента зовут: Питер
Студенческий отдел: CSE 

0
user9151823

Что ж, сначала я расскажу об ошибках в двух фрагментах кода.

Первый фрагмент кода

public class Program
{
    public constructor() // Error - Return type for the method is missing
    {
        function();
    }        
    private void function()
    {
        //do stuff
    }   

    public static void main(String[] args)
    {
        constructor a = new constructor(); // Error - constructor cannot be resolved to a type
    }
}

Как видно из приведенного выше кода, имя конструктора не совпадает с именем класса. В методе main() вы создаете объект из метода, который не имеет возвращаемого типа.

Второй фрагмент кода

public class Program
{
    public static void main(String[] args)
    {
        function(); // Error - Cannot make a static reference to the non-static method function() from the type Program
    }

    private void function()
    {
        //do stuff
    } 
}

Теперь в этом фрагменте кода вы пытаетесь создать статическую ссылку на функцию нестатического метода () типа Program, что невозможно.

Таким образом, возможное решение заключается в следующем,

Первый фрагмент кода

public class Program
{
    public Program()
    {
        function();
    }        
    private void function()
    {
        //do stuff
    }   

    public static void main(String[] args)
    {
        Program a = new Program();
        a.function();
    }
}

Второй фрагмент кода

public class Program
{
    public static void main(String[] args)
    {
        Program a = new Program();
        a.function();
    }

    private void function()
    {
        //do stuff
    } 
}

Наконец, разница между фрагментами кода заключается в том, что в первом фрагменте кода имя класса не совпадает с именем класса.

В то время как во втором фрагменте кода конструктор не определен.

Между тем, чтобы понять цель конструктора, обратитесь к ресурсам ниже,

https://docs.Oracle.com/javase/7/docs/api/Java/lang/reflect/Constructor.html

http://www.flowerbrackets.com/learn-constructor-in-Java/

http://www.flowerbrackets.com/Java-constructor-example/

0
Shiva