空构造函数和没有构造函数之间有什么区别

时间:2016-09-29 17:50:27

标签: java

我从PHP转到Java,因为英语不是我的主要语言,所以很难理解OOP。我想要一个简单的答案(尽可能简单,哈哈)。是什么区别:

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。它将来如何影响我的代码?

7 个答案:

答案 0 :(得分:12)

您提供的代码段之间没有区别。用户提供的no-arg构造函数与默认情况下由Java提供的默认no-arg构造函数基本相同。

如果你在那个no-arg构造函数中做了什么,那么会有区别,但是作为编写者,这两个代码样本是等价的。

Java Language Specification为此提供了更多上下文,代码示例与您自己的代码示例类似。

答案 1 :(得分:6)

没有区别。当你的类没有定义任何构造函数时(如在你的第二个代码片段中),编译器将自动插入一个带有空体的无参数构造函数,因此第二个代码段与第一个相同。

答案 2 :(得分:1)

您不必使用空构造函数。编译器会自动生成它。

答案 3 :(得分:1)

java中的

类具有在幕后创建的默认构造函数。在第一个中添加了构造函数。第二个,java编译器将创建一个空的默认构造函数。

此处有更多信息:https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

希望这有助于:)

答案 4 :(得分:0)

Java构造函数 是使用new关键字将对象实例化时调用的特殊方法:

ClassName referenceName = new ClassName();

默认构造函数:

public ClassName(){ // no statements }

班级中的构造函数不是必须。如果您没有在类中定义构造函数,那么 JVM 会添加默认

在第一个代码中:

您已经定义了没有任何语句的默认构造函数,因此它什么都不做。这就像没有定义构造函数一样。

在第二个代码中:

JVM 会自动定义与第一个代码中相同的默认构造函数。因此,不添加构造函数不会有任何影响。

答案 5 :(得分:0)

空构造函数等效于不提供构造函数,但通过设置空构造函数,您可以指定要将哪个级别的可访问性设置为构造函数本身,而不管类具有哪些可访问级别。如在提供的示例中,如果要阻止启动类,则必须设置私有构造函数。

此课程来自开源项目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() {}
}

答案 6 :(得分:-1)

简单来说,构造函数允许您使用以下内容创建类的实例对象:

Munikas testObject = new Munikas();

当您尝试使用非STATIC方法时,两者之间的区别将很明显。方法rytas()是非静态的,这意味着你需要使用类的实例化对象来调用它,如下所示:

testObject.rytas();

因此,在使用rytas时,您需要使用构造函数。正如其他人提到的那样,您不需要添加代码来创建空构造函数,但有时您需要为带参数的对象使用构造函数。无论是否有构造函数,主STATIC方法都可以,只需使用类(Munikas)本身即可调用。有关详细信息,请查看this。希望有所帮助。