В чем разница между пустым конструктором и конструктором без конструктора

#java

#java

Вопрос:

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

 class Munikas {

    public Munikas(){
    }

    public void rytas(){
        System.out.println("Labas Rytas");
    }

    public static void main(String[] args){
        Munikas labas = new Munikas();
        labas.rytas();
    }
}
  

И

 class Munikas {
    public void rytas(){
        System.out.println("Labas rytas");
    }

    public static void main(String[] args){
        Munikas labas = new Munikas();
        labas.rytas();
    }
}
  

На втором я не использую constructor . Как это повлияет на мой код в будущем?

Ответ №1:

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

Если бы вы что-то сделали внутри этого конструктора без аргументов, тогда была бы разница, но как автор, эти два примера кода эквивалентны.

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

Комментарии:

1. Итак, мне нужно самостоятельно создавать конструктор только тогда, когда мне нужно использовать в нем аргументы?

2. @TomasVilemaitis: обычно это вариант использования конструкторов, хотя вы можете использовать конструктор для установления некоторого состояния по умолчанию, если вы действительно этого хотите.

3. @TomasVilemaitis Нет. Только когда вы что-то делаете в constructor. Может быть конструктор без аргументов, который задает некоторые поля.

4. Спасибо вам за ваше время и ответы! Это мне очень помогло.

5. это jvm или компилятор, который предоставляет c’tor по умолчанию?

Ответ №2:

Разницы нет. Когда ваш класс не определяет какой-либо конструктор (как в вашем втором фрагменте), компилятор автоматически вставит конструктор без параметров с пустым телом, поэтому второй фрагмент эквивалентен первому.

Ответ №3:

Вам не обязательно использовать пустой конструктор. Компилятор сгенерирует его автоматически.

Ответ №4:

классы в java имеют конструктор по умолчанию, который создается за кулисами. В первом вы добавили конструктор. во-вторых, компилятор java создаст пустой конструктор по умолчанию.

подробнее здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

надеюсь, это поможет 🙂

Ответ №5:

Конструкторы Java — это специальные методы, которые вызываются при создании экземпляра объекта с использованием new ключевого слова as:

ClassName referenceName = new ClassName();

Конструктор по умолчанию:

public ClassName(){ // no statements }

Конструктор в классе не является обязательным. Если вы не определяете конструктор в классе, JVM добавляет конструктор по умолчанию.

В первом коде:

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

Во втором коде:

JVM автоматически определяет конструктор по умолчанию так же, как и в вашем первом коде. Таким образом, не будет никакого эффекта от добавления конструктора.

Ответ №6:

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

Этот класс взят из проекта с открытым исходным кодом https://github.com/openshopio/openshop.io-android/blob/master/app/src/main/java/bf/io/openshop/api/EndPoints.java

 package bf.io.openshop.api;

import bf.io.openshop.CONST;

public class EndPoints {

/**
 * Base server url.
 */
private static final String API_URL                  = "http://77.93.198.186/v1.2/";    // staging

public static final String SHOPS                    = API_URL.concat(CONST.ORGANIZATION_ID   "/shops");
public static final String SHOPS_SINGLE             = API_URL.concat(CONST.ORGANIZATION_ID   "/shops/%d");
public static final String NAVIGATION_DRAWER        = API_URL.concat("%d/navigation_drawer");
public static final String BANNERS                  = API_URL.concat("%d/banners");
public static final String PAGES_SINGLE             = API_URL.concat("%d/pages/%d");
public static final String PAGES_TERMS_AND_COND     = API_URL.concat("%d/pages/terms");
public static final String PRODUCTS                 = API_URL.concat("%d/products");
public static final String PRODUCTS_SINGLE          = API_URL.concat("%d/products/%d");
public static final String PRODUCTS_SINGLE_RELATED  = API_URL.concat("%d/products/%d?include=related");
public static final String USER_REGISTER            = API_URL.concat("%d/users/register");
public static final String USER_LOGIN_EMAIL         = API_URL.concat("%d/login/email");
public static final String USER_LOGIN_FACEBOOK      = API_URL.concat("%d/login/facebook");
public static final String USER_RESET_PASSWORD      = API_URL.concat("%d/users/reset-password");
public static final String USER_SINGLE              = API_URL.concat("%d/users/%d");
public static final String USER_CHANGE_PASSWORD     = API_URL.concat("%d/users/%d/password");
public static final String CART                     = API_URL.concat("%d/cart");
public static final String CART_INFO                = API_URL.concat("%d/cart/info");
public static final String CART_ITEM                = API_URL.concat("%d/cart/%d");
public static final String CART_DELIVERY_INFO       = API_URL.concat("%d/cart/delivery-info");
public static final String CART_DISCOUNTS           = API_URL.concat("%d/cart/discounts");
public static final String CART_DISCOUNTS_SINGLE    = API_URL.concat("%d/cart/discounts/%d");
public static final String ORDERS                   = API_URL.concat("%d/orders");
public static final String ORDERS_SINGLE            = API_URL.concat("%d/orders/%d");
public static final String BRANCHES                 = API_URL.concat("%d/branches");
public static final String WISHLIST                 = API_URL.concat("%d/wishlist");
public static final String WISHLIST_SINGLE          = API_URL.concat("%d/wishlist/%d");
public static final String WISHLIST_IS_IN_WISHLIST  = API_URL.concat("%d/wishlist/is-in-wishlist/%d");
public static final String REGISTER_NOTIFICATION    = API_URL.concat("%d/devices");


// Notifications parameters
public static final String NOTIFICATION_LINK        = "link";
public static final String NOTIFICATION_MESSAGE     = "message";
public static final String NOTIFICATION_TITLE       = "title";
public static final String NOTIFICATION_IMAGE_URL   = "image_url";
public static final String NOTIFICATION_SHOP_ID     = "shop_id";
public static final String NOTIFICATION_UTM         = "utm";

/// Empty constructor is equivalent to providing no constructor
/// but if you want to prevent the initiation of the class then you have to set a private constructor.
private EndPoints() {}
}
  

Ответ №7:

Проще говоря, конструктор позволяет вам создавать объект экземпляра вашего класса, используя что-то вроде этого:

 Munikas testObject = new Munikas();
  

Разница между ними будет очевидна, когда вы попытаетесь использовать НЕСТАТИЧЕСКИЕ методы. Метод rytas() нестатичен, что означает, что вам нужно вызвать его, используя созданный экземпляр объекта класса, например:

 testObject.rytas();
  

Поэтому при использовании rytas вам нужно будет использовать конструктор. Как упоминали другие люди, вам не нужно добавлять код для создания пустого конструктора, однако иногда вам нужно будет использовать конструкторы для объектов с параметрами. Основной СТАТИЧЕСКИЙ метод будет работать с конструктором или без него, и его можно вызвать, используя только сам класс (Munikas). Для получения дополнительной информации проверьте это. Надеюсь, это поможет.