该笔记源自学习《2020-最新全套黑马57期》时所创作
面向对象基础
对象的创建和使用
-
导包
import 包名称.类名称
- 指出所需要的使用的类在什么位置
- 若和当前类属于同一个包,则省略导包语句不写
-
创建
- 格式:类名称 对象名 = new 类名称();
//根据student类,创建一个名为stu的对象 Student stu = new Student();
-
使用
-
用成员变量:对象名.成员变量名; 若没赋值,则会有一个默认初始值
-
用成员方法:对象名.成员方法名(参数);
-
对象调用方法的内存图
一个对象调用一个方法内存图
栈:先进先出
- 当成员方法被调用时,会入栈,压在main方法上面;
- 当成员方法运行结束,会弹栈,此时继续执行main方法;
- main方法运行结束,会弹栈,所有内存会消失,程序结束。
堆:
- new创建的对象都储存在堆里面,并也会有个地址,使得在调用对象时栈的寻址(如红色线所示)
- 成员方法在堆中存储的是地址,从而寻址在方法区中找到对应方法调用运行入栈(如绿色线所示)
方法区:
- 存储成员变量
- 存储成员方法
两个对象调用一个方法内存图
- 原理和一个对象调用一个方法内存图一样,只是当第二个对象调用时与第一个对象调用井水不犯河水,根据对象中方法标记(即地址值),去类中寻找方法信息,赋值堆中对象地址。
- 当引用类型作为参数,传递到方法中或者作为方法返回值的时候,则传递的值或返回的值是地址值。
成员变量和局部变量的区别
局部变量 | 成员变量 | |
---|---|---|
定义在类的位置 | 方法内部 | 类中,方法外 |
作用范围 | 方法中,出了方法就不能用 | 整个类可以通用 |
默认值 | 没有,需先定义,手动赋值,再使用 | 有,规则同数组 |
在内存中的位置 | 栈内存 | 堆内存 |
生命周期 | 随着方法调用而诞生,随着方法调用完毕而消失 | 随着对象创建而诞生,随着对象被垃圾回收而消失 |
前三点区别用代码解释说明如下:
public class VariableDifference {
String name; //成员变量
public void methodA() {
int num = 20; //局部变量
System.out.println( num );
System.out.println( name );
}
public void methodB( int param ) {
//方法的参数是局部变量
System.out.println(param);//这里局部变量未赋值但不出错,是因为参数在方法调用时,一定会被赋值。
//因为方法需要被调用才能执行,调用方法一定会传参数,即被赋值。
int age; //局部变量
// System.out.println( age ); // 没赋值不能用
// System.out.println( num ); // 错误写法,num是方法A中的局部变量,不能用
System.out.println( name );// 输出的会是一个默认值
}
}