内部类
-
描述事物内部的事物 ; 就是一个类定义在另一个类的内部
-
当内部类定义在成员变量的位置上时,可以被成员修饰符修饰,修饰后会具备修饰符的特征:
-
private : 只能在当前类中访问
-
static : 访问出现局限性
-
private int num = 110;
class Inner{
public void show(){
// 内部类可以访问所在外部类的所有成员,包括私有成员在内
System.out.println("num = " + num);
}
}
public void function(){
// 外部类要访问内部类,必须创建对象
Inner inner = new Inner();
inner.show();
}
-
间接访问 :
-
Outer outer = new Outer();
outer.function();
-
-
直接访问(了解) :
-
Outer.Inner inner = new Outer().new Inner();
inner.show();
-
-
部内部类 : 定义在局部位置的内部类,不能被成员修饰符修饰
-
在局部内部类中只可以访问当前方法中 final 类型的参数与变量
匿名内部类 : 没有名字的内部类
-
本质 : 就是一个有点胖的匿名对象
-
格式 : new 父类/接口(){} ;
-
new Object(){
public void show1(){
System.out.println("匿名内部类 num = " + num);
}
}.show1(); -
computer.function(new USB(){
@Override public void start() {
System.out.println("摄像头开启");
}
@Override public void close() {
System.out.println("摄像头关闭");
}
}); -
Object类中的equals默认使用 == 进行比较
获取字节码文件对象的三种方式
-
// 1. Object : Class<?> getClass()
a = new A();
Class<?> clazz1 = a.getClass();
// <> : 泛型 -
// 2. 所有的类型都有一个静态的默认的属性 : .class
Class<?> clazz2 = A.class;
System.out.println("int.class = " + int.class);
System.out.println("void.class = " + void.class); -
// 3. Class : public static Class forName(String 全类名)
Class<?> clazz3 = Class.forName("com.msr.lesson07.A"); -
// 返回对象的哈希代码值/地址值。
System.out.println(a.hashCode());
// 十进制 ---> 十六进制
System.out.println(Integer.toHexString(a.hashCode()));
// void notify()
// 唤醒正在等待此对象的 监控。
// void notifyAll()
// 唤醒在此对象的监视器上等待的所有线程。
// void wait()
// 使当前线程等待,直到它被唤醒,通常 通过被通知或中断。
// void wait•(long timeoutMillis)
// 使当前线程等待,直到它被唤醒,通常 通过被通知或打断,或直到 一定数量的实时时间已经过去。
// void wait•(long timeoutMillis, int nanos)
枚举
-
一个特殊的类,对象是有限个并且是不可变的
-
public enum Season {
SPRING("春天", "春风又绿江南岸"),
SUMMER("夏天", "映日荷花别样红"),
AUTUMN("秋天", "秋水共长天一色"),
WINTER("冬天", "千里冰封,万里雪飘");
}
// 枚举中的构造器都是私有
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
异常
-
异常体系 : Throwable : 是Java语言中所有错误和异常的超类 |Error/错误 : 表示合理的应用程序不应该试图捕捉的严重问题. |Exception/异常 : 表示合理的应用程序可能想要捕获的条件。 |RuntimeException/运行时异常 : 代码执行过程中才出现的异常 , 比如 NullPointerException |RuntimeException之外的异常/编译时异常 : 编译时期就会提示,比如 ClassNotFoundException
-
只有作为此类实例(或其子类之一)的对象才会由Java虚拟机抛出, 或者可以由Java抛出语句抛出。 类似地,只有这个类或它的一个子类可以是catch子句中的参数类型。 为了在编译时检查异常,Throwable和任何不属于RuntimeException或Error子类的Throwable子类都被视为已检查异常
-
异常处理基本格式 :
try{
可能发生异常的代码;
}catch(异常类型 异常名){
异常发生时的处理方式;
}finally{
一定要被执行的代码;
}
-
注意 : 1.有异常但没有异常处理结构时 : 程序会终止在异常发生的那一行 2.有异常并且有对应异常处理结构时 : 程序在异常产生的位置开始跳转 ----> catch语句 ----> finally语句 ----> 程序正常运行 3.有异常并且有异常处理结构 , 但是没有对产生的异常进行处理时 : 程序在异常产生的位置开始跳转 ----> finally语句 ----> 程序打印异常信息 ----> 程序终止 4.有 处理方式 , 但没有异常产生 : try语句执行完后 --> finally语句 ---> 程序正常运行
-
// finally 唯一不会被执行的情况 // System.exit(0);// 程序立即结束 // finally 不是必须的,常用于资源释放 , 比如 : scanner.close();
-
多异常的处理 : 当一个try对应多个catch语句时 , catch语句中的父类异常要写到最后
-
throw : 动词 , 用于函数内部抛出一个异常 ; 如果抛出的是一个编译时异常,需要在函数部分进行声明 ; 如果抛出的是一个运行时异常,不需要在函数部分进行声明 ; throws : 名次 , 用于函数声明部分 , 声明异常
-
String getMessage() : 获取异常产生的原因 String toString() : 异常名称 + 异常原因 void printStackTrace() : 打印异常的原因 , 异常名称 以及异常产生的位置 该方法也是 JVM 的默认处理方法