Назначение конструктора в 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
    }
}

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

Ответы

Ответ 1

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

В официальном учебном пособии :

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

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

Чтобы создать новый объект Bicycle с именем myBike, конструктор вызывается новым оператором:

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

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

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

public Bicycle() {         шестерня = 1;         каденция = 10;         скорость = 0;     }

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

Ответ 2

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

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

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 представляет собой временной интервал. Время хранится длинным. Не имеет смысла иметь интервал, который заканчивается до его начала. Используя конструктор, подобный описанному выше, невозможно иметь экземпляр интервала в любой данный момент в любой точке системы, где сохраняется интервал, который не имеет смысла.

Ответ 3

Как упоминалось в ответе 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"); вашего конструктора и инициализирует имя и тип для значений, которые вы предоставили, например, Puppy и Dog.

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

Animal xyz = new Animal();

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

Ответ 4

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

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

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

Ответ 5

  • Через конструктор (с параметрами) вы можете "спросить" пользователя этого класса для необходимых зависимостей.
  • Он используется для инициализации переменных экземпляра
  • и передать аргументы конструктору суперкласса (super(...)), который в основном выполняет те же
  • Он может инициализировать (конечные) переменные экземпляра кодом, которые могут генерировать исключения, в отличие от инициализатора экземпляра области
  • В конструкторе нельзя использовать не методы слепого вызова, потому что инициализация может не завершиться/достаточна в локальном или производном классе.

Ответ 6

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

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

Ответ 7

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

Но определение класса - спецификация. До тех пор, пока у вас нет фактического объекта этого класса, контракт - это просто "лист бумаги". Здесь находится конструктор.

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

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

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

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

Ответ 8

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

Ответ 9

Конструктор 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

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

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

В этом примере мы создали конструктор класса 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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

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

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/

Ответ 13

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

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

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);
    }
}

Вывод:

Подробная информация о студенте1: Студент нет: 101
Возраст студента: 33
Имя студента: John
Студенческий отдел: CSE
Подробная информация о студенте2: Студент нет: 102
Возраст студента: 99
Имя студента: Peter
Студенческий отдел: CSE
Подробная информация о студенте2: Студент нет: 102
Возраст студента: 99
Имя студента: Peter
Студенческий отдел: CSE