面向对象基础
对象内存解析与方法重载
一、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);
}
}