一,构造方法的引入
构造方法:
1,定义:
在类的代码中,如果没有编写构造方法,则编译过程中自动创建一个构造方法。
2,编译过程自动创建构造方法的特点:
使用默认的权限修饰符
没有返回值类型
方法名称和类名一致
没有方法体
没有形式参数
eg:
calss Student{
private String name;
private int age;
Student(){
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}
public class ConstructorDemo{
public static void main(String[] args){
Student s=new Student();//new后面编写的是构造方法
//st.Student();构造方法不是使用对象调用的。
}
}
二,构造方法的特点:
1,手动编写构造方法
编写类就必须有构造方法,那么我们就不用使用自动创建,使用手动编写。
如果在代码编写过程中,手动创建了构造方法,则在编译器就不会再自动
创建一个默认的构造方法了。
2,手动编写构造方法的规则:
构造方法只能有权限修饰符(不能有其它修饰符)。
构造方法是没有返回值的(没有返回值 没有return)。
构造方法是可以抛出异常类型的(但是不常用)。
构造方法可以有形式参数(形式参数的值通常是给成员变量赋值的)。
构造方法是可以有方法体的。
注意:如果手动给某个类编写构造方法,必须先编写一个无参数、公开的、没有方法体的(是为了以后反射使用,后面课程会讲)。
3,构造方法的目的:
A,构造方法是和new配合来完成对象创建的。(重要)
构造方法是创建对象的最后一个步骤(会在创建的过程中被调用)。
B,构造方法的最终目的是为成员变量赋值(重要)。
到目前的知识点,有哪些方式可以给一个对象的成员变量赋值?
对象名称.成员变量 没有考虑封装性
setter 必须在对象存在之后调用,可以被无数次调用
构造方法 肯定是创建对象过程被调用,并且同一个对象,只能被调用一次
4,构造方法是可以调用普通成员方法的。
构造方法中是有this关键字的。
三,构造方法重载
1,名称都相同,都是类名称。
2,方法参数不同
3,构造方法中调用其它的构造方法
必须使用this(参数值);的方式调用其它的构造方法。
以上代码必须写在第一行。
4,为什么一个类在定义时需要多个构造方法?
在java语言中,往往针对一个问题提供了多种解决方式,需要根据情况而定。
在初步编写类时,可以只编写一个无参的构造方法;如果使用这个类时,有
需要在创建对象的时对某个属性赋值,则再针对性的编写其它构造方法。
eg:
class Teacher{
private int age=10;
public Teacher(){
//this(20);
System.out.println("Teacher类无参的构造方法");
//在这个空参的构造方法中调用带参的构造方法
//Teacher(20);
}
//体现和以上无参构造方法的重载,开始出现带参数的构造方法
//这个参数写什么?这个参数通常是用于给某个属性赋值。
public Teacher(int age){
System.out.println("teacher类无参的构造方法");
//以下代码是为成员变量age赋值
this.age=age;
}
public void test(){
System.out.println("age="+age);
}
}
public class ConstructorDemo1{
public static void main(String[] args){
//给用Teacher类带参数的构造方法区创建对象
Teacher tt=new Teacher(20);
//验证带参数的构造方法为成员变量age赋值成功
tt.test();
}
}
四,构造方法的执行方式
加载时放在方法区
在执行时同样会在栈内存开辟空间(只不过它的调用是创建对象过程中被JVM自动调用的)。
在执行完时会立即释放栈内存空间。
和普遍方法的执行过程没有区别,只是调用时机不同。
五,对象的创建步骤:
加载
在类第一次使用前,需要把class加载入内存
创建
为对象创建空间
为成员变量开辟空间并默认初始化
为成员变量显示初始化
为this开辟空间
执行指定的构造方法(可能会有构造方法的嵌套使用)。
使用
注意:不是构造方法创建了对象,构造方法是创建对象的最后一个步骤(
它执行之前,实际对象已经创建完成)。
它是标识对象创建完成,可以开始使用。
六,带有构造方法的标准class编写
calss T{
private String name;
private int age;
//无参数的构造方法
public T(){
}
//带参数的构造方法
public T(String name, int age){
this.name=name;
this.age=age;
}
//settre getter方法
public String getName(){
return name;
}
public void setNmae(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}