构造方法的知识点
-
构造方法又被称为构造函数/构造器(Constructor)
-
作用
- 创建对象
- 初始化对象属性
-
语法结构
-
普通方法的语法结构:
[修饰符列表] 返回值类型 方法名(形参列表){ 方法体; }
-
构造方法的语法结构:
[修饰符列表] 构造方法名(形参列表){ 构造方法体; }
-
构造方法名必须与类名相同
-
构造方法的返回值类型不需要指定,并且也不能写void
只要写上void等任何返回值类型,那么这个方法就成为普通方法了
每一个构造方法实际上执行结束后都有返回值,其返回值就是构造方法所在类的实例化对象的内存地址。但我们不需要写“return”这样的语句,因为Java程序会自动帮我们完成这个操作
构造方法的返回值类型实际上就是构造方法所在类的数据类型。由于构造方法的返回值类型实际上就是类本身,所以返回值类型不需要编写
-
如果没有定义任何构造方法,系统默认给该类提供一个无参数构造方法,这个构造方法称为缺省构造器
-
当一个类显式的把构造方法定义出来了,系统就不再默认为这个类提供缺省构造器。建议开发中手动地为当前类提供无参数构造方法
-
构造方法支持重载机制,在一个类中编写多个构造方法,这多个构造方法显然已经构成方法重载机制
-
-
-
调用
- 普通方法的调用:
- 没有static修饰符的普通方法:引用.方法名(实参列表)
- 有static修饰符的普通方法:类名.方法名(实参列表)
- 构造方法的调用:new 构造方法名(实参列表)
- 普通方法的调用:
-
构造方法的语法结构与调用的测试
package com.diamondk.javase.test02;
public class User {
// 无参数的构造方法
public User(){
System.out.println("User's Default Constructor Invoke");
}
// 有参数的构造方法
// 带有int类型的构造方法
public User(int i){
System.out.println("带有int类型的构造器");
}
// 有参数的构造方法
// 带有String类型的构造方法
public User(String name){
System.out.println("带有String类型的构造器");
}
// 有参数的构造方法
// 带有int类型和String类型的构造方法
public User(int i, String name){
System.out.println("带有int类型和String类型的构造器");
}
}
package com.diamondk.javase.test02;
public class ConstructorTest01 {
public static void main(String[] args){
// 创建User对象
// 调用User类的构造方法创建User对象
// 以下程序创建了4个对象,只要构造函数调用就会创建对象,并且一定是在堆内存中开辟内存空间。
User u1 = new User();
User u2 = new User(10);
User u3 = new User("zhangsan");
User u4 = new User(10, "zhangsan");
// 调用带有static的方法
// 类名.方法名(实参列表),在同一个类下可以省略类名
ConstructorTest01.doSome();
doSome();
// 调用不带有static的方法
// 引用.方法名(实参列表),需要创建对象,通过对象来调用方法
// 创建ConstructorTest01对象,调用ConstructorTest01()无参数构造方法
ConstructorTest01 t = new ConstructorTest01(); // 系统默认提供一个无参数构造器(即缺省构造器)
t.doOther();
}
public static void doSome(){
System.out.println("do some!");
}
public void doOther(){
System.out.println("do other!");
}
}
构造方法的作用的测试
-
成员变量之实例变量,属于对象级别的变量,这种变量必须先有对象才能有实例变量。
实例变量没有手动赋值的时候,系统默认赋值,那么这个系统默认赋值是在什么时候完成的呢?是在类加载的时候吗?
不是,因为类加载的时候只加载了代码片段,还没来得及创建对象。所以此时实例变量并没有初始化
实际上,实例变量的内存空间是在构造方法执行过程当中完成开辟的
系统在默认赋值的时候,也是在构造方法执行过程当中完成的赋值
package com.diamondk.javase.test03;
public class Account {
// 编号
private String actno;
// 金额
private double balance;
// 无参数构造器
public Account(){
// 初始化实例变量的内存空间
// actno = null;
// balance = 0.0;
}
// 有参数构造器
public Account(String s){
actno = s;
}
public Account(double d){
balance = d;
}
public Account(String s, double d){
actno = s;
balance = d;
}
// getter and setter
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
package com.diamondk.javase.test03;
public class ConstructorTest02 {
public static void main(String[] args){
// 创建对象
/*如何查看调用的是哪个方法?
按住Ctrl键,鼠标移动到需要查看的元素上(包括方法和属性)
点击后就会跳转到该元素所在代码*/
Account act1 = new Account();
System.out.println("账号:" + act1.getActno()); // null
System.out.println("余额:" + act1.getBalance()); // null
Account act2 = new Account("110");
System.out.println("账号:" + act2.getActno()); // 110
System.out.println("余额:" + act2.getBalance()); // null
Account act3 = new Account(10000.0);
System.out.println("账号:" + act3.getActno()); // null
System.out.println("余额:" + act3.getBalance()); // 10000.0
Account act4 = new Account("111",10000.0);
System.out.println("账号:" + act4.getActno()); // 111
System.out.println("余额:" + act4.getBalance()); // 10000.0
}
}