构造方法与this关键字

一、什么是构造方法?

构造方法(也被称为构造器)是类的一个特殊成员方法,在类实例化对象时自动调用。

注意事项:

1.构造方法的名称必须和类名保持一致
2.构造方法没有任何返回值类型
3.构造方法在类对象创建时自动被调用,一个对象只调用一次

二、什么是静态代码块?

静态代码块就是被static关键字修饰的代码块

public class Test1 {
	public Test1() {
		System.out.println("类的初始化数据构造方法");
	}
	static {
		System.out.println("类的初始化数据static");
	}
	public static void main(String[] args) {
		Test1 a = new Test1();
		Test1 b = new Test1();
	}
}

运行结果:
类的初始化数据static
类的初始化数据构造方法
类的初始化数据构造方法

可以看出当创建两个类的对象时,构造方法被调用了两次而静态代码块只调用了一次,并且静态代码块比构造方法优先执行,这说明构造方法可以反复初始化调用,而静态代码块只调用一次

三、构造方法的重载

从上述代码可以知道类对象被创建时,构造方法会被自动调用,而一般情况下我们并不会在每个类里面都写上构造方法,那为什么还能创建对象呢?原因是在每个类中都会有默认的构造方法,这个构造方法的方法体没有任何代码

public class Test1 {
	public Test1() {//默认存在的构造方法,方法体为空
	}
}

方法重载:

同一个类中有多个方法名字相同 但是参数的个数和参数的类型不同叫做方法重载 (与返回值无关)

public class Dog {
	//定义三个属性:姓名、年龄、性别
	String name;
	int age;
	String sex;
	public Dog(String a,int b) {//两个参数
		name = a;
		age = b;
	}
	public Dog(String a,int b,String c) {//三个参数
		name = a;
		age = b;
		sex = c;
	}
	//定义一个自我介绍的方法
	public void introduce() {
		System.out.println("我是"+name+",今年"+age+"岁,我的性别是"+sex);
	}
	public static void main(String[] args) {
		Dog dog1 = new Dog("旺财",4);
		Dog dog2 = new Dog("哈士奇",2,"男");
		dog1.introduce();
		dog2.introduce();
		
	}
}

运行结果:
	
我是旺财,今年4,我的性别是null
我是哈士奇,今年2,我的性别是男

可以看出dog1调用了两个参数的构造方法,dog2调用了三个参数的构造方法,因为dog1没有给性别赋值所以为空

四、this关键字

作用:

1.调用该类中的属性
2.调用该类中的普通方法
3.调用该类中的构造方法
4.当构造方法的形参和类的成员变量名相同时,可以用this区分

public class Dog {
	String name;
	int age;
	String sex;
	public Dog() {//无参
		System.err.println("我是一只狗");
	}
	public Dog(String a,int b,String c) {
		this();//用this调用无参的构造方法
		name = a;
		age = b;
		sex = c;
	}
	public void cry() {
		System.out.println("呜呜呜呜~");
	}
	public void shout() {
		System.out.println("我要大叫了");
		this.cry();//用this调用类中的普通方法
	}
	public static void main(String[] args) {
		Dog dog2 = new Dog("哈士奇",2,"男");
		dog2.shout();
		
	}
}

运行结果:
我要大叫了
呜呜呜呜~
我是一只狗

注意:

1.使用this关键字调用构造方法只能在其他的构造方法中调用
2.必须位于第一行且只能调用一次
3.格式为this(参数1,参数2,参数3…)

当构造方法的参数和成员变量名相同时:

public class Dog {
	String name;
	int age;
	String sex;
	public Dog(String name,int age,String sex) {
		name = name;
		age = age;
		sex = sex;
	}
	public void introduce() {
		System.out.println("我是"+name+",今年"+age+"岁,我的性别是"+sex);
	}
	public static void main(String[] args) {
		Dog dog2 = new Dog("哈士奇",2,"男");
		dog2.introduce();
		
	}
}

运行结果:
我是null,今年0,我的性别是null

可以看到实参并没有赋值给成员变量,那是应为构造方法中的形参和成员变量的名称相同,编译器无法区分形参和成员变量,因此无法赋值,针对此问题,Java中可以用this关键字来区分

public class Dog {
	String name;
	int age;
	String sex;
	public Dog(String name,int age,String sex) {
		this.name = name;//this.name表示成员变量
		this.age = age;
		this.sex = sex;
	}
	public void introduce() {
		System.out.println("我是"+name+",今年"+age+"岁,我的性别是"+sex);
	}
	public static void main(String[] args) {
		Dog dog2 = new Dog("哈士奇",2,"男");
		dog2.introduce();
		
	}
}

运行结果:
我是哈士奇,今年2,我的性别是男
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值