面向对象05-构造器-Java

Java构造器详解:创建、语法与使用细节

一、引入构造器

一个需求:在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做?
这时就可以使用构造器。

二、构造器

1、介绍

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化

说明“初始化”:走到构造器这个层面的时候,对象已经存在了。只是对对象属性的值进行初始化。构造器是初始化对象,不是创建对象。

2、特点

  1. 方法名和类名相同
  2. 没有返回值
  3. 在创建对象时,系统会自动调用该类的构造器完成对象的初始化。

3、基本语法

[修饰符] 方法名(形参列表) {
方法体;
}

说明

  1. 构造器的修饰符可以默认, 也可以是 public protected private
  2. 构造器没有返回值
  3. 方法名 和类名字必须一样
  4. 参数列表 和 成员方法一样的规则
  5. 构造器的调用, 由系统完成
  6. 属性有默认值。构造器对进行属性初始化操作,如果有的属性没有初始化到,会有默认值。

4、案例

	public class Constructor01 {
	//编写一个 main 方法
		public static void main(String[] args) {
			Person p = new Person("smith", 80);
			System.out.println("name = " + p.name +" age = "+p.age);
		}
	}
	
	class Person {
		String name;
		int age;
		public Person(String pName, int pAge) {
			System.out.println("构造器被调用 完成对象属性的初始化");
			name = pName;
			age = pAge;
		}
	}

在这里插入图片描述

5、注意事项和使用细节

(1)一个类可以定义多个不同的构造器,即构造器重载
(2)构造器名和类名要相同
(3)构造器没有返回值
(4)构造器是完成对象的初始化,并不是创建对象
(5)在创建对象时,系统自动的调用该类的构造方法
(6)如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器),比如 Dog (){ },使用 javap 指令反编译看看
(7)一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下,即:Dog (){ } 写(这点很重要)

补充说明(6)
编译之后 目录下会出现一个Dog.class。程序员使用反编译指令 javap 就可以把 Dog.class 变成 Dog类。
源代码为:

	class Dog {
	
	}

在这里插入图片描述
在JDK的bin安装目录下
在这里插入图片描述
在这里插入图片描述

javap使用资料请见韩顺平老师分享的资料。

补充说明(7)
源代码:

	class Dog {
		Dog(String pName) {
			//
		}
	}

由反编译指令可以看出,现在只有参数为String的构造器。
在这里插入图片描述
说明默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下。
修改源代码为:

	class Dog {
		public Dog(String pName) {
			//
		}
	
		Dog() {
			
		}
	}

在这里插入图片描述

三、对象创建流程

流程分析

	class Person {
		String name;
		int age = 90;
		Person(String n, int a) {
			name = n;
			age = a;
		}
	}
	
	Person p = new Person("小倩", 20);

分析Person p = new Person(“xxx”, 20);到底发生了什么事情。

①方法区加载 Person 类信息。
②new 在堆开辟空间,先进行默认初始化,age第一次填写进去的是0,name第一次填写的是null。
③然后进行显式初始化,age变成90,此时name还是空
④处理构造器。
“小倩”存放在方法区的常量池,name从null改为指向常量区地址
20赋给age
此时,上述流程结束后,new才算做完。
返回地址给p
在这里插入图片描述

请注意,真正的对象指的是堆里面的。P本质是对象的引用/名字。

流程分析(面试题)

  1. 加载Person类信息(Person.class),只会加载一次
  2. 在堆中分配空间(地址) 。分配空间就会自动分配地址
  3. 完成对象初始化
    [3.1默认初始化 age=0 name=null
    3.2显式初始化age=90,name=null,
    3.3构造器的初始化 age =20,name=小倩]
  4. 在对象在堆中的地址,返回给p(p是对象名,也可以理解成是对象的引用)

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值