5.3面向对象(构造函数,this)

1构造函数

  • 声明在类的内部
  • 方法名与类名一模一样的函数叫构造函数
  • 构造函数没有返回值
  • 构造函数可以包含参数
  • 作用:用来描述对象的创建过程

在mian方法中用Person p = new Person()实例化后,在用“p。xxx”来进行赋值操作,这样做有些不太合理,人的性别在人生下来时就确定了不会再去改变(人妖除外),所以这应该要先实例化的时候(在生的时候)就该确定,而不是在生下来了在去增加性别。

java的构造函数就是这个作用,可在初始化的时候进行赋值操作。


1.1不带参数构造函数

没有写构造函数是,会自动生成一个不带参数的构造函数,并且什么都不做

例:在Person中加入不带参数构造函数

class Person{
	String name;
	String sex;
	int age;
	
	//构造函数
	public Person(){
		name = "唐僧";
		sex = "男";
		age = 999;
	}
	

	public void sleep(){
		System.out.println(name+"在睡觉");
	}
}

main方法:

	public static void main(String[] args) {
		Person p = new Person();	//实例化类,创建对象。所以所对象是类的实例化
		
		//调用Person中的动态属性(函数)
		p.sleep(); 		//输出:唐僧在睡觉
	}

在main方法中没有赋值操作,输出结果依然是:唐僧再睡觉。

因为实例化对象的时候就已经进行了赋值。


1.2带参数的构造函数

手动写了一个带参数的构造函数时,JVM就不会再自动生成一个不带参数的构造函数

this关键字,实例化对象时,还有个this指针指向它


声明一个带参数的构造函数,例:

Person类:在构造方法中增加了String类型参数

class Person{
	String name;
	String sex;
	int age;
	
	public void sleep(){
		System.out.println(name+"在睡觉");
	}
	
	//构造函数
	public Person(String name){	//在这里增加了一个参数
		name = name;
		sex = "男";
		age = 999;
	}
}

main方法:

	public static void main(String[] args) {
		Person p = new Person("唐僧");	//这时需要传入参数,否者会报错
		
		p.sleep(); 		//输出:null在睡觉
	}

这时用new实例化的时候一定要传入与构造方法参数类型相同的参数

奇怪的是这里输出的是null在睡觉

因为在构造函数内这句出了问题

		name = name;

这句话jvm不知道name到底是形参name(就是构造函数参数中的name)还是实参(类中的name)。

所以需要加this,如:

		this.name = name;

1.3this指针

因为实例化对象时,还有个this指针指向它,看内存图:

1,如图片右边红线处,有个this指向该内存

2,当p中有参数是,会将这个参数压入栈中,如图左边红线

3,所以this.name = name 意思就是:this.name就是堆中的name,name 就是构造方法参数中的name



前面有个问题,如果写了一个带参数的构造函数时,就无法调用不带参数的构造方法,因为JVM没有创建不带参数的构造方法

解决方法:手动一个不带参数的构造函数

在写了一个不带参数的构造函数:

/*person类*/
class Person{
	//这些定义的变量就是Person类的静态属性
	String name;
	String sex;
	int age;
	
	//睡觉行为就是Person类的动态属性
	public void sleep(){
		System.out.println(name+"在睡觉");
	}
	
	//第一个构造函数
	public Person(String name){	
		this.name = name;
		this.sex = "男";
		this.age = 999;
	}
	
	//不带参数的构造函数
	public Person(){
		
	}
}
main方法:
	public static void main(String[] args) {
		Person p = new Person();	//现在不传入参数就不会报错了
		
		p.sleep(); 		//输出:null在睡觉
	}
这里输出的是: null在睡觉,因为不带参数构造方法我没有写写赋值操作







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值