目录
一、NPE
1.什么是NPE?
NPE是空指针异常。
2.什么情况下会发生NPE?
当程序运行中,试图在需要对象的地方使用某一个对象时,发现对象为 null ,此时抛出该异常。这种情况包括:
-
调用 null 对象的实例方法。
-
访问或修改 null 对象的字段。
-
将 null 作为一个数组,获得其长度。
-
将 null 作为一个数组,访问或修改其时间片。
-
将 null 作为 Throwable 值抛出。
3.如何防止NPE?
当使用指针进行操作的时候,如果不确定是否为null,应该对指针做非空判断,判断指针为null时,使用new关键字开辟内存空间。
if(指针 == null ){
指针 = new 。。。
}
二、new关键字的作用
1.用于在堆区造数组
new 数据类型 [长度]
数组的构造器是系统默认就有的,任何一种数据类型都可以使用数组构造器来构造数组
例如:new int [10]
2.用于在堆区造对象
new 构造方法 ()
1)对象的构造器是java类里面提供的
2)对象的构造方法可以自定义
1.构造方法使用public修饰
2.构造方法没有返回值类型(连void都没有)
3.构造方法的名字必须与当前类名相同
4.构造方法的局部有一个特殊的this指针指向当前对象
5.如果一个类没有手动制定构造方法,则编译器会提供一个默认的无参构造方法;
如果手动制定了构造方法,则编译器将不再提供默认的无参构造方法。
例如:new Student()
这个new后面的Student()是一个无参构造方法,是编译器给你自动生成的,在字节码文件中可以看到它。
三、数组和对象的区别
1.数组
数组的定义不能超出类型的范围
数组中所有元素都是同一种数据类型
数组中的元素没有名字,只有索引号
int[] arr = new int [10]
10个元素全是int,只能存储10个整数
2.对象
对象就是一个真实世界中的实体,对象与实体是一一对应关系的,意思就是现实世界的每一个实体都是一个对象,所以对象是一个具体的概念。
3.不同之处
(1)创建方式不同:.数组表示有序数据的集合,而对象表示无序数据的集合。数组的数据没有”名称”(name),对象的数据有”名称”(name)。
(2)调用方法不同
(3)对象键值唯一,数组可以重复
(4)对象没有长度,不能用for循环
四、基本数据类型对应的引用数据类型
引用类型有null值
基本数据类型 | 对应的引用类型 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
数组的默认类型
其中char类型数组的默认值:
五、操作数组的函数
1.正序遍历
2.倒序遍历
3.数组求和
4.求最大值
5.求最小值
6. 求平均数
7.数组扩容
8.数组中插入元素
9.数组中删除元素
10.反转数组
11.冒泡排序
六、官方的Arrays工具类
Arrays:针对数组进行操作的工具类。比如说排序和查找。没有构造,方法全部是静态
静态函数用 类名. 构造
成员方法用 new对象 指针
package SecondArrays;
import java.util.Arrays;
public class SecondApp {
public static void main(String[] args) {
int[] app = {1, 2, 6, 54, 65, 73};
System.out.println(app);// 打印的是数组在内存中的地址
// 1.把数组转化成字符串 Arrays.toString(array);
System.out.println(Arrays.toString(app));
// 2. 比较数组
int[] app2 = {1, 2, 6, 54, 65, 73};
System.out.println("== : "+ (app == app2));// 涉及到内存中数组存储的方式,所以会返回false (后面会解释)
System.out.println("Arrays.equals : "+ Arrays.equals(app, app2));
int[] app3 = {1, 2, 54, 65, 73};
System.out.println("Arrays.equals app app3 : "+ Arrays.equals(app, app3));
// 3. 排序数组
int[] app4 = {78, 63, 99, 56, 79, 1, 23, 33, 63};
System.out.println("原数组" + Arrays.toString(app4));
Arrays.sort(app4);
System.out.println("排序后的数组" + Arrays.toString(app4));
// 4. 数组的复制Arrays.copyOf
int[] app5 = Arrays.copyOf(app4, 5);
int[] app6 = Arrays.copyOf(app4, 15);
System.out.println(Arrays.toString(app5));
System.out.println(Arrays.toString(app6));
/**@brief
* 先前提到过,数组确定下来,长度就会固定
* 所以可以用复制的方法,对数组进行扩容
* 将原数组的值放在更大的数组中
* 而不是去改变原数组
*/
int[] nums = {5, 10, 23, 6, 36, 69};
// 覆盖掉,得到一个最新的值
nums = Arrays.copyOf(nums, nums.length + 1);
nums[nums.length - 1] = (int) (Math.random() * 16 + 1);
System.out.println(Arrays.toString(nums));
/**func
* 用这样的方式对数组去扩容
* 其实没有改变原数组
* 而是换了一个新数组 替换
*/
}
}
七、二维数组
1.二维概述
1、二维数组其实就是一个特殊的一维数组,一维数组中每个元素就是一个一维数组
2、三维数组又是一个特殊的二维数组
2.二维数组的定义
int[][] a=new int[10][10];
String[][] b=new String[10][10];
八、类和对象
字节码文件就是类
类和对象的关系:
类是静态的,对象是动态的。
类是对象的模板,对象是在运行时用new关键字分配内存空间造出来的。
类定义了对象将会拥有的特征(属性)和行为(方法)
类是对象的类型,对象是类的实例
九、成员变量
十、构造方法
十一、成员方法
成员方法可以操作对象中的数据
成员方法一定在构造方法之后被调用
无参构造方法存在的意义
new Student()在堆区里面构造一个对象,对象中的元素存储的数据还未知的时候,可以使用无参构造方法。后续的代码在获得数据以后,可以通过指针操作对象,读写数据。
带参构造方法存在的意义
在堆区里面构造一个对象的时候,已经很明确知道对象中存储的是什么内容,就可以使用带参构造方法更加便捷。
十二、this指针
只在构造方法中有
1.引用成员变量
2.调用类的构造方法
public class Student { //定义一个类,类的名字为student。
public Student() { //定义一个方法,名字与类相同故为构造方法
this(“Hello!”);
}
public Student(String name) { //定义一个带形式参数的构造方法
}
}
this关键字除了可以调用成员变量之外,还可以调用构造方法。在一个Java类中,其方法可以分为成员方法和构造方法两种。
3.返回对象的值
如在代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。如代码在上面student类中,那么代码代表的含义就是return student。可见,这个this关键字除了可以引用变量或者成员方法之外,还可以作为类的返回值
十三、什么是零值
定义数据类型后的初始默认值:
byte 0;
short 0;
int 0;
long 0;
float 0.0;
double 0.0
char \u0000
Boolean false;
string null。