对象在内存中的分配
栈(Stack): 方法内定义的变量,存储在栈中
堆(heap):new 出来的结构(比如:数组实体,对象的实体)。包括对象中的属性
方法区(method area):存放类的模版
变量
成员变量:方法体外,类体内
局部变量:方法体内部等位置声明的变量
二者区分方式:
相同点:
- 变量声明的格式相同:数据类型 变量名=变量值
- 变量都有其有效的作用域:出了作用域就失效
- 变量必须声明,后赋值,再使用
不同点
类中声明的位置的不同:
属性:声明在类内,方法外的变量
局部变量:声明方法、构造器内部的变量
在内存中分配的位置不同
属性:随着对象的创建,存储在堆空间中
局部变量:存储在栈空间中
生命周期
属性:随着对象的创建而创建随着对象的消亡和消亡
局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着对应栈帧出栈,局部变量消亡
作用域:
属性:在整个类的内部都是有效
局部变量:仅限于声明局部变量所在的方法(构造器、代码块)中
权限修饰符进行修饰:
权限修饰符:public、protected、缺省、Private(用于表名所修饰的结构可调用的范围的大小)
属性:可以使用权限修饰符
局部变量:不能使用任何权限修饰符
默认值
属性:都有默认初始化值
局部变量:都没有默认初始化值
方法
语法:
权限修饰符 返回值类型 方法名(形参列表)[throws 异常类型] {
// 方法体
}
方法调用的内存解析
形参:方法在声明时,一对()内声明的一个或多个形式参数
实参:方法在被调用时,实际传递给形参的变量或常量
对象数组:数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用类型中的类时
方法的重载
定义:在同一个类中,允许在一个以上的同名方法,只要它们的参数列表不同即可。
编译器如何判断两个方法是相同的:
方法名相同,且形参列表相同。
编译器先通过方法名确定了一波重载的方法,进而通过不同的形参列表,确定具体的方法
同一个类中不允许定义两个相同的方法
可变个数形参的方法
使用场景: 在调用方法时,可能出现方法形参的类型是确定的,但是参数的个数不确定。
语法: (参数类型 … 参数名)
说明:
- 可变个数形参方法调用时,针对于可变的形参赋的实参个数可以为0,1,或多个
- 可变个数形参的方法与同一个类中,同名的多个方法之间可以构成重载
- 特例:可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组, 不构成重载. (因此可以把可变形参看成一个数组)
- 可变个数形参必须声明在形参列表的最后
方法的值传递机制
方法内声明的局部变量来说,如果出现赋值操作
- 基本数据类型变量: 将变量的数值传递出去
- 引用数据类型变量: 将变量的地址值传递出去
方法的参数的传递机制:值传递机制
规则:实参给形参赋值的过程
- 若形参是基本数据类型变量,则实参保存的数值赋给形参
- 如果形参是引用数据类型变量,则将实参保存的地址赋给形参。
递归方法
递归分类:
- 直接递归:方法自身调用自己
- 间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法
注意:
递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢得多
在要求高性能的情况下尽量避免使用递归,递归既花时间又耗内存。考虑使用循环迭代
关键字:package、import
package说明
一个源文件只有一个声明包的package语句
包名,属于标识符,满足标识符命名规则和规范(全部小写)
- 包通常使用所在公司的域名的倒置
包对应于文件系统的目录,package语句中用”.”来指明包的层次。
同一个包下可以声明多个结构(类、接口),但不能定义同名的结构。
包的作用
- 包可以包含类和子包,划分项目层次便于管理
- 帮助管理大型软件系统:将功能相近的类划分到同一个包中
- 解决类命名冲突的问题
- 控制访问权限
import
注意事项:
- 如果使用’a.*’导入结构,表示可以导入a包下的所有结构如java.util.
- 如果导入的类或接口是java.lang包下或者是当前包下的,则可以省略import语句
- 如果已经导入java.a包下的类,那么如需要使用a包的子包下的类的话,仍然需要导入
- 在代码中使用不同包下的同名的类,需要使用类的全类名的方式指明调用的是哪个类