java基础-12.1 面向对象(构造方法、this)

本文深入解析构造方法的作用、定义格式及与普通方法的区别,同时详细阐述this关键字的运用,包括通过this调用不同构造方法及在内存中的运作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、构造方法

1.1 构造方法介绍

1.2 构造方法的内存:

1.3 构造方法的重载

1.4 构造方法和一般方法区别

2、this关键字

2.1 this调用构造方法

2.2 this在构造方法调用的内存图:

2.3 this的应用


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;
	}
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值