构造方法:

在Java类当中,为了保证程序可以正常的执行,即使用户没有定义任何的构造方法,也会在程序编译之后自动的为类里面增加一个没有参数,方法名称与类名称相同,没有返回值的构造方法。

构造方法的定义原则:方法名称与类名称相同,没有返回值声明。所有的构造方法都在对象使用关键字new实例化的时候要被默认调用。

构造方法只在实例化新对象(new)的时候调用一次,普通方法是在实例化对象后可以随意调用多次。

作用:在类对象实例化的时候要设置属性的初始值,是为属性初始化准备的。

如果定义了一个构造方法,那么不会再自动生成默认的构造方法,一个类中至少保留一个构造方法。

构造方法也属于方法,那么可以针对构造方法进行重载,但是构造方法由于其特殊性,即在进行重载是,只需注意构造方法参数的个数和类型即可。在重载时有要求:按照参数的个数进行升序或降序排列。

遗留问题:在定义一个类时可以为属性直接设置默认值,但是这个默认值只有在构造执行完后才会设置,否则不会设置,而构造方法是属于整个对象构造过程的最后一步,即:是留给用户处理的步骤。

在对象实例化的过程之中,一定会经历类的加载、内存的分配,默认值的设置、构造方法。在没有构造前,各属性都是其对应数据的默认值。

package DuiXiang;
/*构造方法
 * 方法名与类名相同
 * 方法名前无返回值类型
 * 没有使用return返回值
 * Person p = new Person(); 主方法中实例化对象并调用构造方法,有参就就在()中加参数
 * this关键字
 * 明确的访问一个类的成员变量,解决与局部变量名称冲突的问题
 * 只能在构造方法中使用this调用其它的构造方法,不能在成员方法中使用
 * this();只能在在第一行
 * 不能在一个类的两个构造方法中相互调用
 */
public class GouZao {
int age;

public GouZao(){
this(5);
System.out.println("无参的构造方法被调用了!");
}

public GouZao(int age){
//this();          //调用无参数的构造方法,调用时必须在第一行,否则会报错
this.age=age;
System.out.println("有参的构造方法被调用了!");
}
public int getAge(){
System.out.println("今年"+age+"岁了");
return this.age;

}
 
public static void main(String[] args) {
GouZao  gouzao = new GouZao();       //实例化对象并调用构造方法
gouzao.age=8;
gouzao.getAge();

}
 
}


 

匿名对象:

在构造方法的基础上,可以使用匿名对象,之前定义的都属于有名对象,但是这个名字使用时调用的肯定是堆内存空间,即真实的对象信息都保存在堆内存空间,没有栈指向的对象就称为匿名对象。

public class FengZhuang {
private String title
private int price;
public FengZhuang(String t,int p){
setTitle(t);
setPrice(p);
}
public void setTitle(String t){
title = t;
}
public String getTitle(){
return title;
}
public void setPrice(int p){
if(p>0){
price = p;
}
}
public int getPrice(){
return price;
}
public void print(){
System.out.println("《"+title+"》的价格为:"+price);
}
}
 
public class Book {
 
public static void main(String[] args) {
new FengZhuang("Java开发",89).print(); 
}
}


但是匿名对象没有其它对象进行引用,所以只能使用一次,一次之后该对象空间就成为垃圾,等待回收。

总结:

1、构造方法的定义要求:方法名称与类名称相同,没有返回值声明。

 

2、构造方法是在类对象使用关键字new 实例化的时候被默认调用的,不管你代码如何改变,只要是有了关键字new 就一定需要构造方法。

3、一个类中至少会保留一个构造方法,如果没有明确定义构造方法,那么会自动生成一个无参,什么都不做的构造方法。

4、构造方法的核心功能是在类对象实例化的时候为类中的属性初始化。

5、构造方法重载时,只要求考虑参数的类型及个数即可。

6、匿名对象只能够使用一次。