@MRsunhuimin
2019-07-24T11:20:33.000000Z
字数 4991
阅读 535
java基础
(1)普通类可以被实例化,普通类有方法体
(2) 抽象类不能被实例化,抽象类没有方法体
(1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
(2)如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
(3)没有抽象构造方法,也没有抽象静态方法
(4)抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
(5)抽象类不能实例化对象,抽象类本身也不能被实例化,只能被继承
(6)抽象类使用abstract来修饰
(1)接口是一种“能力”
(2)在程序设计时,关心实现类有何能力,而不关心实现细节;面向接口的约定而不考虑接口的具体实现。
(1)接口不可以被实例化
(2)实现类必须实现接口的所有方法
(3)实现类可以实现多个接口,使用implements,多个接口用逗号隔开
(4)接口中的变量都是静态常量,即 public static final
(1)接口中的成员变量默认都是public static final的,必须显示初始化;
(2)接口中的方法默认都是public static的;
(3)接口没有构造方法,不能被实例化;
(4)一个接口不能实现另一个接口,但可以继承多个其他接口;
(5)一个类必须实现接口抽象方法(implements),除非这个类也是抽象类
//阅读代码,找出错误
public interface MyInterface {
public MyInterface(); //F(接口没有构造方法)
public void method1(); //T
public void method2(){ } //F(方法默认都public static)
private void method3(); //F(private错误)
void method4(); //T
int method5(); //T
int TYPE = 1; //T
}
相同点:
(1)都代表系统的抽象层
(2)都不能被实例化
(3)都能包含抽象方法
(4)用于描述系统提供的服务,不必提供具体实现
不同点:
(1)在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
(2)抽象类便于复用,接口便于代码维护
(3)一个类只能继承一个直接的父类,但可以实现多个接口
使用原则:
(1)接口做系统与外界交互的窗口
(2)接口提供服务
(3)接口本身一旦制定,就不允许随意修改
(4)抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
(1)属性全都是全局静态常量
(2)方法都是全局抽象方法
(3)无构造方法
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws
第一种情况 :正常
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
第二种情况:出现异常
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
异常是一种特殊的对象,类型为java.lang.Exception或其子类
异常处理过程:
try代码块————————>发生异常后产生异常对象————————>异常类型匹配———————>(进入)catch代码块——————>程序继续执行
第三种情况:异常类型不匹配
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
异常处理过程:
try代码块————————>发生异常后产生异常对象————————>异常类型匹配———————>程序中断运行(不进入catch代码块)
方法 | 说明 |
---|---|
void printStackTrace() | 输出异常的堆栈信息 |
String getMessage() | 返回异常信息描述字符串,是printStackTrace()输出信息的一部分 |
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
在try-catch块后加入finally块
1. 无论是否发生异常都执行
2. 不执行的唯一情况:catch代码块中存在System.exit(1)
3. 通常用于释放资源
//存在return的try-catch-finally块
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
异常处理过程:
try代码块————————>发生异常后产生异常对象————————>异常类型匹配———————>进入catch代码块————————>进入并执行finally块————————>返回catch代码块————————>执行return退出方法
引发多种类型的异常:
1. 排列catch 语句的顺序:先子类后父类
2. 发生异常时按顺序逐个匹配
3. 只执行第一个与异常类型匹配的catch语句
try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出了异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
public void method(){
try {
// 代码段
} catch (Exception e) {
e.printStrackTrace();//输出异常
throw new Exception("这是一个自定义的异常");
}
}
过程:
定义异常类————————>编写构造方法,继承父类的实现————————>实例化自定义异常对象————————>使用throw抛出
1. 异常处理与性能
2. 异常只能用于非正常情况
3. 不要将过于庞大的代码块放在try中
4. 在catch中指定具体的异常类型
5. 需要对捕获的异常做处理
1. 异常分为Checked异常和运行时异常
1.1 Checked异常必须捕获或者声明抛出
1.2 运行时异常不要求必须捕获或者声明抛出
2. try-catch-finally中存在return语句的执行顺序
3. finally块中语句不执行的情况
4. throw和throws关键字的区别
墨盒:彩色、黑白
纸张类型:A4、B5
墨盒和纸张都不是打印机厂商提供的
打印机厂商要兼容市场上的墨盒、纸张
分析:
纸 -----接口 抽象方法 [输出纸张大小]
A4纸 实现纸 输出A4
B5纸 实现纸 输出B5
墨盒 ----接口(抽象) 抽象方法 [输出墨盒颜色]
黑白墨盒 实现墨盒 输出黑白
彩色墨盒 实现墨盒 输出彩色
打印机
纸接口 a ;
墨盒接口 b ;
打印方法
package com.hz.printer_interface;
/*
* 纸张
*/
public interface Paper {
public abstract String paperSize () throws Exception;
}
package com.hz.printer_interface;
/*
* 墨盒
*/
public interface InkBox {
public abstract String boxColor() throws Exception;
}
package com.hz.printer_interface;
/*
* A4纸
*/
public class A4paper implements Paper {
@Override
public String paperSize() throws Exception{
return("A4纸");
}
}
package com.hz.printer_interface;
/*
* B5纸
*/
public class B5paper implements Paper {
@Override
public String paperSize() throws Exception{
return ("B5纸");
}
}
package com.hz.printer_interface;
/*
* 彩色墨盒
*/
public class coloursBox implements InkBox {
@Override
public String boxColor() throws Exception{
return ("彩色墨盒");
}
}
package com.hz.printer_interface;
/*
* 黑白墨盒
*/
public class bwBox implements InkBox {
@Override
public String boxColor() throws Exception{
return ("黑白墨盒");
}
}
package com.hz.printer_interface;
/*
* 打印机
*/
public class printer {
private Paper paper;
private InkBox inkbox;
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public InkBox getInkbox() {
return inkbox;
}
public void setInkbox(InkBox inkbox) {
this.inkbox = inkbox;
}
/*
* 定义一个show()方法用于输出结果
* 定义当前类的对象调用接口的方法,用于传结果
*/
public void show() throws Exception{
System.out.println("使用"+this.inkbox.boxColor()+"墨盒在"+this.paper.paperSize()+"纸张上打印");
}
}
package com.hz.printer_interface;
public class print_test {
public static void main(String[] args) throws Exception{
try {
printer pr = new printer();
/*
* 使用彩色墨盒墨盒在A4纸纸张上打印
* 用接口new实现(类)
*/
Paper p = new A4paper();
InkBox i = new coloursBox();
pr.setInkbox(i);
pr.setPaper(p);
pr.show();//调用show方法输出
/*
* 使用黑白墨盒墨盒在B5纸纸张上打印
*/
Paper p1 = new B5paper();
InkBox i1 = new bwBox();
pr.setInkbox(i1);
pr.setPaper(p1);
pr.show();
} catch (Exception e) {
e.printStackTrace();//输出异常
}
}
}