Java中this关键字的三个常见用法

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 自动调用可以随时手动调用
作用时机创建对象时只执行一次创建对象后可多次调用

构造方法:

成员方法:

 三、成员变量和字段通常可以认为是一个东西

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值