多态
动态编译:类型、可扩展性
即同一方法可以根据发送对象的不同而采用多种不同的行为形式
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
多态存在的条件:
-
有继承关系
-
子类重写父类方法
有些方法不可以重写:
- static 方法属于类,它不属于实例
- final:常量
- private方法
-
父类引用指向子类对象 Father f1 = new Son();
注意:
- 多态是方法的多态,属性没有多态
- 父类和子类有联系 类型转换异常 如果两者没有联系 ClassCastException!
- 存在条件
instanceof和类型转换
System.out.println(x instanceof y)
x和y之间是否存在父子关系,否则编译报错
Person X = new Student()
//左边的Person是引用类型,右边Student是实际类型
X instanceof Y
//X引用类型是否和Y有继承关系,否则编译报错;如果实际类型是Y的父类,就是false
注意:
- 父类引用子类的对象
- 子类转换父类,向上转型;父类引用子类,向下转型
抽象类
abstract修饰符可以用来修饰方法也可以修饰类,如果装饰方法,那么该方法就是抽象类;如果修饰类,那么该类就是抽象类。
抽象类中可以写普通方法,抽象方法必须在抽象类中。
抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。约束~
抽象方法,只有方法的声明,没有方法的实现,它是用来让子类的实现的。
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
接口的定义和实现
普通类:只有具体的实现
抽象类:具体实现和规定都有
接口:只有规范!自己无法写方法~
接口就是规范,定义了一组规则。接口的本质就是契约。
接口的作用:
- 约束
- 定义一些方法,可以让不同的人实现
- 方法 public abstract
- 常量 public static final
- 接口不能被实例化,接口中没有构造方法
- 接口可以实现多个 implements
- 实现接口必须要重写接口中的方法
N种内部类
内部类就是在一个类的内部再定义一个类。
1.成员内部类
2.静态内部类
3.局部内部类
4.匿名内部类
Error和Exception
什么是异常:
- 异常指程序运行中出现的不期而至的各种状况
- 异常发生再程序运行期间,它影响了正常的程序执行流程
RuntimeException 运行时异常:
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 空指针异常
ArithmeticException 算术异常
MissingResourceException 丢失资源
ClassNotFountException 找不到类异常
这些异常一般由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
Error和Excception的区别:
Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常的时候,java虚拟机(JVM)一般会终止线程;Exception通常情况是可以被程序处理的,并且再程序中应该尽可能的去处理这些异常。
异常捕获和抛出
异常处理五个关键字
try\catch\finally\throw\throws
快捷键:Ctrl+Alt+T
自定义异常
使用java内置的异常类可以描述在编程时出现的大部分异常情况。用户自定义异常类,只需要继承Exception类就可以。
步骤:
- 创建自定义异常类
- 在方法中通过throw关键字抛出异常
- 如果当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续下一步
- 在出现异常方法的调用者中捕获并处理异常。
实际应用中的总结
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能被遗漏的异常
- 对于不确定的代码,也可以加上try-catch,处理潜在的异常
- 尽量去处理异常,切忌知识简单调用printStackTrace()去打印输出
- 尽量添加finally语句块去释放占用的资源