1.数组
1.1数组的几个特点、
(1)长度一旦确定就不能更改
(2)数组的元素是连续存储的,需要在内存内开辟一整块连续的存储空间
(3)数组元素的访问速度是非常快
1.2JVM的运行时分为几个部分
(1)方法区:存储加载的类信息,常量,静态变量
(2)堆:存储程序员通过new申请(创建对象)申请的内存
(3)Java虚拟机栈: 存储方法体中的局部变量
(4)本地方法栈: 存储调用的本地方法(c的函数库)的局部变量等信息
(5)程序计数器: 存储每一个线程的下一条要执行的指令
1.3变量
(1)基本数据类型的变量: 存储值
(2)引用数据类型的变量: 存储地址值
1.4数组的细节
(1)元素的数据类型和数组的长度决定了需要开辟多大的空间
(2)JVM会给内存编号每一个字节都有自己的内存地址
(2)arr存储元素的首地址 但是也不完全划=
(3)Java不会对外暴露的地址
(3)[I@723279cf [一维数组 I表示int 723279cf数组对象的hashcode值16进制
1.5总结
(1) 数组的元素存储在堆中 连续存储
(2) 数组名是记录数组对象的首地址
(3) 下标从0开始表示第一个元素不用跨过任何元素的意思
2.数组的初始化
2.1静态初始化
数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分开两个语句写
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2,元素3...};
int[] arr = {1,2,3,4,5};//正确
int[] arr;
arr = {1,2,3,4,5};//错误
int[] arr = new int[]{1,2,3,4,5};//正确
int[] arr;
arr = new int[]{1,2,3,4,5};//正确
// 当访问数组元素时,下标指定超出[0, 数组名.length-1]的范围时,
// 就会报数组下标越界异常:ArrayIndexOutOfBoundsException。
3.二维数组
1.二维数组的声明
元素的数据类型[][] 数组名字
元素的数据类型 数组名字[][]
元素的数据类型[] 数组名字[]
2.二维数组的初始化
(1)静态初始化
数组名 = new 元素的数据类型[][] {{},{}}
3.如何获取总行数 : arr.length
获取一行 arr[]
获取一行的元素个数 arr[].length
4.动态初始化
规则的矩阵
数组名 = new 元素的类型[行数][列数]
不规则(每一行的列数不相同) 有长有短
1.先确定行数
2.依次确定每一行的列数
public class _01DoubleDimensionalArray {
public static void main(String[] args) {
//
int[][] grades = new int[][] {
{1,2,3,4},
{1,2,3,4},
{1,2,3,4}
};
System.out.println(grades); // [[I@723279cf
System.out.println(grades[0]); // [I@10f87f48
/*
可以把二维数组看成一位维数组
*/
System.out.println("行数:" + grades.length);
System.out.println("第一行的第一个数据:" + grades[0][0]);
int[][] arr = new int[4][5];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = i+1;
}
System.out.println();
}
int[][] newArr = new int[5][];
for (int i = 0; i < newArr.length; i++) {
/*
发生了空指针异常
当发生了空指针异常是,先找前面的东西看看他是否为null
解决?
给arr[i] new一个数组
*/
arr[i] = new int[i+1];
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = i+1;
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}
5.杨辉三角形
public class _02ArrayExer {
public static void main(String[] args) {
int[][] yanghui = new int[10][];
// 给杨辉三角形赋值
for (int i = 0; i < yanghui.length; i++) {
yanghui[i] = new int[i + 1];
yanghui[i][0] = 1;
yanghui[i][i] = 1;
for (int j = 1; j < yanghui[i].length -1; j++) {
yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i -1][j];
}
}
for (int i = 0; i < yanghui.length; i++) {
for (int j = 0; j < yanghui[i].length; j++) {
System.out.print(yanghui[i][j] + "\t");
}
System.out.println();
}
}
}
4.包
1.包的作用
(1)避免类的重名
(2)组织管理不同层(不同模块)的类
(3)可以限定部分类或成员的可见性范围
2.如何声明包
package 包名;
要求:
(1)一个.java文件智能有一个package语句,而且必须在代码首行
(2)如果某个.java文件声明package语句,那么这个.java文件必须在对应的目录结构中
3.包命名个规范
所有单词都小写,每一个单词之间使用.分割,每一个,代表一级目录
4.类如何跨包使用
只要两个.java文件的package语句不完全相同,就认为是不同的包
方式(1)使用包的全名.类名 如果同名只能使用这个
(2)导入包
import 包.类名
import 包.* *代表的是类名
5.类和对象
JVM运行的内容:
(1)方法区:存储被加载的类的模板信息,常量等
(2)堆:存储new出来的对象信息
(3)JAVA虚拟机栈:存储Java的局部变量
(4)本地方法栈:存储c/c++等方法的局部变量
(5)程序计数器:存储每一个线程的下一条指令等
new在堆中申请内存空间,存储这个对象的相关信息
每一个对象需要存储三个部分的内容:
(1)对象头
(2)对象的实例变量值
(3)对齐的空白(这个有的对象可能没有)
方法不调用不执行,调用一次执行一次
1.每次调用都会在'栈'(包括java虚拟机栈,如果调用的是java的方法,那么在java虚拟机栈)
2.如果调用的是c的代码,那么在本地方法栈
3.开辟一块独立的内存空间,用来存储当前方法的局部变量等等信息,这个过程称为”入栈“等方法运行结束了后,会自动释放”栈“中的内存空间,这个过程称为”出栈“
栈结构的特点:先进后出
6.实例变量和局部变量
1、声明位置和方式
(1)实例变量:在类中方法外
(2)局部变量:在方法体{}中或方法的形参列表、代码块中
2、在内存中存储的位置不同
(1)实例变量:堆
(2)局部变量:栈
3、生命周期
(1)实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。
(2)局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
4、作用域
(1)实例变量:通过对象就可以使用,本类中“this.,没有歧义还可以省略this.”,其他类中“对象.” (2)局部变量:出了作用域就不能使用
5、修饰符(后面来讲)
(1)实例变量:public,protected,private,final,volatile,transient等 (2)局部变量:final
6、默认值
(1)实例变量:有默认值
(2)局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。
7.可变参数
可变参数
参数:形参 实参
实参的个数可以变
2.语法
数据类型 ...参数名
3.要求
(1)每一个方法只有一个
(2)最后一个参数
4.使用?
(1)在声明可变参数的方法中当成数组用
(2)在调用可变参数的方法时,实参可以传递
A:对应类型数组
B:对应类型0-n个元素