方法的重载
方法的重载(Overload),相当于是一词多义,如:
public static int add (int a, int b) {
return a + b;
}
public static double add (double a, double b) {
return a + b;
}
1.方法名称相同
2.参数列表不同(数量、个数、顺序 (和形参名没有关系 -> 当数量个数顺序都一样时候 就算形参名不一样 方法签名都是一样的))
3.返回值类型不影响
方法重载是通过方法签名(编译器编译修改后方法最终的名字)实现的,方法签名的类型大致可以理解为:int_add(int,int)、double_add(double,double),所以只要名称相同而其他不同有就可以实现重载
构造方法
构造方法 = 初始定义,相当于孩子刚出生取名字 ,通常用于对象的初始化。
假如没有自定义一个不带参数的构造方法 系统会默认给你设定一个不带参数的构造方法。
对于无参的构造方法 需要在构造方法里给类的成员变量赋初始值,如:
public Name () {
this.name = "Mattylyh";
}
若是有参构造方法,如:
public Name (int y) {
this.year = y;
}
则要在实例化对象时候把参数写上,如:
Name matty = new Name(20);
编辑构造方法时候的快捷方式:
鼠标右键 Generate + Constructor,想构造方法带几个参数就选中几个参数。
引用
存储地址的变量称之为引用变量(名词),通常简称为引用。int double这些都是简单变量 int[]是引用变量。
引用变量和简单变量的存储
简单变量直接存储在栈帧中,引用变量也存储再栈帧中,但是引用变量存储的内容是引用指向的对象在堆空间中真实地址的哈希值,所以打印简单变量得到的是简单变量的值 而直接打印引用变量得到的是地址。
引用变量的初值应该是null,代表不指向任何对象,不能是0。
引用不能指向引用
int[] arr1 = arr;表示的是引用变量arr1指向了引用变量arr指向的对象
引用赋值给引用
相当于改变原来指向的位置,如:
public static void main(String[] args) {
int[] arr1 = {122, 233, 344, 455, 566};
int[] arr2 = {1,2,3};
arr2 = arr1;
System.out.println(Arrays.toString(arr2));
//输出 [122, 233, 344, 455, 566]
}
JVM的内存布局
常用的有五块内存,Java虚拟机栈、本地方法栈、堆、方法区、程序计数器。
-
Java虚拟机栈:就是我们们常说的栈空间,主要为局部变量等与方法执行时相关的临时信息分配内存。方法结束,为方法开辟的栈帧销毁。
-
堆:为实例化的对象分配内存,是JVM里最大的内存区。程序运行时创建,程序结束时销毁。
-
Java本地方法栈:作用与虚拟机栈类似,区别是其保存的内容是Native方法的局部变量,运行一些C/C++代码编写的文件(JVM本身就是由C/C++编写的软件)
-
程序计数器:用来保存下一条执行指令的地址
-
方法区:for静态成员变量
在多线程的环境下,每个线程的本地方法栈、程序计数器和方法区都是独立的,而所有线程共享Java虚拟机栈和堆的内存空间。
举例说明堆和栈的作用:
public static void fun(int[] tmp) {
tmp = new int[]{6,7,8,9};
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
fun(arr);
System.out.println(Arrays.toString(arr));
//输出 [1, 2, 3, 4, 5]
}
fun方法的传值是引用变量arr,执行时也是对arr进行操作,为什么最后输出的数据没有改变?
- 在main函数中,实例化arr数组的内容在堆中开辟了一块空间,存储[1,2,3,4,5],引用变量arr存在了一块栈空间中。
- fun方法执行时,形参tmp存储的是arr的值(指向堆中的[1,2,3,4,5]),存储在与arr不同的栈空间中。
- 方法中又进行了一次实例化对象,所以在堆中又开辟了新的空间存储[6,7,8,9],tmp因此指向了新的堆空间,所以对原来的arr指向的堆空间没有产生影响。
二维数组
定义二维数组
常规定义:
int[][] arr = {{1,2,3},{14,5,6}};
int[][] arr = new int[2][3];
int[][] arr = new int[][] {{1,2,3},{14,5,6}};
不完全定义:
public static void main(String[] args) {
int[][] arr = new int[3][];
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
System.out.println(Arrays.deepToString(arr));
//输出 [[0], [0, 0], [0, 0, 0]]
}
二维数组下标的理解
int[][] arr = {{123,356,5768},{234,4567,435}};
System.out.println(arr.length + " " +arr[1].length);
可以理解为数组第一个下标是纵向的行标,第二个下标是横向的列标,行标存储的是指向列标的引用,所以要获得列数需要先又arr[i]。