Java知识查漏补缺-04

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);
      }
}
 
 

猜你喜欢

转载自www.cnblogs.com/cuijunfeng/p/13205591.html