多态:指一个引用(类型)在不同情况下的多种状态;换句话说,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。
方法重载(overload)实现的时编译时的多态性(前绑定),而方法重写(override)实现的是运行时的多态性(后绑定);
一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。运行时的多态是面向对象最精髓的东西,要实现多态,需要做两件事:
所谓多态,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行间才能决定。
因为在程序运行时才能确定具体的类,这样不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
abstract
关键字来修饰方法【抽象方法】,用abstract
来修饰该类【抽象类】abstract
关键字来修饰的一个类时,这个类就叫抽象类;abstract
关键字来修饰一个方法时,这个方法就是抽象方法;{}
;final
修饰,定义抽象类就是为了让其他类继承的,如果定义为final
,该类就不能被继承,相互矛盾。接口就是给出一些没有内容的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。语法:
class <类名> implements <接口>{
变量;
方法;
}
可以把接口看作是更加抽象的抽象类,抽象类中的方法可以有方法体,接口中的所有方法都没有方法体,接口体现了程序设计的多态和高内聚低耦合的设计思想。
private
和protected
修饰;
static
,无论你加不加static
修饰;用于修饰类、属性和方法
final
修饰的类不可以被继承;final
修饰的方法不可以被重写(Override);final
修饰的变量不可以被改变,主要被final
修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的;final
可以修饰类、变量、方法,修饰类表示该类不能被继承,修饰方法表示该方法不能被重写,修饰变量表示该变量是一个常量,不能被重新赋值;finally
一般作用在try-catch
代码块中,该代码块都会执行,一般用来存放一些关闭资源的代码;finalize
是一个方法,始于Object
类的一个方法,而Object
类是所有类的父类。该方法一般由垃圾回收器来调用,当我们调用System.gc()
方法的时候,由垃圾回收器调用finalize()
,回收垃圾。Throwable
是Java语言中所有错误或异常的超类。
当出现程序无法控制的外部环境问题时,Java就会用异常对象来描述。
java.lang.Exception
java.lang.RunTimeException
java.lang.Error
顶层是java.lang.Throwable
类,检查性异常、运行期异常、错误都是这个类的子孙类。java.lang.Exception
和java.lang.Error
继承自java.lang.Throwable
,而java.lang.RunTimeException
继承自java.lang.Exception
。
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
try{
...
code; // 发生异常,中断,进入catch代码块
...
}catch(Exception e){ // Exception是父类,可以捕获所有的异常
// 把异常的信息输出,找到bug,错误发生点
e.printStackTrace();
}
Exception e
方便点;如果把finally
块放在try...catch...
语句后,finally
块一般都会得到执行,它相当与一个万能的保险,即使前面的try
块发生异常,而又没有对应的catch
块,finally
块将马上执行;
try{
...
FileReader fr = new FileReader(filePath); // 假设打开
Socket sc = new Socket(ip, socketNum); // 发生异常,中断
...
}catch(Exception e){
e.printStackTrace(); // 抛出异常,文件处于打开状态,需要必要的操作
}finally{
// 不管有没有异常,都会执行
// 一般,把需要关闭的资源:文件、连接、内存等进行相关操作
try{
if (fr != null){ // 如果打开了,就关闭
fr.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
finally将不会被执行
finally
块中发生了异常;System.exit()
;将异常抛给使用者,让调用者处理异常
public class test{
public static void main(String[] args){
Father father = new Father();
father.test1();
}
}
class Father{
private Son son = null;
public Father(){
son = new Son();
}
public void test1(){
System.out.println("1");
try{
son.test2(); // 函数抛出异常,你需要处理,也可以继续抛出
}catch(Exception e){
e.printStackTrace();
}
}
}
class Son{
public void test2() throws Exception{// 抛出异常,谁调用谁管
FileReader fr = null;
fr = new FileReader(filePath); // 文件不存在,检查性异常,try catch
// 可以不处理,将异常抛出去
}
}
原文:https://www.cnblogs.com/ly-leah/p/13760854.html