一 数组
数组是指一组数据的集合,数组中的每个数据被称作元素。在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致。
它是一个用来存储同一个数据类型多个元素的一个容器(数组长度是固定的,数组中存储的元素的数据类型要求一致)。
1.1 数组定义
数组定义包含以下几种方式:
格式1:数据类型[] 数组名 = new 数据类型[数组长度];
格式2:数据类型[] 数组名 = new 数据类型[]{元素值1,元素值2,..};
格式3:数据类型[] 数组名 = {元素值1,元素值2,..};
如int x=new int[100];上述语句就相当于在内存中定义了100个int类型的变量,第一个变量的名称为x[0],第二个变量的名称为x[1],以此类推,第100个变量的名称为x[99],这些变量的初始值都是0。在Java中,为了方便我们获得数组的长度,提供了一个length属性,在程序中可以通过“数组名.length”的方式来获得数组的长度,即元素的个数。数组一旦被定义便赋予了初始值,不同类型初始值如下表:
下面介绍这一过程中内存变化情况。
虚拟机内存划分具体讲解如下:
所有硬件由操作系统(如windows)管理。统分一片内存给JVM,JVM对自己的内存进行进一步划分,分为5个区域:
①寄存器:内存与CPU之间
②本地方法栈:有些功能JVM处理不了,JVM就调用系统中的功能,如复制粘贴
我们的程序运行时与下面三个有关:
③方法和数据的共享区:运行时期class文件进入的地方
④方法栈:所有的方法运行时,进入的内存
⑤堆:存储的是容器和对象
注意:
内存的特点:程序不运行,和内存是没关系的;程序运行结束后会清空内存,即内存的临时性。Java中JVM开辟内存空间与清理都是自动完成的。(而c++需要手动清理内存)
每个数据都会有自己的内存地址;变量arr(引用类型)实际存的内存地址。数组内存图如下:
1.2 二维数组
它是一个包含多个一维数组的数组。特点:二维数组中的每个元素都是一个一维数组。有三种定义格式:
格式1:数据类型[][] 数组名 = new 数据类型[m][n]; m:代表二维数组中一维数组的个数;n:代表每个一维数组中元素的个数;如 int[][] arr = new int[3][4];
格式2:数据类型[][] 数组名 = new 数据类型[m][]; m:代表二维数组中一维数组的个数;每一个一维数组通过赋值来确定数组长度;如 int[][] arr = new int[3][];
格式3:数据类型[][] 数组名 = {{元素值1,元素值2,..},{元素值1,元素值2,..},..}; 如int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
1.3数组常见异常
NullPointerException:空指针异常
ArrayIndexOutOfBoundsException:数组越界异常
二 方法
2.1方法概述
在java中,方法就是用来完成解决某件事情或实现某个功能的办法。方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值。
我们可以通过在程序代码中引用方法名称和所需的参数,实现在该程序中执行(或称调用)该方法。方法,一般都有一个返回值,用来作为事情的处理结果。
在Java中,声明一个方法的具体语法格式如下:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){执行语句
………
return 返回值;
}
对于上面的语法格式中具体说明如下:
修饰符:方法的修饰符比较多,有对访问权限进行限定的,有静态修饰符static,还有最终修饰符final等,这些修饰符在后面 的学习过程中会逐步介绍
返回值类型:用于限定方法返回值的数据类型
参数类型:用于限定调用方法时传入参数的数据类型
参数名:是一个变量,用于接收调用方法时传入的数据
return关键字:用于结束方法以及返回方法指定类型的值
返回值:被return语句返回的值,该值会返回给调用者
需要特别注意的是,方法中的“参数类型参数名1,参数类型 参数名2”被称作参数列表,它用于描述方法在被调用时需要接收的参数,如果方法不需要接收任何参数,则参数列表为空,即()内不写任何内容。方法的返回值必须为方法声明的返回值类型,如果方法中没有返回值,返回值类型要声明为void,此时,方法中return语句可以省略。
2.2方法调用图解
方法的调用流程:
方法的内存图:
2.3方法重载
假如要实现对两个整数相加、对三个整数相加以及对两个小数相加的功能,程序需要针对每一种求和的情况都定义一个方法,如果每个方法的名称都不相同,在调用时就很难分清哪种情况该调用哪个方法。为了解决这个问题,Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。
下面的三个方法互为重载关系
public static int add(int x,int y) { 逻辑 } //两个整数加法
public static int add(int x,int y,int z) { 逻辑 } //三个整数加法
public static int add(double x,double y) { 逻辑 } //两个小数加法
上述代码中定义了三个同名的add()方法,它们的参数个数或类型不同,从而形成了方法的重载。在main()方法中调用add()方法时,通过传入不同的参数便可以确定调用哪个重载的方法,如add(1,2)调用的是两个整数求和的方法。值得注意的是,方法的重载与返回值类型无关,它只有两个条件,一是方法名相同,二是参数个数或参数类型不相同。
注意事项:
1.重载方法参数必须不同:
参数个数不同,如method(int x)与method(intx,int y)不同
参数类型不同,如method(int x)与method(doublex)不同g
参数顺序不同,如method(int x,double y)与method(doublex,int y)不同
2.重载只与方法名与参数类型相关与返回值无关
如void method(int x)与int method(inty)不是方法重载,不能同时存在
3.重载与具体的变量标识符无关
如method(int x)与method(int y)不是方法重载,不能同时存在
2.4参数传递
参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了。这种传递方式,我们称为参数传递。
在这里,定义方法时,参数列表中的变量,我们称为形式参数。
调用方法时,传入给方法的数值,我们称为实际参数。
通过上面的两段程序可以得出如下结论:
当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响;
当调用方法时,如果传入的数值为引用数据类型(String类型除外),传的是地址,形式参数的改变对实际参数有影响。
三 类
3.1引用数据类型
提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类、Random类。我们可以把类的类型为两种:
第一种,Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性供我们使用。
第二种,我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我们使用。我们在Java中,将现实生活中的事物抽象成了代码。这时,我们可以使用自定义的数据类型(类)来描述(映射)现实生活中的事物。
类,它是引用数据类型,与之前学习的所有引用数据类型相同,自定义类也是一种数据类型。只是自定义类型并非Java为我们预先提供好的类型,而是我们自己定义的一种引用数据类型用来描述一个事物。Java代码映射成现实事物的过程就是定义类的过程。
3.2类的定义与使用
类的定义格式:
创建java文件,与类名相同
public class 类名{
数据类型 属性名称1;
数据类型 属性名称2;
…
}
类定义好后,我们就可以使用这个类了,使用方式和使用引用数据类型Scanner类相似。格式如下:
导包:我们将所有的类放到同一个文件夹下,可以避免导包。
创建对象:数据类型 变量名 = new 数据类型();
调用方法:目前我们定义的自定义类不涉及方法,只是属性(自定义类中的方法部分在面向对象部分讲解)
访问属性:变量名.属性 (这是当前的方式,后期会采取调用方法的方式替代掉直接访问的方式来完成对属性的访问。)
3.3自定义类型内存图
注意:new Phone之后,内存变化如下:
JVM在堆内存开辟空间,存储Phone,此时类中的属性,跟随容器进入到堆内存并赋予默认值;
JVM内存地址,传递到引用类型p,变量p保存的是内存中的地址;
然后在main中对类的属性赋值。
两个引用类型内存图:开辟两块空间
四 ArrayList集合
在前面我们学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个学校的学生,由于不停有新生来报道,同时也有学生毕业离开学校,这时学生的数目很难确定。为了保存这些数目不确定的元素,JDK中提供了一系列特殊的类,这些类可以存储任意类型的元素,并且长度可变,统称为集合。在这里,我们先介绍ArrayList集合。
ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。
4.1集合的创建
创建集合的常用格式在此说明一下:
导包:importjava.util.ArrayList;
创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型。
ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();
集合中存储的元素,只能为<>括号中指定的数据类型元素;
“<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型;
下面给出8种基本数据类型所对应的引用数据类型表示形式:
我们通过举几个例子,来明确集合的创建方式:
存储String类型的元素:ArrayList<String> list = new ArrayList<String>();
存储int类型的数据:ArrayList<Integer> list = new ArrayList<Integer>();
存储Phone类型的数据:ArrayList<Phone>list = new ArrayList<Phone>();
4.2集合中的方法
ArrayList集合提供的一些常用方法,如下表:
集合遍历:
for (int i = 0; i < list.size(); i++) {
//通过索引,获取到集合中每个元素
int n = list.get(i);
System.out.println(n);
}