一:构造方法的概念
1.构造方法又被称为构造函数/构造器/Constructor
2.构造方法语法结构:
[修饰符列表] 构造方法名(形式参数列表){ 构造方法体; }
3.回顾普通方法的语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){ 方法体 }
4.对于构造方法来说,“返回值类型”不需要指定,并且也不能写void,只要写上void,那么方法就成为普通方法了。
5.构造方法有什么用,构造方法的方法名必须和类名保持一致。
6.构造方法的作用?
构造方法存在的意义,通过构造方法的调用,可以创建对象。
7.构造方法应该怎么调用?
普通方法是这样调用的:方法修饰符中有static的时候:类名.方法名(实参列表),方法修饰符列表中没有static的时候:引用.方法名(实参列表)||new 构造方法名(实参列表)
8.构造方法调用执行之后,有返回值吗?
每一个构造方法实际上执行结束之后都有返回值,但是这个“return 值;”这样的语句不需要写。构造方法结束的时候java程序自动返回值,并且返回值是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要编写
9.当一个类中没有定义任何的构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器
10.当一个类显示的将构造方法定义出来了,那么系统则不再认为这个类提供缺省构造器。建议开发中手写的当前类提供无参数构造方法。因为无参数构造方法最常用了。
11.构造方法支持重载机制。在一个类当中编写多个构造方法,这个构造方法显然已经构成方法重载机制。
示例代码
class User { //默认的无参构造方法 public User(){ System.out.println("User's Default Constructor Invoke!"); } //有参数的构造方法 public User(int a){ System.out.println("带有int类型参数的有参构造方法!"); } //有参数的构造方法 public User(String b){ System.out.println("带有String类型参数的有参构造方法!"); } //有参数的构造方法 public User(int a,String b){ System.out.println("带有int类型和String类型参数的有参构造方法!"); } } public class Constructortest01 { public static void main(String[] args) { //创建User对象 //调用User类的构造方法来完成对象的创建 //以下程序创建了4个对象,只要构造函数调用就会创建对象,并且一定是在“堆内存”中开辟空间 User u1 = new User(); User u2 = new User(20); User u3 = new User("zhangsan"); User u4 = new User(20,"zhangsan"); //调用带有static的方法:类名 Constructortest01.dosome(); dosome(); //调用没有static的方法:引用 //doOther方法在Constructortest01类当中,所以需要创建Constructortest01对象 //创建Constructortest01对象,调用无参构造方法 Constructortest01 c = new Constructortest01();//一个类中没有任何构造方法的话,系统默认提供一个无参构造器 c.doOther(); } public static void dosome(){ System.out.println("dosome"); } public void doOther(){ System.out.println("doOther"); } }
二:构造方法作用
1.创建对象
2.创建对象的同时,初始化实例变量的内存空间。【给实例变量赋值】
成员变量之实例变量,属于对象级别的变量,这种变量必须现有变量才能有实例变量,实例变量没有手动赋值的时候,系统默认赋值,那么这个系统默认赋值是在什么时候完成的呢?是在类加载的时候吗?
不是,因为类加载的时候只加载了代码片段,还没来得及创建对象,所以此时实例变量并没有初始化,实际上,实例变量的内存空间是在构造方法执行过程当中完成开辟的。完成初始化的。系统在默认赋值的时候,也是在构造方法执行过程当中完成的赋值。
示例代码01
class Account { //账号 private String actno; //余额 private double balance; //无参构造器 public Account(){ //初始化实例变量的内存空间 //actno = null; //balance = 0.0; } public Account(String a){ actno = a; } public Account(String a,double c){ actno = a; balance = c; } 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; } } public class Constructortest02 { public static void main(String[] args) { //另外,在一个类当中元素过多,想快速查看,在当前类中使用ctrl+o快捷键,然后输入要查找的元素名称,该名称不一定输入全名称 Account act1 = new Account(); System.out.println("账户的 号是:" + act1.getActno()); System.out.println("账户的余额是:" + act1.getBalance()); System.out.println("====================================="); Account act2 = new Account("382155"); System.out.println("账户的账号是:" + act2.getActno()); System.out.println("账户的余额是:" + act2.getBalance()); System.out.println("====================================="); Account act3 = new Account("382155",50000.0); System.out.println("账户的账号是:" + act3.getActno()); System.out.println("账户的余额是:" + act3.getBalance()); } }
示例代码02
class Customer { private int no; private String name; private String birth; //无参数构造器 public Customer(){ } //有参数的构造器 public Customer(int a,String b,String c){ no = a; name = b; birth = c; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } } public class ConstructorTest03 { public static void main(String[] args) { Customer c1 = new Customer(); System.out.println("该顾客的编号为:" + c1.getNo()); System.out.println("该顾客的编号为:" + c1.getName()); System.out.println("该顾客的编号为:" + c1.getBirth()); Customer c2 = new Customer(8888888,"法外狂徒张三","1988-09-19"); System.out.println("该顾客的编号为:" + c2.getNo()); System.out.println("该顾客的编号为:" + c2.getName()); System.out.println("该顾客的编号为:" + c2.getBirth()); } }