构造方法:
在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、匿名对象只能够使用一次。