目录
1、构造方法
1.1 构造方法介绍
为什么需要:在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名、年龄等属性信息。
自定义的Person类,成员变量:name ,age。
要求在new Person的同时,就指定好name,age的值
实现功能,利用方法去实现,构造方法,构造器 Constructor
作用:在new的同时对成员变量赋值,给对象的属性初始值赋值, new Person 对属性name,age赋值
class Person {
// Person的成员属性age和name
private int age;
private String name;
// Person的构造方法,拥有参数列表
Person(int a, String nm) {
// 接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
}
构造方法的定义格式:
权限 方法名(参数列表){
}
// 原本一般方法定义格式:修饰符 返回值类型 方法名(参数列表){ return}
(权限也算在修饰符之内)
注意: 方法的名字,必须和类的名字完全一致,构造方法不允许写返回值类型, void 也不能写。
构造方法在什么时候运行呢,在new的时候自动执行,只运行一次,仅此一次,new一次执行一次。
每个class必须拥有构造方法,构造方法不写也有,编译的时候,javac,会自动检查类中是否有构造方法。如果有,就这样, 如果没有,编译器就会自动添加一个构造方法。
编译器自动添加的构造方法:public Person( ){ },自己手写了构造方法,编译的时候,不会自动添加构造方法!
1.2 构造方法的内存:
- 图解说明:
1、首先会将main方法压入栈中,执行main方法中的 new Person("张三",20);
2、在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x001)。然后给成员变量进行默认初始化(name=null,age=0)。
3、执行构造方法中的代码(age = a ; name = nm;),将变量age对应的20赋值给age,将变量name对应的”张三"赋值给name,这段代码执行结束后,成员变量age和name的值已经改变。执行结束之后构造方法弹栈,Person对象创建完成。将Person对象的内存地址0x001赋值给p。
1.3 构造方法的重载
public Person() {
}
public Person(String name, int age) {
this.name=name;
this.age=age;
}
public class Test {
public static void main(String[] args) {
Person p1=new Person();
p1.setAge(18);
p1.setName("wangwang");
System.out.println(p1.getName());
System.out.println(p1.getAge());
Person p2=new Person("xiaoqiang",23);
System.out.println(p2.getName());
System.out.println(p2.getAge());
}
}
1.4 构造方法和一般方法区别
定义和执行:
构造方法 | 一般方法 | |
定义:
| 权限 方法名(参数列表){ } | 修饰符 返回值类型 方法名(参数列表){ return} |
执行: | 在new的时候执行 | 在对象创建后,需要使用时才被对象调用,并可以被多次调用 |
2、this关键字
2.1 this调用构造方法
构造方法之间的调用,可以通过this关键字来完成。
public class Person {
private String name;
private int age;
public Person() {
// name="李四";
// age=20;
// 调用了有参数的构造方法
// 参数李四,20传递给了变量name,age
this("李四", 20);//必须写在构造方法中的第一行
// this()调用其他的构造方法
}
/*
* 构造方法,传递String,int
* 在创建对象的同时为成员变量赋值
*/
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
// 创建Person的对象,调用的是空参数的构造方法
// 运行的结果 null 0
Person p = new Person();//运行结果 李四,20
// Person p = new Person("张三", 21); 运行结果是张三,21
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
2.2 this在构造方法调用的内存图:
凡是方法里面和成员变量的变量名重复了,想区分成员变量,必须写this.(this.是成员变量)
2.3 this的应用
学习完了构造方法、this的用法之后,现在做个小小的练习。
需求:在Person类中定义功能,判断两个人是否是同龄人
class Person {
private int age;
private String name;
// 给姓名和年龄初始化的构造方法
Person(String name, int age) {
// 当需要访问成员变量是,只需要在成员变量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
// 判断是否为同龄人
public boolean equalsAge(Person p) {
// 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较
// 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替
/*
* if(this.age == p.age) { return true; } return false;
*/
return this.age = p.age;
}
}