2013-03-19 175 views
1

任何人都可以告诉我构造函数和零参数构造函数之间的区别(概念上)是什么?例如:构造函数和零参数构造函数之间的区别(Java)

这将如何实施影响程序

public Person() { 
firstName = "UNKNOWN"; 
lastName = "UNKNOWN"; 
gender = '?'; 
retired = false; 
age = 0; 
address = null; 
} 

比说......这:

public Person(String f, String l, int a, char g) { 
firstName = f; 
lastName = l; 
age = a; 
gender = g; 
retired = false; 
address = null; 
} 

编辑:请忽略的参数个数......

+0

一般来说,你对构造函数的理解如何? – 2013-03-19 02:27:13

回答

5

如果您没有为类定义构造函数,编译器会自动创建一个默认的无参数构造函数。默认构造函数调用默认的父构造函数(super()),并将所有实例变量初始化为默认值(数字类型为零,对象引用为null,布尔值为false)。

仅当没有构造函数时才会创建默认构造函数。如果您为您的类定义了任何构造函数,则不会自动创建默认构造函数。

谁能告诉我在构造函数和零参数构造函数之间有什么区别(概念上)是?

没有区别。

0

没有定义其他构造函数时,将自动创建零参数构造函数。 带参数的构造函数用于对象的自定义初始化。

0

对于第一个构造函数,任何时候你想实例化一个Person,它总是以构造函数中定义的值开始。你将不得不使用setter来修改它。

对于第二个构造函数,任何时候你想实例化一个Person,你必须通过适当的参数。这意味着您可以创建对象,而无需使用setter来稍后更改值。

0
  1. 如果您没有定义构造函数,默认情况下会生成默认构造函数(它没有参数)。
  2. 如果您有任何用户定义的构造函数,则根本不会生成默认构造函数。
  3. 无论如何,你需要一个构造函数,除非你的类是实用类。
0

实例化对象时会调用构造函数。零参数(或“no-arg”)构造函数是不需要参数的构造函数。一个类可以有多个构造器,每个构造器都有不同的参数。

不带参数的构造函数对使用反射填充对象属性的工具特别有用。缺省的无参数构造函数用于构造对象,然后通过匹配其设置器中使用的名称(又名变形器)来填充其属性。

带参数的构造函数特别适合创建不可变对象。对象可以在创建时填充一次,然后保证不会更改(只要所有属性都是不可变的)。

0

首先,如果您没有语句构造函数,类可以创建构造函数,但此构造函数不是参数,并且将所有实例变量初始化为默认值(数字类型为零,对象引用为null,布尔值为false)这样的:

public Person() { 
firstName = null; 
lastName = null; 
gender = null; 
retired = false; 
age = 0; 
address = null; 
} 

但是你可以重写此构造这样的:

public Person() { 
firstName = "firstName"; 
lastName = "lastName"; 
gender = '?'; 
retired = true; 
age = 0; 
address = "someAddress"; 
} 

和重载这个构造这样的:

public Person(String f, String l, int a, char g) { 
firstName = f; 
lastName = l; 
age = a; 
gender = g; 
retired = false; 
address = null; 
}' 
2

此外,良好的作风是只有一个构造函数,做所有的实际工作,即使你有一个以上的构造函数。术语指定的构造函数来自Objective-C,但它仍然是一个好主意。假设你这样写:

public Person(String f, String l, int a, char g) { 
     // Use more expressive argument names. 
    firstName = f; 
    lastName = l; 
    age = a; 
    gender = g; 
    retired = false; 
    address = null; 
} 

然后,重写无参构造函数

public Person() { 
    this(null, null, 0, '?'); 
     // Invoke the designated constructor with those arguments. 
    retired = false; 
    address = null; 
} 

如果构造函数的第一个语句是this(...),则构造函数调用的其他构造的一个类。同样,如果构造函数的第一条语句是super(...),那么就调用父类的构造函数。如果两者都不是,则假定为super()

而且,由于retiredaddress设置以同样的方式在两个构造,其声明中对它们进行初始化:

private boolean retired = false; 
private String address = null; // If it's a String; it could be its own object type. 

然后,因为falsenull是实例变量初始化的默认值,替换那些两条线:

private boolean retired; 
private String address; 

稍后,您可以添加错误检查。例如,人们没有负面的年龄,因此插入语句

if (a < 0) { 
    throw new IllegalArgumentException("A Person cannot have a negative age: " 
     + a); 
} 

在指定的构造函数的开头将是有用的。这样,你只需要做一次。

当你学会了Java枚举,就可以让您的性别变量更精确写一个:

// Gender is a grammatical term, Sex is a biological term. 
public enum Sex { 
    MALE, FEMALE; 
} 

,并使用Sex代替chargender变量。