JAVA 面向对象 构造函数 构造代码块 this

1 构造方法

1.1 概念

构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
构造方法的主要功能就是完成对象创建或者初始化
当类创建对象(实例化)时,就会自动调用构造方法
构造方法与普通方法一样也可以重载.

1.2 形式

与类同名,且没有返回值类型,可以含参也可以不含参
在这里插入图片描述
关于构造函数怎么记忆:

  1. 特点:方法名与类名相同,且没有返回值类型
  2. 执行时机:创建对象时立即执行
  3. 默认会创建无参构造,但是,如果自定义了含参构造,默认的无参构造会被覆盖,注意要手动添加哦

2 构造带买块与局部代码块

2.1 形式

{代码……}

2.2 构造代码块的特点

  1. 位置: 在类的内部,在方法的外部
  2. 作用: 用于抽取构造方法中的共性代码
  3. 执行时机: 每次调用构造方法前都会调用构造代码块
  4. 注意事项: 构造代码块优先于构造方法加载

2.3 局部代码块的特点

  1. 位置: 在方法里面的代码块
  2. 作用: 通常用于控制变量的作用范围,出了花括号就失效
  3. 注意事项: 变量的作用范围越小越好,成员变量会存在线程安全的问题

2.4 测试代码块的加载顺序

package cn.oop;
/**本类用于测试代码块的加载顺序*/
/**
 * 总结:
 * 1.当创建对象时,程序会自动调动构造方法,但是如果有构造代码块,会先去执行构造代码块,再执行构造方法
 * 2.当通过对象调用方法时,会执行方法中的功能,如果方法中有局部代码块,就会执行局部代码块
 * 3.执行顺序: 构造代码块-->构造方法-->局部代码块[前提:调用方法(如果方法有局部代码块,局部代码块才会执行)]
 * 4.构造代码块的功能: 用于提取构造方法中的共性
 * 5.局部代码块的功能:控制变量的作用范围
 * */
public class TestBlock {
	public static void main(String[] args) {
		//5.在main()中创建对象进行测试
		Teacher t = new Teacher();/**每次创建对象时/new时,都会执行一次构造代码块*/
		Teacher t2 = new Teacher();
		Teacher t3 = new Teacher("大中华");
		t.study();
	}
}

//1.创建一个Teacher类用于测试
class Teacher{
	String subject;//2.定义成员变量科目,全局生效
	//6.定义构造代码块
	{
		/**构造代码块的位置:类里方法外
		 * 作用:用于提取构造方法中的共性内容
		 * 执行时机:优先于构造方法执行*/
		subject = "Java培优";
		System.out.println("构造代码块");
	}
	
	//3.定义构造方法
	//3.1创建本类的无参构造
	public Teacher() {
		System.out.println("我是Teacher类的无参构造"+subject);
	}
	
	//3.2创建本类的含参构造
	public Teacher(String n) {
		System.out.println("我是Teacher类的含参构造"+n+subject);
	}
	
	//4.定义普通方法
	//方法定义:修饰符 返回值类型 方法名(参数列表){方法体...}
	public void study() {
		//7.创建局部代码块
		/**局部代码块的位置:方法里
		 * 作用:控制变量的作用范围(作用范围越小越好,因为越小越安全)
		 * 执行时机:调用本方法时*/
		{
			int i = 10;
			System.out.println(i);
		}
		//System.out.println(i);//报错,因为超出i的作用范围
		System.out.println("正在备课...");
	}
}

3 this

3.1 概念

this表示本类对象的一个引用对象

3.2 形式

在这里插入图片描述

3.3 练习: this练习之变量名相同时使用

package cn.oop;
/**本类用于this测试
 * 当一个类中有两个同名的变量,一个成员变量,一个局部变量
 * 想使用本类的成员变量时,可以用this指定一下
 * this代表的就是"本类",成员变量属于类
 * */
public class TestVariableThis1 {
	public static void main(String[] args) {
		Cat c = new Cat();
		c.eat();
	}
}
//1.创建Cat类
class Cat{
	int sum = 20;
	int s = 30;
	
	public void eat() {
		int sum = 10;//局部变量
		System.out.println(sum);//10,使用的是局部变量sum,就近原则
		System.out.println(s);
		
		//可以通过this关键字来调用成员变量 ,前提:成员变量与局部变量同名时
		//如果不使用this指定,那么打印10,因为变量的就近原则,使用的是局部变量sum
		System.out.println(this.sum);//通过this.访问了本类的成员变量sum
	}
}

4 创建对象的流程

Person p = new Person();//短短这行代码发生了很多事情
1.把Person.class文件加载进内存
2.在栈内存中,开辟空间,存放引用变量p
3.在堆内存中,开辟空间,存放Person对象
4.对成员变量进行默认的初始化
5.对成员变量进行显示初始化
6.执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
7.堆内存完成
8.把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值