抽象类和接口
抽象类定义:
抽象类:又叫抽象基类(不是鸡肋):他在定义的时候使用 abstract 关键字标记的一般类.他可包含一般类所包含的所有特性,例如,字段,属性,方法,另外他还包含一个很特殊的方法,叫抽象方法(这些方法基本上是没有执行代码的函数标题,而派生于该类的的类就必须提供执行的代码).最可气的是,他不能被实例化,他主要的用在类的定义和部分实现这方面,所以他需要在扩充类中完整的扩充并实现功能.
抽象方法定义:
抽象方法;当类中的方法在声明的时候加上 abstract 关键字的时候,他就被我们称为抽象方法
提醒:只有在抽象类和接口中才可以使用抽象方法.
抽象类特点:
1.包含抽象方法的类一定是抽象类
2.抽象方法和抽象类都用关键字abstract修饰
3.构造方法,static方法都不能定义为抽象方法
4.抽象方法不能使用private访问控制符修饰
5.抽象方法只需要声明,不需要实现
6.抽象类中可以定义构造方法,但是抽象类不能创建对象
7.子类继承抽象类时,需要重写抽象类中所有的抽象方法,除非子类也是抽象类
抽象类的语法:
[访问控制符] abstract class 类名{
0-n个属性;
[修饰符] 返回值类型 方法名([参数列表]){
方法体;
[return 返回值;]
}
[修饰符] abstract 返回值类型 方法名([参数列表]);
}
注意;1.如果一个类包含抽象方法,那么这个类一定是抽象类
2.抽象类可以包含普通方法
3.普通类继承抽象类,一定要实现(重写)父类的抽象方法
接口
接口特点:
1.一个类只能继承一个直接的父类,但是一个类可以实现多个接口(多继承)
2.接口中不能定义构造方法,接口不能实例化
3.接口中方法全部都是抽象方法,接口中属性全部都是全局常量
4.当一个类实现(继承)某个接口时,他必须实现接口中所有的方法,除非这个类定义为抽象类
接口语法:[修饰符] interface 接口名{
全局变量;
抽象方法;
}
包装类
8中基本数据类型对应的包装类:int——Integer char——Character
除了int、char外其他的6个都是首字母改大写即可
Byte、Short、Integer、Long、Float、Double都是Number的子类
Character、Boolean都是Object的子类
基本数据类型和包装类型转换:
自动装箱:将基本数据类型直接赋给一个包装类型对象,或者直接赋给一个Object类型对象
自动拆箱:包装类型对象可以直接赋给一个基本类型变量
基本数据类型和字符串转换:
字符串---》基本类型(使用对应包装类的parseXXX()方法完成)
基本类型---》字符串(使用String类中的valueOf()方法完成,或则使用基本类型加上一个空字符串)
异常处理
异常处理原理:
Error类对象由Java虚拟机生成并抛出;一般不能由应用程序直接处理,必须交由操作系统处理。(硬件原因造成的运行错误)
Exception类对象由应用程序处理或抛出。Exception分为两类:
1.运行时异常
RuntimeException的子类异常。Java编译器允许程序不对它们做出处理
2.非运行时异常
除了运行时异常之外的其他由Exception继承来的异常类。Java编译器要求程序必须捕获或声明这种异常,否则编译就报错
异常处理方法:
自行处理:可能引发异常的语句封入在 try块内,而处理异常的相应语句则封入在 catch 块内
回避异常:在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,必须由调用者处理
五个关键字:
try…catch 最基本的异常处理方式
try…catch…finally如果无论发生什么情况,有些代码必须执行,则可以放到finally块中(eg:关闭资源、事务处理)
throws 处理异常(抛出异常)
throw 抛出自定义异常
Final、finally、finalize的区别:
Final修饰类:类不可被继承
Final修饰变量:变量值不可变
Final修饰方法:方法不可被重写
Finally用于捕获异常 try catch finally语句
Finalize用于处理垃圾回收
多线程
多线程概念:
程序:程序就是一段静态的代码,他是程序执行的蓝本
进程:进程本质是程序的一次动态执行 特点:1.动态性 2.并发性 3.独立性
线程:进程内部的一个执行单元。也可称为子进程
多线程的优势:
1.多线程使系统空转时间减少,提高CPU利用率
2.进程间不能共享内存,但线程之间共享内存非常容易
3.使用多线程实现多任务并发比多进程的效率高
4.Java语言内置多线程功能支持,简化了Java的多线程编程
多线程创建:继承Thread类,重写run方法
实现Runnable接口,实现run方法
启动线程:
新建的线程不会自动执行,必须通过start()方法启动。
注意:
1.直接调用run()方法不会启动线程,只是一次普通的方法调用。在多线程的程序中永远不会调用run方法。
2.一条线程只能启动一次。如果启动多次会报IllegalThreadStateException异常。
启动继承Thread类的线程
启动实现Runnable接口的线程
创建线程方法对比:继承Thread类:优点, 简单 缺点,无法在继承其他类、无法实现资源共享
实现Runnable接口:优点,可以继承其他类、可以实现资源共享 缺点,复杂
线程生命周期:新建-就绪-运行-阻塞-死亡
线程同步:
间接相互制约:A与B两条线程,A请求打印机时,CPU将打印机分配给B,A只能等待B打印完,A才能从阻塞转为就绪态
2.直接相互制约:直接相互制约主要用于进程间相互合作