- 特点:
- 函数名与类名相同
- 不用定义返回值类型
- 没有具体的返回值
- 作用:
给对象进行初始化
- 注意:
- 默认构造函数
- 多个构造函数是以重载出现的
- 一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数的构造函数
- 如果在类中定义了构造函数,那么类中的默认构造函数就没有了
- 构造函数在创建对象时调用
- 构造函数也有默认的return语句(省略不写)
- 函数执行到return语句后,栈中该函数的方法区就会出栈
如:
class Person{ PRivate int age; Person(){ age = 10; }}
- 一般函数和构造函数的区别
构造函数:对象创建时,就会调用对应的构造函数,对对象进行初始化
一般函数:对象创建后,需要函数功能时才调用
一般函数不能调用构造函数,构造函数可以调用一般函数
class Person{ void Person(){ }}此方法为一般方法
class Person{ private String name; private int age; Person(){ age = 1; name = "xiaoming"; } Person(int a, String n){ age = a; name = n; }public void speak(){
System.out.println(name+”:”+age);
}}
在newPerson对象时,可以根据不同的构造函数,选择不同的创建方式。
Person p1 = new Person();//使用Person类的无参构造函数来创建对象Person p2 = new Person(10,”zhangsan”);//使用Person类有两个参数的构造函数来创建对象p1.speak();
p2.speak();
运行结果为:
xiaoming:1
zhangsan:10
Person p2 = new Person(10,”zhangsan”);p2.speak();
这个代码在内存中的执行过程:
说明:
1.执行main方法,在栈内存中开辟一个main函数的方法区,创建一个Person类型变量p2
2.在堆内存中创建一个Person的实例,并初始化值,和分配地址值
3.在栈内存中开辟Person构造函数的方法区,并执行构造函数中的代码,即给堆内存中的Person实例的name和age属性赋值
4.Person方法区出栈
5.栈中创建speak的方法区,执行相应的代码
6.speak方法区出栈
构造函数可以调用构造函数,如:
class Person{ private String name; private int age; Person(String n){ name = n; } Person(String n, int a){ this(n); age = a; } public void speak(){ System.out.println(name+”:”+age); }}
注意:
- 对this的调用必须是构造函数中的第一个语句
- 不允许两个构造函数互相调用,即不能Person(String n)中调用this(“zhangsan”,10),再在Person(String n, int a)调用this(“xiaoming”),会导致栈内存溢出,因为它们在不断的互相调用,不断进栈,却没有出栈
错误!!!栈内存溢出:
class Person{ private String name; private int age; Person(String n){ this("zhangsan",10) name = n; } Person(String n, int a){ this("lisi"); age = a; } }
- this详解见 [java学习笔记]java语言核心----this关键字&super关键字
新闻热点
疑难解答