第八章 对象内存解析与方法重载

面向对象基础

对象内存解析与方法重载

一、Java内存模型

Java虚拟机对分配给它的计算机内存的管理。
在这里插入图片描述

1、虚拟机栈(VMStack)

存储基本数据类型变量和对象的地址。
(1)栈:是一种数据结构,其特征就是先进后出,将数据进入称之为进栈,将数据输出称之为出栈。
(2)栈结构在查找数据时比较快,但是存储空间小。
(3)在Java种,我们将常用的基本数据类型变量,以及对象的地址(对象本身不在虚拟机栈)存储在虚拟机栈中,能够快速进行查找,如果找到,那么就使用该变量,否则不能使用。
(4)Java在创建一个变量时,这个变量会进入到虚拟机栈中,当该变量离开其作用域的时候,就会从虚拟机中弹出,即出栈。

2、堆(Heap)

存储对象和数组。
(1)堆的特征就是存储空间较大,可以认为所存储的数据会寻找一个合适的位置进行存储。
(2)凡是通过new关键字创建的对象和数组都会放在堆空间中,然后将这个对象在堆空间中的内存地址保存到虚拟机栈中。

3、方法区(Method Area)

存储类的信息、常量(使用static final修饰的变量)、静态变量(使用static修饰的变量)、字符串常量池(有一部分的String类型的值存储在字符串常量池中)。

4、本地方法栈(Native Method Stack)

主要时虚拟机用到的native方法相关,一般情况下,我们不需要特别关注此部分。

5、程序计数器(Program Counter Register)

记录当前线程运行情况。

二、构造方法(Constructor Method)

1、什么是构造方法

(1)构造方法是一类很特殊的方法,它的方法名和类名保持一致,而且该方法没有返回值类型。
(2)构造方法也叫构造器。

2、语法结构

[访问修饰符] 类名([参数列表]){
//省略方法体的代码
}

3、作用

(1)初始化对象信息。
(2)和new关键字一起创建对象。

4、说明

(1)如果没有显式的定义类的构造方法的话,则系统默认提供一个空参的构造方法。
(2)一旦我们显式的定义了类的构造方法之后,系统就不会再提供默认的空参构造方法。
(3)一个类中,至少会有一个构造方法。
(4)一个类中定义多个构造方法,彼此构成重载。

5、理解“User user = new User();”

在这里插入图片描述
(0)Java首先去方法区中获取User类型的相关信息。
(1)将该对象的对象名(将来存储对象内存地址)在虚拟机栈中存储。
(2)new关键字根据User类型的信息,在堆空间中开辟空间,用于存储该对象。
(3)new关键字在堆空间中开辟User对象的内存空间后,开始根据User类型信息,将这个开辟的空间根据User对象的属性,进行进一步划分,用于存储对象的属性信息。

至此,标志User类型的对象在堆内存中开辟和创建工作结束。
(4)在new结束工作后,形成User类型的对象,但是未进行赋值运算,因此该对象在虚拟机栈中是找不到任何地址,那么Java此时会生成一个临时的名字,使用关键字this代表当前对象,将其存储到虚拟机栈中。
(5)对已经创建好的User类型的对象进行后续的初始化工作,最重要的就是对这个对象的属性进行赋值,如果没有明确的设定,那么采用默认值。
(6)构造方法执行完毕后,该对象的属性都存在初始值,那么整个对象创建完毕,最后进行赋值运算,也就是将当前变量this中所存储的对象地址存储到User类型的对象user中,this临时对象出栈。

6、this关键字

(1)this关键字可以用来修饰:属性、方法、构造器。
(2)作用:

  • 在方法内部使用:这个方法所属对象的引用。
  • 在构造器内部使用:表示该构造器正在初始化对象。

(3)this关键字修饰属性和方法
this理解为:当前对象或者正在创建的对象。

  • 在类的方法中,我们可以使用“this.属性”或"this.方法"的方式,来调用当前对象属性或方法。但是在通常情况下,我们都选择省略“this.”。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用“this.变量”的方式,表明此变量时属性,而非形参。
    在这里插入图片描述
  • 在类的构造器中,我们可以使用“this.属性”或"this.方法"的形式,调用当前正在创建的对象属性或者方法。但是在通常情况下,我们都选择省略“this.”。特殊情况下,如果构造方法的形参和类的属性同名时,我们必须显式的使用“this.变量”的方式,表明此变量时属性,而非形参。

在这里插入图片描述
(4)this调用构造方法

  • 我们在类的构造方法中,可以显式的使用“this(形参列表)”方式,调用本类中指定的其他构造方法。
  • 构造方法中不能通过“this(形参列表)”方式调用自己。
  • 如果一个类中有n个构造方法,最多有n-1个构造方法中使用了“this(形参列表)”。
  • 规定:“this(形参列表)”必须声明在当前构造方法的首行。
  • 构造方法内部,最多只能声明一个"this(形参列表)",用来调用其他构造方法。

三、方法重载(OverLoad)

1、目的

为了提高放发调用者的使用便捷性、能够让调用者感受到通过调用一个方法,可以传入不同的参数,那么就要求这些方法的方法名必须保持一致,因此就产生了方法的重载现象。

2、理解

在一个类中,多个方法之间,方法名相同,但是参数列表不同的现象,即“两同一不同”。

3、规则

(1)被重载的方法的参数列表必须不相同,要不然参数的类型不相同,要不然参数个数不同。
(2)被重载的方法可以改变返回值类型,方法重载和返回值类型无关。
(3)被重载的方法可以改变访问修饰符。
(4)被重载的方法可以声明新的或者更广的检查异常。
(5)方法可以在同一个类或者一个子类中被重载。
(6)无法以返回值作为重载的区分。

4、代码展示
/**
 * 方法重载实现:
 * 定义三个方法:方法名为mOL
 * 三个方法分别接收int参数、两个int参数、一个字符串参数。
 * 分别执行平方运算并输出结果,相乘并输出结果,输出字符串信息。
 * @author Lenovo
 *
 */
public class OverLoadExer {
	public static void main(String[] args) {
		OverLoadExer ole = new OverLoadExer();
		ole.mOL(3);
		ole.mOL(3, 4);
		ole.mOL("哈哈哈");
	}
	
	public void mOL(int a) {
		int result = a*a;
		System.out.println(result);
	}
	
	public void mOL(int a,int b) {
		int result = a*b;
		System.out.println(result);
	}
	
	public void mOL(String a) {
		System.out.println(a);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值