Java基础学习day04
(p341-395)
抽象类和抽象方法(abstract)
-
以前是子类直接extends继承父类,但这时父类还不是一个抽象的类,他可以自己实例化;为了让父类只作为一个提供方法的类,而不用去做具体的实现,把方法实现延迟到子类的去做,高内聚低耦合,这使得抽象类是无法实例化的;
-
抽象类和普通类一样,必须要有构造器,这必须符合子类实例化对象的要求,就是调用父类的构造器;
-
抽象方法的声明public static void eat(); 注意,抽象方法并没有方法体,只有方法的声明,方法体的实现交给子类去完成
-
包含抽象方法的类一定是个抽象类,反之不成立
-
子类必须重写父类的所有抽象方法,普通方法不需要
-
abstract只能抽象方法和类,不能抽象私有方法、静态方法、final方法、final类
设计模式——模板方法
接口(Interface)
-
类只能单继承,接口可以多实现
-
JDK7以前,只能定义全局变量和抽象方法
全局变量: public static final
抽象方法:public abstract
-
接口不能定义构造器,表明接口不能被实例化,接口的定义方法interface A{},说到底也是一个类,不是方法,没有括号
-
接口通过让类的实现implement方式来使用
如果实现类实现了接口中的所有抽象方法。则此实现类就可以实例化
如果实现类没有实现接口中的而所有抽象方法,这此实现类仍然是一个抽象类
-
接口也可以继承接口,而且可以继承,interface A{} ;interface B extends A{}
-
电脑的驱动就是USB接口的实现,数据库的连接实现也就是JDBC接口,接口也满足多态性
-
体会面向接口编程
设计模式——代理模式,工厂模式
接口面试题
解析:接口和类属于同一层次,不同于子父类和父类的继承,所以编译时就会报错,提示x指示不明确
继承至B,所以可以用super;接口的内部常量是全局变量,只是这里可以省略不写static,所以就可以用A.x调用,即类.类变量
JDK8的新特性
-
接口中可以定义静态方法,并且只能通过接口来调用;
-
接口中可以定义默认方法,默认方法可以通过实现类的对象去调用;
-
如果实现类重写了接口中的默认方法,调用时,仍然是调用重写后的方法
-
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。-- >类优先原则
-
如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错。-->接口冲突,想用的话必须在子类重写该方法
内部类
了解
异常处理
Error : java虚拟机也无法处理的错误,一般不编写针对性的代码进行处理
Excepction:可以处理
常见的异常:运行时异常
异常处理方式:
方式一 : try-catch-finally
package com.cjf.test;
import org.junit.Test;
public class ExceptionDeal {
@Test
public void test1(){
String str = "123";
str ="abc";
try{
//try将可能的异常代码写在里面
//try结构中定义的变量出了try结构就不能被调用了
int num = Integer. parseInt(str);
System.out.println("he11o-----1");
}catch(NumberFormatException e){
System. out . println(e.getMessage());
}catch(NullPointerException e){
e.printStackTrace();
}
//捕获到的异常与catch代码块中声明的异常一致,则抛出异常,继续往下执行代码
//如果不一致,则提示异常,代码无法继续执行
System.out.println("he110-----2");
}
}
1. finally是可选的
2. finally中声明的是一定会被执行的代码。 即使catch中又出现异常了,try中有return语句, catch中有return语句等情况。先执行finally,再执行return
3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要 自己手动的进行资释放。此时的资源释放,就需要声明在finally中。
总结:运行时异常开发时一般不处理,首先你并不知道运行时异常,如果有肯定是直接处理了,运行时异常处理只不过延迟了异常的处理,实际并没有什么作用
但编译时异常一定要处理,不然连编译都过不了
方式二: throws +异常类型
手动抛出异常:
package com.cjf.test;
import javax.management.RuntimeErrorException;
public class Handthrow {
//手动抛出异常
public static void main(String[] args) {
Student s = new Student();
s.regist(-1);
}
static class Student{
public Student() {
}
private int id;
public void regist(int id) {
if (id>0) {
this.id=id;
}else {
//手动抛出异常对象
throw new RuntimeException("发生运行时异常");
}
}
}
}
}
自定义异常:
package com.cjf.test;
public class DIVException extends RuntimeException{
static final long serialVersionUID = - 7897190745766939L;
public DIVException(){
}
public DIVException(String msg){
super(msg);
}
}