目录
1.什么是NPE,什么情况下会发生NPE
如何防止NPE?当你使用指针进行操作的时候,如果不确定指针是否为null应该对指针做非空判断,判断指针为null时,使用new关键字开辟内存空间if(指针== null) {指针= new ...}
NullPointerException 空指针异常
指针是null时会发生NPE
当指针是null时,不允许通过指针进行操作。
2.new关键字的作用
1.用于在堆区造数组
new 数据类型[长度]
数组的构造器是系统默认就有的,任何一种数据类型都可以使用数组构造器构造数组
例如:new int[10]
2.用于在堆区造对象
new 构造方法()
对象的构造器是类里面提供的
例如:new Student();
这个new后面的Student()是一个方法,是编译器给你自动生成的,在字节码文件中可以看到对象的
在内存开辟堆区空间,并返回内存空间的内存地址
构造方法可以自定义
1.构造方法使用public修饰
2.构造方法没有返回值类型(void也没有)
3.构造方法名字必须与类名相同
4.构造方法的内部有一个特殊的this指针,指向当前对象
5.如果一个类没有手动指定构造方法,则编译器会提供一个默认的无参构造方法,如果手动指定了构造方法,则编译器将不再提供默认的无参构造方法。
无参构造方法存在的意义
new student[] 在堆区构造一个对象,对象中的元素存储的数据还未知的时候,可以使用无参构造方法,后续的代码在获得数据以后,可以通过指针操作对象,读写数据
带参构造方法存在的意义
在堆区里面构造一个对象
3.组和对象的区别
数组:
数组中所有元素都是同一种类型
数组中的元素没有名字,只有索引
对象:
可以高度自定义的数据结构
4.基本数据类型对应的引用数据类型
基本数据类型 引用数据类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
5.正序遍历数组,倒序遍历数组
输入"长度.for"可直接完成遍历
正序遍历数组函数部分
public static void iterator(){
//正向便利,循环变量i当作数量的索引,都是从0开始(因为数组的索引都是从0开始)
//到arr,length结束,length是数组的长度
//循环变量i只能<length,不能<=length,或是i<=arr.length-1
for (int i =0;i<arr.length;i++){
System.out.print(arr[i]);
System.out.print(",");
}
}
倒序遍历数组函数部分
public static void reverse(){
for (int i =arr.length-1;i>=0;i--){
System.out.print(arr[i]);
System.out.print(",");
}
}
输出
6.数组求和
public static void sum(){
//累加求和;遍历数组,累加所有元素
int sum=0;
for (int i = 0; i < arr.length; i++) {//遍历整个数组
if(arr[i]==null)
break;
sum+=arr[i];
}
System.out.println("数组求和:"+sum);
}
7.数组求最大值和最小值
public static void max(){
//声明变量max存储最大数,并默认第一个数是max
int max=arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i]==null)
break;
if(arr[i]>max){
max=arr[i];
}
}
System.out.println("arr中的最大数是:"+max);
}
public static void min(){
int min=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]==null)
break;
if(arr[i]<min){
min=arr[i];
}
}
System.out.println("arr中最小的数是:"+min);
}
8.数组求平均数
public static void avg(){
int sum=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==null)
break;
sum+=arr[i];
}
System.out.println("arr数组的平均数是:"+sum/arr.length);
}
9.数组扩容的策略
1.创建新数组
2.把原数组的元素转移到新数组中
3.把新数组的地址给原数组的指针
10.数组中插入元素
插入的策略是:
1.从插入的索引位置开始,后面的元素后移一位,空出指定的位置
2.再把元素存储在指定的位置
将数据类型int变为对应的引用数据类型Integer
public static void insert(int insert,int e){//记录需要插入的索引
//在数组中的指定位置插入一个元素,并且不会对其他元素造成影响
//例如:在arr[5]的位置插入33
//arr[5]=33,不是插入而是修改
//1.找到数组中第一个null的位置
int empty=-1;//记录第一个不为空的索引
for (int i = 0; i < arr.length; i++) {
if(arr[i]==null){
empty=i;
break;
}
}
//2.从第一个为空的位置开始后移
for(int i=empty;i>4 ;i--){
arr[i]=arr[i-1];
}
arr[insert]=e;
System.out.print("插入的元素:");
iterator();
}
11.数组中删除元素
public static void remove(int remove){
// 参数remove是调用方指定的需要移除的索引
for (int i = remove; i < arr.length; i++) {
if(arr[i] == null){
arr[i-1] = null; break;
}
arr[i] = arr[i+1]; }
iterator();
}
12.反转数组
public static void trans(){
for (int i = 0; i < arr.length/2; i++) {
int emp = arr[i];
arr[i]=arr[arr.length-1-i];
arr[arr.length-1-i]=emp;
}
}
public static void poo(){
}
13.使用冒泡排序算法排序数组
public static void poo(){
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]<arr[j+1]){
int emp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=emp;
}
}
}
}
14.官方的Arrays工具类
1.Arrays.toString(int [ ] arr); 将基本数据类型的数组转换成字符串。如byte [ ],boolean [ ]。
2.Arrays.sort(int [ ] arr) 数组排序。排序后是修改了arr里的值,不返回参数。
3.Arrays.equals(int [ ]arr1, int [ ]arr2) 比较arr1和arr2数组,如果下标对应值都相等,则返回true,否则返回false。
4.Arrays.binarySearch(int [ ] arr, key) 二分查找有序数组的key值,如果数组包含key,则返回该下标,如果没有找到返回一个负数。
5.void fill(type[] a, type val):该方法将会把a数组的所有元素都赋值为val。
6.void fill(type[] a, int fromIndex, int toIndex, type val):该方法与前一个方法的作用相同,区别只是该方法仅仅将a数组的fromIndex到 toIndex索引的数组元素赋值为val。
15.二维数组
定义:类型 数组名[行号][列号]
16.类和对象
对象 = 属性 + 方法
对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。
17.成员变量
成员变量分为两种:类的成员变量和对象的成员变量(又称为实例变量)
布尔型(boolean)变量默认值为false,
byte、short、int、long为0,
字符型为'\u0000'(空字符),浮点型(float double)为0.0,
引用类型(String)为null
18.构造方法
在创建对象的时候,对象成员可以由构造函数方法进行初始化
构造方法的方法名必须与类名一样
没有返回类型,也不能定义为void,在方法名前面不声明方法类型
不能作用是完成对象的初始化工作,他能够把定义对象时的参数传递给对象的域
不能由编程人员调用,而要系统调用
可以重载,以参数的个数,类型,或排序顺序区分
19.成员方法
成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能的程序模块。它与过去所说的子程序、函数等概念相当。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的消息作出响应,完成特定的功能。成员方法一旦定义,便可在不同的程序段中多次调用,故可增强程序结构的清晰度,提高编程效率。
20.this关键字
通过this关键字可以明确的访问一个类的成员变量,解决成员变量与局部变量名称冲突问题。
通过this关键字调用成员方法
在构造方法中访问构造方法使用this([参数1,参数2,…])
21.什么是零值
数据类型的默认值
例如byte,short,int,long的为0.