我们于2021/07/13 的学习目标是:数组工具、内部类与异常,核心任务为:
1、学习技术:
1)、常用操作数组的工具
2)、内部类
3)、成员内部类
4)、内部类的测试类
5)、内部类的同名变量的调用
6)、静态内部类
7)、私有内部类
8)、局部内部类
9)、匿名内部类
10)、Lambda 表达式
11)、异常
2、文档总结
1、学习技术:
1)、常用操作数组的工具
JDK有帮助手册,可以详细查找命令的名称、功能和作用。
在java.util.Arrays类中,具有很多实用工具。
- 对比数组
static boolean equals(int[] a, int[] a2);
如果两个指定的int数组彼此相等 ,则返回 true
- 返回指定数组内容的字符串表示形式
static String toString(int[] a);
返回指定数组内容的字符串表示形式。
- 深度相等比较
static boolean deepEquals(Object[] a1, Object[] a2)
如果两个指定的数组彼此深度相等 ,则返回 true
- 数组拷贝、截取与填充
static int[] copyOf(int[] original, int newLength)
当新数组长度=原数组长度:原数组的拷贝
当新数组长度<原数组长度:默认从原数组索引为0的位置开始拷贝,拷贝参数2个
当新数组长度>原数组长度:最后的空余位置使用默认值填充
- 复制数组指定范围到新数组
static int[] copyOfRange(int[] original, int from, int to)
将指定数组的指定范围复制到新数组中。
新数组由copyOfRange方法内部创建
- 排序
static int [] new_number_array=sorting(int []);
直接对原数组进行排序
2)、内部类(了解)
内部类,就是在类中再定义类。当一类中的成员,作为另外一种事物的时候,这个成员就可以定义为内部类。
3)、成员内部类
public class Class001_Outer {
//成员: 类中方法外
private int i = 1;
private static int j = 5;
//成员内部类
class Inner{
private int a = 10;
public void testInner(){
System.out.println("成员内部类中的成员方法");
System.out.println(i);
System.out.println(j);
//outer();
}
}
public void outer(){
System.out.println("成员方法");
Inner in = new Inner();
System.out.println(in.a);
in.testInner();
}
}
一个类定义在外部类的成员位置就成为成员内部类,也具有类的特点,继承,实现等功能。成员内部类具有成员的特点,被成员修饰符修饰
注意:
在成员内部类中不能定义静态内容,除了静态常量,静态内部类才能任意定义静态内部
在成员内部类中可以使用外部类中的成员,包括私有的,静态的
在外部类中可以跟随成员内部类的对象使用成员内部类的成员
成员内部类的对象性需要通过外部类对象构建 外部类名.内部类类名 引用 = new 外部类().new 内部类();
跟随内部类的对象使用内部类的成员,注意访问权限
4)、内部类的测试类
测试成本员内部类使用
成员内部类的对象性需要通过外部类对象构建
//1)
Class001_Outer out = new Class001_Outer(); //外部类对象
Class001_Outer.Inner in = out.new Inner();
//2)
Inner in = new Class001_Outer().new Inner();
in.testInner();
5)、内部类的同名变量的调用
对于:
public class Class003_OuterTest {
int i=1;
class Inner{
int i=2;
public void inner(){
int i=3;
//在此调用局部变量i=3
//在此调用内部类成员变量i=2
//在此调用外部类成员变量i=1
}
}
}
要调用局部变量i:
System.out.println(i); //i = 3
要调用内部类成员变量i:
System.out.println(this.i); //i = 2
要调用外部类成员变量i:
System.out.println(Class003_OuterTest.this.i); //i = 1
6)、静态内部类
public class Class004_Outer {
//成员: 类中方法外
private int i = 1;
private static int j = 5;
//静态内部类
static class Inner{
//成员变量
int a = 1;
//静态变量
static int b = 10;
//成员方法
public void test(){
System.out.println(j);
System.out.println(new Class004_Outer().i);
}
//静态方法
public static void testStatic(){
System.out.println(j);
System.out.println(new Class004_Outer().i);
}
}
void outer(){
//静态内部类对象
Inner in = new Inner();
System.out.println(in.a);
System.out.println(in.b);
System.out.println(Inner.b);
Inner.testStatic();
in.test();
}
}
可以定义静态内容(成员),成员内部类中不可以直接定义静态内容除了静态常量以外
静态内部类中可以直接使用外部类中静态内容,需要通过外部类对象使用外部类中的成员(因为内部类本身是静态的)
外部类中可以直接通过内部类对象使用内部类成员,可以通过内部类的类名使用内部类静态内容
其他类中使用静态内部类中内容:
静态内部类中的静态内容 : 外部类类名.内部类类名.静态内容
静态内部类中的成员内容: new 外部类类名.内部类类名();
通过内部类对象调用它成员
7)、私有内部类
只能在当前外部类中通过内部类对象使用
对于:
private class Inner{
int a = 2;
static final int B = 10;
void test(){
System.out.println("私有内部类中的成员方法");
System.out.println(i);
System.out.println(j);
}
}
在外部需要先创建对象,后使用
void outer(){
System.out.println("外部类中的成员方法");
Inner in = new Inner();
System.out.println(in.a);
System.out.println(in.B);
System.out.println(Inner.B);
}
8)、局部内部类
public void test(){
class Inner{}
}
1、不能被成员修饰符(public,private,protected,static)等修饰
2、局部内部类中不能定义静态内容,除了静态常量
3、局部内部类中可以直接使用外部类成员,可以使用所在方法中的局部变量
4、局部内部类智能在当前所在的方法中通过内部类对象使用,其他位置无法使用
5、在局部内部类中使用了所在方法中的局部变量|形参,这个局部变量会默认被final修饰。从JDK8开始默认被final修饰,JDK7及以前的版本需要显示被final修饰。
9)、匿名内部类
public class Class007_Outer {
public static void main(String[] args) {
//匿名对象 : 只能在当前行使用一次
new String();
//创建 实现类对象调用重写后的抽象方法
new Demo().smoking();
//匿名内部类
//1) 匿名内部类对象 : 没有引用指向的匿名对象 :只能在当前行使用一次
new Smoke() {//实现类的类体
@Override
public void smoking() {
System.out.println("一边哈哈笑一边吸烟...");
}
}.smoking();
//2. 引用指向的匿名内部类对象 : 通过引用后续使用多次
Smoke s = new Smoke(){
@Override
public void smoking() {
System.out.println("一边吸气一边吸烟");
}
};
s.smoking();//调用重写的方法
s.smoking();
//3.匿名内部类对象作为实参传递
test( new Smoke(){
@Override
public void smoking() {
System.out.println("一边吸气一边吸烟");
}
});
//通过匿名 内部类简化子类
Car car = new Car(){
@Override
void run() {
System.out.println("run....");
}
};
car.run();
}
static void test(Smoke smoke){
smoke.smoking();
}
}
//抽象类
abstract class Car{
abstract void run();
}
//接口
interface Smoke{
void smoking();
}
//实现类 ,重写抽象方法
class Demo implements Smoke{
@Override
public void smoking() {
System.out.println("一边呲着牙一边吸烟...");
}
}
作用: 用来简化没有本身自己作用的实现类|子类
上层 : 接口 | 抽象类
10)、Lambda 表达式
从JDK8开始新增Lambda表达式,作用是简化匿名内部对象。使用的前提是只有一个必须被重写的抽象方法的接口,即函数式接口。
@FunctionalInterface
interface the_interface{}
可检测接口是否为函数式接口。
语法:
()->{}
() : 匹配要重写的抽象方法的参数列表
-> : 箭头函数 箭头符号
{} : 要重写的抽象方法的方法体
注意: 当方法的形参为一个函数式接口,实参可以为lambda表达式
对于接口:
@FunctionalInterface
interface Run{
boolean run(int x);
static void test(){}
}
要编写的匿名内部类对象:
Run r = new Run(){
@Override
public void run() {
System.out.println("run....");
}
};
lambda写法1 : ()->{}
Run r = ()->{
System.out.println("run....");
};
r.run();
lambda写法2: 当方法体只有一句 ,前后的{}可以省略
Run r = ()->System.out.println("跑....");
r.run();
lambda写法3: 当方法具有参数,参数的类型可以省略
Run r = (a,b)->System.out.println("跑...."+(a+b));
r.run(1,2);
lambda写法4: 当方法的参数只有一个 ,前后的()可以省略
Run r = a -> System.out.println("跑...."+(a));
r.run(1);
lambda写法5: 当方法存放返回值,并且{}中的语句体只有一句,就是return语句,前后的{}与return关键字可以一起省略
Run r = a -> a>0;
11)、异常
异常指程序无法正常执行完毕
Throwable又分为Error和Exception。其中Error是错误,一般由虚拟机生成并脱出,无需要程序猿管理;Exception是异常,又分为CheckedException和RuntimeException。
CheckedException指编译时异常或者检查时异常,发生在程序编译期间。程序如果遇到编译时异常没有处理,程序无法正常运行。
RuntimeException 运行时异常指发生程序运行期间的异常。一般可以通过增强程序健壮性的代码if处理。
注意:如果程序遇到异常没有处理,无法继续执行
常见的一些运行时异常:
- 空指针异常 NullPointerException
- 数组越界异常 ArrayIndexOutOfBoundsException
- 数组长度负数异常 NegativeArraySizeException
- 类型转换异常 ClassCastException
- 数学异常 ArithmeticException
- 数字格式异常 NumberFormatException