1.引用当前对象的成员变量(解决成员变量与形参重名的情况)
2.调用当前对象的成员方法
3.调用当前类的其他构造方法(只能在构造方法的第一行使用)
先来看一个例子:
public class Person {
//成员变量
private String name;
private int age;
//构造方法1,使用this调用构造方法
public Person() {
this("未知",0);
System.out.println("无参构造方法被调用。");
}
//构造方法2,使用this区分成员变量和形参
public Person(String name,int age) {
this.name=name;//this引用成员变量
this.age=age;
System.out.println("带参构造方法被调用。");
}
//成员方法1
public void introduce() {
//this调用成员方法,这里this可用可不用,主要是为了强调
this.sayHello();
System.out.println("我是"+this.name+",今年"+this.age+"岁。");
}
//成员方法2
public void sayHello() {
System.out.println("你好!");
}
public static void main(String[] args) {
Person p1=new Person();//创建一个对象,会先调用一个无参构造方法,再调用另一个带参构造方法
p1.introduce();
System.out.println();
Person p2=new Person("小红",20);//会直接调用带参那个构造方法
p2.introduce();
}
}
输出结果:
带参构造方法被调用。
无参构造方法被调用。
你好!
我是未知,今年0岁。
带参构造方法被调用。
你好!
我是小红,今年20岁。
this是通过什么方法确定自己调用的构造方法:
Java编译器会根据this(...)
里面传入的参数类型和数量以及顺序,去匹配最符合的构造方法。这里就涉及到方法重载的知识点,不做细讲。
看个例子:
public class Person {
String name;
int age;
// 构造方法1:无参
public Person() {
this("未知", 0); // 通过参数个数+类型,匹配的是构造方法3
System.out.println("无参构造被调用");
}
// 构造方法2:一个参数
public Person(String name) {
this.name = name;
this.age = 0;
System.out.println("一个参数的构造被调用");
}
// 构造方法3:两个参数
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("两个参数的构造被调用");
}
}
那如果同时有两个参数类型和数量撞了呢?
答案是:Java 不允许参数类型和数量“撞了”的重载情况,因为编译器就无法区分你想调用哪一个方法,会直接报错!
那如果名字不同,类型类似但不同行不行?
比如:
public class Person {
private String name;
private int age;
public Person() {
this("未知",0);
System.out.println("无参构造方法被调用。");
}
public Person(String name, int age) {
System.out.println("构造1");
}
public Person(String name, Integer age) { // Integer 是包装类
System.out.println("构造2");
}
public static void main(String[] args) {
new Person("张三", 18); // 会匹配 int 的构造方法(构造1)
new Person("李四", Integer.valueOf(18)); // 会匹配 Integer 的构造方法(构造2)
}
}
输出:
所以这是可以的,但是调用时要注意参数的输入是否匹配。
同时如果名字相同,类型也相同,但参数顺序不同,编译器也是可以识别的。
简单来讲,当把一堆构造方法拿给你,如果你自己能根据参数的不同区分是哪个构造方法,那编译器也可以区分,但是你区分不了的话,那编译器也区分不了。
几个补充概念:
一、什么是对象?
对象是类的实例化结果。
类(class)就像一个“模版”,而对象就是根据这个模板“制造”出来的“具体的东西”。
public class Dog {
String name;
int age;
public void bark() {
System.out.println("汪汪!");
}
}
// 创建对象
Dog d = new Dog();
d.name = "小黑";
d.age = 3;
d.bark();
这个d就是一个对象,他是Dog类的一个实例,他拥有自己的name,age和bark()方法。
二、怎么区分构造方法和成员方法?
项目 | 构造方法 | 成员方法 |
---|---|---|
定义目的 | 用于创建对象并初始化属性 | 对象的行为(功能) |
名字 | 必须和类名 一模一样 | 随便起(符合命名规范即可) |
有无返回值 | 没有返回值,甚至不能写 void | 必须有返回值声明(哪怕是 void ) |
是否可以手动调用 | 一般由 new 自动调用 | 可以随时手动调用 |
作用时机 | 创建对象时只执行一次 | 创建对象后可多次调用 |
构造方法:
成员方法: