基本数据类型对应的引用数据类型
数组Array:组成成分
下标/索引(英文:index),元素(英文:element)
基本数据类型也可以是一个数组
如byte [] 、short [] 、int [] 、 long []、 float [] double []、 boolean [] 、 char [] string []
数组类型 | 默认值 |
byte [] | 0 |
short [] | 0 |
int [] | 0 |
long [] | 0 |
float [] | 0.0 |
double [] | 0.0 |
boolean [] | false |
char [] | \u0000表示字符集中的第零号字符 |
string [] | NULL,真正意义上的空 |
Java中的空
' ' | 空字符 |
" " | 空字符串 |
NULL | 空地址,真正意义上的空数组 |
什么是NPE,什么情况下会发生NPE?
NullPointerException 空指针异常
Java语言严格规定当指针是null的时候,不允许通过指针进行操作,这时会发生NPE异常
任何防止NPE?
当你使用指针进行操作的时候,如果不确定指针是否为null应该对指针做非空判断,判断指针为null时,使用new关键字开辟内存空间
if(指针 == null) {指针 = new ...}
在栈帧、堆区中的分析
数组在栈帧中存储的是变量/指针/引用(内存地址),数组的真正空间是在堆区
代码解读:int[] arr = new int[10];先执行右边,即在堆区创建一个空间,然后再在栈帧创建一个指针指向堆区中的数组空间
根据数组指针扩展到数组对象
引用数组特点
数组中的所有元素都是同一种数据类型
数组中的元素没有名字,只有索引
int[] arr = new int[10];
10个元素全是int,只能存储10个整数
扩展到对象
需要一种数据类型可以高度自定义的数据结构
比如存储一个学生的信息
学号 | int |
姓名 | String |
年龄 | int |
性别 | char |
根据方法区中字节码文件,在堆区中分配内存空间,形成对象
类是创建对象模板
new关键字
用于在堆区造数组
new 数据类型[长度]
数组的构造器是系统默认就有的,任何一种数据类型都可以使用数组构造器来构造数组
例如:
new int[10]
用于在堆区造对象
new 构造方法()
对象的构造器是类里面提供的
例如:new Student();
这个new后面的Student()是一个无参构造方法,是编译器给你自动生成的,在字节码文件中可以看到
造数组和造对象的区别:
数组[]里面要加数字,对象()里面可以不用
数组必须用固定形式
对象的构造方法可以自定义:
1、构造方法使用public修饰
2、构造方法没有返回值类型(连void都没有)
3、构造方法的名字必须与当前类名相同
4、构造方法的内部都有一个this指针,指向当前对象
注意点:如果一个类没有手动指定一个构造方法,则编译器会提供一个默认的无参构造方法;如果手动指定了构造方法,则编译器将不再提供默认的无参构造方法
函数和方法的区别
函数不能调用指针,方法可以
方法和对象相关,函数和方法无关
this关键字
有this指针的只有构造方法和成员方法
静态函数中没有this指针
this指针的作用是:把值赋给堆区中对应的元素
无参构造方法存在的意义?
new Student() 再堆区里面构造一个对象,对象中元素存储的数据还未知的时候,可以使用无参构造方法,后续的代码在获得数据以后,可以通过指针操作对象,读写数据
带参的构造方法存在的意义?
自己定义this指针
在堆区里面构造一个对象的时候,已经很明确对象中存储的是什么内容,我们可以使用带参构造,在构造的时候需要自己手动指定this指针
数组元素的插入操作
从插入的索引位置开始,后面的元素后移一位,空出指定的位置
再把元素存入指定位置
Java 8 增强的Array类
Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组,这个Arrays类里包含了如下几个static修饰的方法(static修饰的方法可以直接通过类名调用)
静态函数是通过类名调用的
成员方法是通过对象指针调用的
int binarySearch(type[] a, type key):使用二分法查询key元素值在a数组中出现的索引;如果a数组不包含key元素值,则返回负数。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确结果
int binarySearch(type[] a, type key):使用二分法查询key元素值在a数组中出现的索引;如果a数组不包含key元素值,则返回负数。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确结果
类和对象
类是对象的抽象,对象是类的具体实例
比如购物车是一个类,购物车里面的商品则是一个一个对象
构造方法
类里面一定存在的,可以声明也可以不声明,方法名必须和类名一致
成员方法
根据实际情况声明的