成员变量
成员变量的默认值:
基本类型 | 整数(byte,short,int,long) | 0 |
浮点数(float,double) | 0.0 | |
字符(char) | ‘\u0000’ | |
布尔(boolean) | false | |
数据类型 | 默认值 | |
引用类型 | 数组,类,接口 | null |
成员变量的内存图:
区域名称 | 作用 |
程序计数器 | 程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址 |
本地方法栈 | 当程序中调用了native的本地方法时,本地方法执行期间的内存区域 |
方法区 | 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 |
堆内存 | 存储对象(包括数组对象),new来创建的,都存储在堆内存 |
虚拟机栈 | 用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放 |
成员方法
方法也叫函数,是一个独立功能的定义,是一个类中最基本的功能单元
把一个功能封装为方法的目的是,可以实现代码重用,从而减少代码量
方法的使用原则:
(1)必须先声明后使用
(2)不调用不执行,调用一次执行一次
成员方法的分类:
- 实例方法:没有static修饰的方法,必须通过实例对象来调用
- 静态方法:有static修饰的方法,也叫类方法,可以由类名来调用
如何声明方法:
(1)方法声明的位置必须在类中方法外
(2)语法格式:
【修饰符】 返回值类型 方法名(【参数列表:参数类型1 参数名1,参数类型2 参数名, ...... 】){
方法体;
【return 返回值;】
}
如何在其它类中调用方法:
(1)实例方法
对象名.实例方法(【实参列表】) //必须通过对象来访问
(2)类方法
类名.类方法(【实参列表】) //推荐 对象名.类方法(【实参列表】) //不推荐
- 形参:在定义方法时方法名后面括号中声明的变量称为形式参数(简称形参),即形参出现在方法定义时
- 实参:调用方法时方法名后面括号中使用的值/变量/表达式称为实际参数(简称实参),即实参出现在方法调用时
总结:
(1)调用时,需要传“实参”,实参的个数、类型、顺序要与形参列表一一对应
如果方法没有形参,就不需要也不能传实参
(2)调用时,如果方法有返回值,可以接收或处理返回值结果,当然也可以不接收,那么此时返回值就丢失了
如果方法的返回值类型是void,不需要也不能接收和处理返回值结果
在本类中访问本类的成员变量和成员方法
直接用,不需要加“对象名.”和“类名.”
唯一例外:静态方法中不能直接访问本类的非静态的成员变量和成员方法
1 class Test{ 2 3 static void test(){ 4 System.out.println(""); 5 } 6 void method(){ 7 test(); 8 } 9 10 public static void main(String[] args){ 11 method();//错误 12 test();//正确 13 } 14 }
方法调用内存分析
方法不调用不执行,调用一次执行一次,每次调用会在栈中有一个入栈的动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值,但方法执行结束后,会释放该内存,称为出栈。如果方法有返回值,就会把结果返回调用处;如果没有返回值,就直接结束,回到调用处继续执行下一条指令
栈结构:先进后出,后进先出
方法的参数传递机制
方法的参数传递机制:实参给形参赋值
方法的形参是基本数据类型时,形参值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值
成员变量与局部变量的区别
(1)声明的位置不同
- 成员变量:类中方法外
- 局部变量:方法中
(2)初始值不同
- 成员变量:有默认值
- 局部变量:必须手动初始化
(3)内存存储位置不同
- 成员变量:
- 类变量:方法区
- 实例变量:堆
- 局部变量:栈
(4)生命周期
- 成员变量:
- 类变量:和类的生命周期相同,该类所有对象共享
- 实例变量:每一个对象的实例变量的生命周期是独立的,随着对象的创建而创建,随着对象的回收而消失
- 局部变量:随着方法被调用执行在栈中分配,方法调用结束内存就释放,而且还有作用域问题
(5)修饰符
- 成员变量:有很多修饰符,例如:public,private,static等
- 局部变量:不能有修饰符