Java语言基础笔记3
Java内存划分
Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式
JVM内存分配
寄存器:与CPU相关
本地方法栈:JVM在使用操作系统功能的时候使用
方法区:存储.class的相关信息,包含方法的信息
栈:方法运行时使用的内存,存储方法中的局部变量
堆:存储对象或数组(new出来的东西)
程序执行流程图解
(以数组为例)
数组
概述
- 引用数据类型的一种:变量存放的地址而不是具体的数值(类似指针)
- 存储同一种数据类型多个元素的容器(相同数据类型的元素集合)
- 既可以存储基本数据类型,也可以存储引用数据类型
定义格式
-
格式1:数据类型[ ] 数组名; (推荐使用的格式) 格式2:数据类型 数组名[ ];
注意:这两种定义做完了,数组中是没有元素值的
初始化
- Java中的数组必须先初始化,然后才能使用
- 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
动态初始化
初始化时只指定数组长度,由系统为数组分配初始值。
格式:数据类型[ ] 数组名 = new 数据类型[数组长度];
举例:
-
int[] arr = new int[3]; /* * 解释: * 左边: * int:说明数组中的元素的数据类型是int类型 * []:说明这是一个数组 * arr:是数组的名称 * 右边: * new:为数组分配内存空间 * int:说明数组中的元素的数据类型是int类型 * []:说明这是一个数组 * /
静态初始化
初始化时指定每个数组元素的初始值,由系统决定数组长度。
格式:数据类型[ ] 数组名 = new 数据类型[ ] {元素1,元素2,…};
举例:
-
基本格式:int[] arr = new int[]{1,2,3}; 简化写法:int[] arr = {1,2,3}; 解释: 定义了一个int类型的数组; 这个数组中可以存放3个int类型的值,并且值分别是1,2,3;
数组基本操作
获取数组元素
案例:
public class ArrayDemo {
public static void main(String[] args) {
//数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
//输出数组名
System.out.println("arr:"+arr); //[I@104c575 为数组地址值
//输出数组元素值
System.out.println("arr[0]:"+arr[0]);//0
System.out.println("arr[1]:"+arr[1]);//0
System.out.println("arr[2]:"+arr[2]);//0
//数组元素值默认赋值为0
//对数组元素赋值
arr[0] = 100;
}
}
注意:
- 输出数组名仅仅是数组的首地址
- 要获得数组的元素要使用数组下标(index)
- 数组下标:从0开始到数组长度-1
- 默认的赋值:
byte short int long:0
float double:0.0
char:’\u0000’
boolean:false
引用类型:null
数组遍历
案例
-
for(int x=0; x<arr.length; x++) System.out.println(arr[x]);
注意:
- Java使用的通用语法是:
-
object.method(parameters) //点(.)用于对某对象调用语法
- length方法可以返回数组的长度(数组元素的个数)
数组反转
public static void main(String[] args)
{
//初始化一个数组
int[] arr = { 1, 2, 3, 4, 5 };
/* 循环中定义变量min=0最小索引
max=arr.length‐1最大索引
min++,max‐
*/
for(int min = 0, max = arr.length ‐ 1; min < max; min++, max‐‐)
{
//利用第三方变量完成数组中的元素交换
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反转后,遍历输出数组
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
求数组最值
案例:
public class ArrayTest2 {
public static void main(String[] args) {
//定义数组
int[] arr = {12,98,45,73,60};
//定义参照物
int max = arr[0];
//遍历数组,获取除了0以外的所有元素,进行比较
for(int x=1; x<arr.length; x++) {
if(arr[x] > max) {
max = arr[x];
}
}
System.out.println("数组中的最大值是:"+max);
}
}
注意:
- 取数组其中的元素作为参照物
数组常见小问题
-
ArrayIndexOutOfBoundsException: 数组索引越界异常
原因:访问了不存在的索引(不在数组下标范围内) -
NullPointerException: 空指针异常
原因:null是指不再指向堆内存的数据,而我们还在访问堆内存的数据
案例:
public class ArrayDemo {
public static void main(String[] args) {
//定义数组
int[] arr = {1,2,3};
//访问数组中的元素
System.out.println(arr[3]); //1. 不存在这个元素
//引用数据类型:类,接口,数组
arr = null; // 2. 访问不指向堆内存的数据
System.out.println(arr[1]);
}
}
方法
方法就是完成特定功能的代码块
定义
-
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; return 返回值; }
- 解释:
修饰符: 目前记住 public static
返回值类型: 用于限定返回值的数据类型
方法名: 一个名字,为了方便我们调用方法
参数类型: 用于接收调用方法时传入的数据的类型
参数名: 用于接收调用方法时传入的数据的变量
方法体: 完成功能的代码
return: 结束方法,把返回值带给调用者
注意事项
• 定义一个方法需要明确:
【1】需要实现的功能
【2】返回值类型 明确功能结果的数据类型
【3】参数列表 明确有几个参数,以及参数的类型
【4】方法与方法是平级关系,不能嵌套定义
方法调用
- 单独调用
- 赋值调用
- 输出调用
public class MethodDemo2 {
// 定义一个求和的方法
public static int sum(int a, int b) {
return a + b;
}
public static void main(String[] args) {
// 单独调用
// sum(10,20);
// 输出调用
// System.out.println(sum(10,20));
// 赋值调用
int s = sum(10, 20);
// s+=100;
System.out.println("s:"+s);
}
}
- 调用图解
方法重载
在同一个类中,出现了方法名相同的情况。
- 特点
【1】方法名相同
【2】参数列表不同:参数的个数不同;参数对应的数据类型不同。
【3】方法重载与返回值无关 - 注意事项:在调用方法的时候,JVM会根据方法名及参数列表的不同来区分方法
- 案例
public class MethodTest {
public static void main(String[] args) {
System.out.println(compare(10, 20)); //int
System.out.println(compare((byte)10, (byte)20)); //byte
System.out.println(compare((short)10, (short)20)); //short
System.out.println(compare(10L, 20L)); //long
}
//两个byte类型
public static boolean compare(byte a,byte b){
System.out.println("byte");
return a == b;
}
//两个short类型
public static boolean compare(short a,short b){
System.out.println("short");
return a == b;
}
//两个int类型
public static boolean compare(int a,int b){
System.out.println("int");
return a == b;
}
//两个long类型
public static boolean compare(long a,long b){
System.out.println("long");
return a == b;
}
}
方法参数问题
-
形参和实参
形式参数:用于接收实际数据的变量
实际参数:实际参与运算的变量 -
基本数据类型作为参数:传值
(图解)基本数据类型:实参–复制一份–传递给形参,实际对应的是副本,对原来的数据无法修改 -
引用数据类型作为参数:传址
(图解)引用数据类型–传址–对应的实际是同一个东西,可以修改原来的数据