“部分内容摘自《java语言程序设计》,郭克华主编,page 77”
一、何为构造函数
——构造函数也是一种特殊方法,避免创建对象后,忘记对对象进行初始化,是人为创造的。它规定了对象初始化必须完成。
二、格式
类名 对象名 = new 类名(传参)
定义时需要满足:函数名称与类名相同;不含有返回值
三、实例
/**
* 构造函数演示
*/
class Customer {
String name;
String sex;
int age;
void init(String name,String sex,int age){
this.name = name;
this.age = age;
this.sex = sex;
}
void display(){
System.out.println("name="+name);
System.out.println("age="+age);
System.out.println("sex="+sex);
}
}
public class ConstructorTest{
public static void main(String[] args){
Customer customer = new Customer();
customer.init("张思","女",89);
customer.display();
}
}
上面代码可以写成:
/**
* 构造函数演示
*/
class Customer {
String name;
String sex;
int age;
Customer(String name,String sex,int age){
this.name = name;
this.age = age;
this.sex = sex;
}
void display(){
System.out.println("name="+name);
System.out.println("age="+age);
System.out.println("sex="+sex);
}
}
public class ConstructorTest1{
public static void main(String[] args){
Customer c = new Customer("张三","男",13);
c.display();
}
}
注意:上面的this,避免了函数变量和成员变量的名字重复,不加会屏蔽成员函数中的变量。this表示该变量属于类中的变量,而非成员变量(是局部变量)。此处可以理解为对本对象的引用,“本对象自己”
如果不加:输出如下:
可以看到初始值为null,false,0。
构造函数,idea上显示如下:
这句代码:
Customer customer = new Customer("张思","女",89);实际上是调用了构造 函数。
扩展,静态变量:
传入color的实参,赋值情况如下如下,(static关键字,静态变量存储在区别于成员变量的区域,全局区)
内存存储位置说明:
栈:成员变量,参数,对象引用(编译器自动分配,程序结束回收内存)
堆:所有new出来的对象(程序员主动申请,需要主动释放)
静态区(全局区):存放static修饰的静态变量(只需创建一次,下次可以直接引用),类里面定义的 成员变量——共享
方法区+常量池:???待补充
本例中,定义了两个类,Customer和ConstructorTest,编译后会产生两个 .class文件。当然也可以把两个类放在不同文件中。
对于 Demo demo = new Demo(); 的内存分析见下链接
http://www.cnblogs.com/java-sky/p/7200085.html
四、注意
(1)、构造函数可以被重载。一个类可以定义多个构造函数。实例化对象时,根据具体情况,调用不同的构造函数。
(2)、若没有定义构造函数,则系统默认定义一个空构造函数,无参。初始化对象直接new。
(3)、一个类创建,构造器自动调用,不同位置的参数代表不同属性。在对象的生命周期中,构造函数只会调用一次。