Java小细节(四)
上集 (Java小细节(三))
多态(一个对象对应着不同类型)
- 体现:父类或者接口的引用指向其子类的对象。
- 好处:限定功能使用,提高了代码的扩展性,前期定义的代码可以使用。
- 弊端:前期定义的内容不能使用(调用)后期子类的特有内容。(向上转型,子类对象提升成了父类对象类型)无法调用子类特有功能。
- 前提:
1,必须有关系,继承,实现。
2,要有覆盖(只发生在函数上)。 - 想使用子类特有功能。向下转型:子类 z=(子类)a;
- a instanceof A;//用于判断对象的具体类型。只能用于引用数据类型判断。
内部类(相当于外部类成员)
- Outer.Inner in=new Outer().new Inner();//直接访问外部类中内部类的成员。
- Outer.Inner in=new Outer.Inner();//如果内部类是静态的,相当于一个外部类。
- Outer.Inner.function();//如果内部类是静态的,内部类的成员也是静态的。
- 如果内部类中定义了静态成员,该内部类也必须是静态的。
- 内部类可以直接访问外部类的成员。以为内部类持有了外部类引用。外部类名.this
- 局部内部类只能访问局部中被final修饰的局部变量。
- 匿名内部类
匿名子类重写父类方法: - 匿名内部类应用。
对象初始化过程
- 1,成员变量初始化。
2,构造函数进栈。
3,(有父类的话)父类构造函数初始化。
4,显示初始化。(成员变量赋值等)
5,构造代码块初始化。
6,构造函数继续初始化。
异常
- 最终问题(不正常情况)分城两类。
Throwable:该体系的特点就在于Throwable及其所有的子类都具有可抛性。(throws、throw)
1,一般不可处理。Error
特点:是由jvm抛出的严重性问题。这种问题发生一般不针对性处理。直接修改程序。
2,可以处理的。Exception - 注意:让一个自定义类成为异常类,必须继承异常体系,因为只有成为异常体系的子类才具有可抛性,才能被两个关键字(throw、throws)所操作。
- 异常的分类:
1,编译时检测异常:只要是Exception和其子类,除了特殊子类RuntimeException体系。
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。这样的问题都可以针对性的处理。
2,编译时不检测异常(运行时异常):Exception中的RuntimeException和其子类。
这种问题的发生,无法让功能继续,运算无法进行,更多的是因为调用者的原因或者引发了内部状态改变导致的。这种问题一般不处理,直接编译通过,在运行时,让调用者调用的程序强制停止,让调用者对代码进行修正。 - throws和throw的区别
1,throws使用在函数上用于声明。
throw使用在函数内。
2,throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是异常对象。 - 多catch情况下存在父类Exception要放在最下面。
- 异常处理的原则:
1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。否则必须在函数内用try catch捕捉,否则编译失败。
2,如果调用到了声明异常的函数,要么try catch要么throws,否则编译失败。
3,功能内容可以解决,用catch。
解决不了,用throws告诉调用者,由调用者解决。
4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。内部有几个需要检测的异常,就抛几个异常,对应几个catch。 - finally一定会被执行(除了System.exit(0)//关闭虚拟机)。通常用于关闭(释放)资源。
- 没对异常进行处理,就要声明异常。
- 异常的注意事项:
1,子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类的覆盖方法只能抛出父类异常的子集。
3,如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛出异常,只能捕捉异常。