1.(1)什么是NPE:NPE是NullPointerException的缩写,是JAVA里的空指针,一般指对一个空对象 (null)进行了操作而出现的问题。
(2)什么情况下会发生NPE? 本身引用的内容是空的,比如获取一个对象的值,但是这个对象在 逻辑中没拿到值,变成了null
(3)如何防止NPE?当你使用指针进行操作的时候,如果不确定指针是否为null应该对指针做非 空判断,判断指针为null时,使用new关键字开辟内存空间if(指针== null) {指针= new ...}。
2.new关键字的作用:是在堆区开辟内存空间,并返回该内存空间的内存地址
1. 用于在堆区造数组
new 数据类型[长度]
数组的构造器是系统默认就有的,任何一种数据类型都可以使用数组构造器 来构造数组。例如:new int[10];
2.用于在堆区造对象
new构造方法:对象的构造器是类里面提供的。例如:new Student();
这个new后面的Student()是一个无参构造方法,是编译器给你自动生成的, 在字节码文件(out)中可以看到他
3.数组和对象的区别:
(1)创建方式不同:数组表示有序数据的集合,而对象表示无序数据的集合。数组的数据没有属 名,但是有索引号,对象的数据有属名,但是没有索引号。
(2)调用方法不同
(3)对象键值唯一,数组可以重复
(4)对象没有长度,不能用for循环
4.基本数据类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示 了真实的数字、字符和整数。
引用数据类型: Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数 据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同 时可以针对程序外部进行信息隐藏。
5.正序遍历数组
倒序遍历数组
6.数组求和
7.数组求最大值和最小值
8.数组求平均数
9.数组扩容的策略
10.数组中插入元素
11.数组中删除元素
12.反转数组:方法一:使用循环,交换数组中元素的位置使用循环,在原数组中交换元素的位 置:第一个元素与最后一个元素交换,第二个元素与最后一个元素交换, 依此类推,直到结束。
方法二:使用循环,将原数组元素反向放置在新数组中:在函数内部,初始化一 个新数组(数组大小和第一个数组arr相同)。数组arr[]从第一个 元素迭代,将其中的每个元素从后面放置在新数组中,即从最 后一个元素迭代新数组。这样,数组arr[]的所有元素都将反向 放置在新数组中。我们从头迭代新数组并输出数组元素。
13.使用冒泡排序算法排序数组:冒泡排序的思想是比较相邻的元素的值,如果满足条件就交换 值。
这里以降序排列为例:如果前面一个元素大于后面一个元素,就交换两者的 值,这样一来,大的值就会后移,而较小的值会移动到数组的前面,一轮过 后,数组中最大那个数就会被挪到最后,其它较小的元素都会像气泡一样上 浮,经过几轮这样的排列后数组就按照从小到大的次序排好了。
14.官方的Arrays工具类
(1)int binarySearch(type[] a, type key):使用二分法查询key元素值在a数组中出现的索引;如果a
数组不包含key元素值,则返回负数。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确结果。
(2)int binarySearch(type[] a, int fromIndex, int toIndex, type key):这个方法与前一个方法类似,但它只搜索a数组中fromIndex到 toIndex索引的元素。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确结果。
(3)type[] copyOf(type[] original, int length):这个方法将会把 original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组就是原数组的前面length
个元素;如果 length大于original 数组的长度,则新数组的前面元素就是原数组的所有元素,后面补充О(数值类型)、false(布尔类型)或者null (引用类型)。
(4)type[ ] copyOfRange(type[ ] original, int from, int to):这个方法与前面方法相似,但这个方法只复制original 数组的from索引到to索引的元素。
boolean equals(type[] a, type[] a2):如果a数组和a2数组的长度相等,而且 a数组和a2数组的数组元素也一一相同,该方法将返回true。
(5)void fill(type[] a, type val):该方法将会把a数组的所有元素都赋值为val。
15.二维数组:例如:int score[2][3]。2是行数。3是列数。行数和列数:只能是整形常量,不能是变量
元素是在计算机中是按行存储,即先存储第一行所有元素,在存储第二行所有元 素,依次存储
初始化:int score[2][1]={{1,2,3},{4,5,6}};
16.类和对象:
(1)、类:类是面向对象程序设计实现信息封装的基础。类是一种用户定义的引用数据类型,也称类类型。
(2)、对象:对象(英语:object),是一个存储器地址,其中拥有值,这个地址可能有标识符指向此处。
方式不同:
(1)、类:类的实质是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型,不同的是它是一种复杂的数据类型。因为它的本质是数据类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。
(2)、对象:在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。
17.成员变量: 成员变量也称属性,是事物静态特征的抽象。成员变量分为两种:类的成员变 量和对象的成员变量(又称为实例变量);声明成员变量语法如下: [public|private][static][final]<type><variable_name>
各参数的含义如下:public、private:用于表示成员变量的访问权限。
static:表示该成员变量为类变量,也称为静态变量。
final:表示将该成员变量声明为常量,其值无法更改。
type:表示变量的类型。
variable_name:表示变量名称。
成员变量的默认值:布尔型(boolean)变量默认值为false,byte、short、int、long为0,字 符型为'\u0000'(空字符),浮点型(float double)为0.0,引用类型(String)为null
18.构造方法:(1).构造方法使用public 修饰
(2).构造方法没有返回值类型(连void 都没有)
(3).构造方法的名字必须与当前类名相同
(4)构造方法的内部有一个this指针,指向当前对象
(5)如果一个类没有手动指定构造方法,则编译器会提供一个默认的无参构造方 法,如果手动指定了构造方法,则编译器不再提供默认的无参构造方法
(6)无参构造方法存在的意义? 在堆区里面构造一个对象,对象中的元素存储的 数据还未知的时候,可以使用无参构造方法,后续代码在获得数据以 后,可以通过指针操作对象,读写数据
(7)带参构造方法存在的意义?在堆区里面构造一个对象的时候,已经很明确的 知道对象中存储的是什么内容,就可以使用带参构造方法
19.成员方法:方法是数据的操作的定义。在JAVA中,方法只能作为类的成员,也称为成员方 法。方法操作类所定义的数据,以及提供对数据的访问的代码。
方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类 型,也可以是复合数据类型(又称引用数据类型)。
对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这 些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递 给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
20. this关键字
(1)关键字this是一个变量,一个引用,保存当前对象的内存地址,指向自身。
所以严格意义来讲,this代表的就是“当前对象”。this储存在堆内存中对象的内部
(2)关键字this可以使用在实例方法中,谁调用这个实例方法,this就是谁。所以this代表的 是当前对象。
(3)关键字this也可以使用在构造器中,大部分情况下可以省略,但是用来区分局部变量和 实例变量的时候不能省略。
(4)this();这种语法只能出现在构造器的第一行,表示当前构造器调用本类其他的构造器, 目的是代码复用