接口与抽象类

来源:互联网 发布:自学预算员 知乎 编辑:程序博客网 时间:2024/05/17 08:46
首先,复习下类的初始化过程:
1,先初始化父类的静态成员变量和静态代码块.(按声明的顺序初始化).
2,然后初始化父类的非静态成员变量和非静态代码块(按声明顺序初始化).
3,然后是父类的构造方法,关键是看子类调用的父类哪个构造方法(默认是无参构造方法).
4,然后是子类的静态成员和静态代码块.
5,然后初始化子类的非静态成员和非静态代码块.
6,然后是子类的构造方法.

注意:静态成员变量和静态代码块,初始化过程中,仅仅执行一次,
        而非静态的每次都会执行一次!

        这也就是常量是静态的,实例变量是非静态的.

还有:1,如果调用子类的有参构造方法,父类只有一个无参构造,那么子类会默认调用父类的无参构造
        2,如果父类只有一个有参构造,那么子类必须显示的调用父类的有参构造.

还有抽象类是不能被实例化的,那么,实例化只能是一个非抽象类发起的,
不管这个类有几个抽象类(间接的继承),都是先由最上端的父类开始初始化,
按照初始化过程,从上而下,逐一启动初始化过程!初始化只和父类和子类的数据有关系,
跟方法是没有关系的!

<<父类>>抽象
      |
     \ /
 <<父类>>
       |
       \/
  <<父类>> 非抽象
        |
        \/
   <<子类>>

=================================================================================
抽象类和接口的关系:
1,抽象类实现接口,可以不实现,也可以部分实现

 覆盖父类的方法,父类一定有实现

实现接口方法,就算抽象父类重写成抽象方法

其实接口方法也是抽象方法,只是没有写abstract修饰词,
代码反编译工具反编译的接口代码是这个样子的:
public abstract interface AAA{
    public abstract void hello();
}

也都是抽象的.

不管是接口的方法还是抽象类的抽象方法,统统是未实现的方法.
未实现的一律使用空心的三角型表示,
实现的覆盖的一律用绿色实心三角形表示.

方法如果throw异常,不管需不需要返回值

public String name(){
    throw new NullpointerException("不管返回值,直接抛异常!");
}
0 0
原创粉丝点击