какой смысл в Java-конструкторе? - PullRequest
0 голосов
/ 15 октября 2011

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

Ответы [ 7 ]

9 голосов
/ 15 октября 2011

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

Если у вас есть объект, который требует некоторой обработки, прежде чем его можно будет использовать (например, инициализировать элементы), вы должны сделать это вконструктор.

В идеале, вы никогда не должны иметь «частично построенных» объектов (т. е. объектов, которые являются «живыми», на которые вы держите ссылку, но которые еще не используются).Без конструкторов вы бы постоянно создавали частично построенные объекты, и это очень подвержено ошибкам.(Теория и практика не всегда совпадают, но помните об этой идее.)

6 голосов
/ 15 октября 2011

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

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

Если честно, вероятно, о них пока не стоит беспокоиться, если вы еще не поняли смысл. Вполне вероятно, что по мере того, как вы узнаете больше, вы, естественно, начнете больше использовать объекты (например, коллекции), и вы освоите их. Будьте уверены, важно иметь 1010 * конструкторов на Java, но я уверен, что со временем вы поймете, почему. (Конечно, если этот ответ уже помог вам оценить их ценность, я рад, но если нет, не волнуйтесь:)

2 голосов
/ 15 октября 2011

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

public class Car{

    // Licence plate number. This is private, so it can
    // not be accessed directly from outside the class.
    private String hiddenRegNr = ""; 
    private static String description = "This is a car". 

    // The constructor, which sets the value of hiddenRegNr
    public Car(String regNr){
        hiddenRegNr = regNr;
    }

    // Method for reading hiddenRegNr, the only 
    // way to access it after instantiation. 
    public String getRegNr(){
        return hiddenRegNr;
    }

    // A static method. Can be used withouth instantiation.
    public static String getDesc(){
        return description;
    }
}

Из какого-то другого класса вы можете вызвать этот класс и создать его экземпляры;актуальные представления разных автомобилей.Они представляют разные автомобили, но основаны на одной и той же «модели», т. Е. Классе автомобилей.

Car myFirstCar = new Car("SR12345");
Car myOtherCar = new Car("XZ54321");

Теперь у вас есть две разные машины с двумя разными регистрационными номерами.Это независимые экземпляры типа car .Они существуют в памяти и могут содержать разные значения (в этом случае разные регистрационные номера).

myFirstCar.getRegNr(); // Will return SR12345
mySecondCar.getRegNr(); // will return xz54321

Первое, что здесь следует отметить, это то, что вы можете указать регистрационный номер только один раз для каждого автомобиля, а именно при создании.В этом смысл конструктора: он устанавливает значения и выполняет другие действия, которые необходимо выполнить при создании объектов (экземпляров).

Теперь обратите внимание на разницу между getRegNr () и getDesc (): ключевое слово «Static» означает, что второй метод связан непосредственно с классом, а не с каждым экземпляром.Это означает, что:

  • Вызовы getDesc () выполняется для класса, а не для экземпляра:

    Car.getDesc ();

  • Вызов getDesc () вернет одинаковое значение для всех экземпляров класса car

  • Переменная описание (которая также является статической) будет одинаковой для всех экземпляров Car

  • Статический метод getDesc () НЕ МОЖЕТ получить доступ к переменной hiddenRegNr , так как эта переменная связана с конкретным экземпляром.Попытка обратиться к переменной в экземпляре из статического контекста (такого как getDesc () ) вызовет исключение.Можно сказать, что hiddenRegNr не будет установлен при вызове

    Car.getDesc ();

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

1 голос
/ 15 октября 2011

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

class Obj {
  private int state = 0;

  public Obj(int state) {
     this.state = state;
  }

  public Obj() {
     state = 1;
  }
}

Теперь в main (или где угодно) вы можете иметь:

Obj obj1 = new Obj();
Obj obj2 = new Obj(2);

Два объекта имеют разные состояния (один находится в состоянии 1,другой в состоянии 2).Если бы вы полагались на статические методы и члены, объекты имели бы одно состояние и не были бы независимы друг от друга.

Также важно отметить, что конструкторы (в частности ключевое слово new) выделяют память дляданный объект внутренне, так что вам не нужно беспокоиться об использовании malloc и другом управлении памятью.Так что они важны и в этом смысле.

1 голос
/ 15 октября 2011

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

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

0 голосов
/ 11 апреля 2014

На самом деле нужен конструктор, ЕСЛИ вам нужно присвоить уникальное начальное состояние экземпляру класса.В Java я только что понял (от друга), что мы можем сделать это:

public class MyClass1 {
     private class MyClass2 {}
     private MyClass2 myobj2 = new MyClass2();
}

Так что нет необходимости в неявном конструкторе.Но если что-то вроде следующего, вам нужен конструктор.

public class MyClass1 {
     private class MyClass2 { 
         private int id_ = 0;
         public MyClass2(int id) { id_ = id; }    // how to reach this?   
     }

     private MyClass2 myobj2 = new MyClass2(1);   // (this doesn't work. Not unique)

     public MyClass1(int id)     { myobj2 = new MyClass2(id); }   // by this!
}
MyClass1 obj1 = new MyClass1(100);
MyClass1 obj2 = new MyClass1(200);
0 голосов
/ 15 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...