zoukankan      html  css  js  c++  java
  • Java 接口和抽象类的区别

    Java 接口和抽象类的区别

    @author ixenos

     

    接口和抽象类的区别


    1.接口没有构造函数,因为接口是不能被实例化的;抽象类也不能被实例化,但抽象类有public构造函数,因为Java语言规范在编译期限定其不可实现,所以功能上相当于protected(子类可使用);

    2.接口里面的成员变量默认都是public static final的,在编译期就被显示的初始化

      (参考:为了使用类的准备工作

      ***static final int = 47 是编译期常量,不需要对类进行初始化就可以读取

      ***static final int = Random.nextInt(100)  是运行时常量,这种一般要在对象创建后才会运行,超过初始化的阶段了!

      ***static int = 47 是非常数的静态域,不是常量,更不是编译期常量,链接阶段只分配存储空间,初始化阶段才初始化

      );

      抽象类中的成员变量是普通变量;

    3.接口里面的方法默认都是public abstract类型的抽象方法,抽象方法只能申明,不能直接实现:比如abstract void abc()不能写成abstract void abc(){};

      而抽象类除了有抽象方法外还可以有已实现的方法;甚至抽象类还可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象;

      而如果任意一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过(Java语言规范)。

    4.二者相同的是:

      抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类

      接口同理。

    5.接口不能实现另一个接口,但可以多继承多个接口(extends A,B,C),类只能单继承

     

    抽象类的构造函数


    1.如果在父类中(这里就是你的抽象类)中显示的写了又参数的构造函数,在子类继承是就必须写一个构造函数来调用
    父类的构造函数
    例子:

     1 abstract class Person { //定义一个抽象类,必须被继承
     2     Person(int i) {
     3     }
     4 }
     5 
     6 public class Student extends Person {
     7     Student() {
     8     super(int i)://必须显示的调用父类构造方法//super代表父类对象
     9     }
    10 }

    2.如果父类中有没有参数的构造函数,在子类中可以不显示的写父类的构造函数,Java会自动调用没有参数的构造函数
    例子:

     1 abstract class Person { //定义一个抽象类,必须被继承
     2     Person() { //此构造函数也可以不写,Java会默认添加一个没有参数的构造函数
     3     }
     4 }
     5 
     6 public class Student extends Person {
     7     //构造函数
     8     Student() {
     9     //super();//可以不写,Java会自己调用这个super()方法
    10     }
    11 }

     

  • 相关阅读:
    关于CoreData的使用
    【转】向iOS开发者介绍C++(-)
    Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
    【转】Object-C 多线程中锁的使用-NSLock
    写了半天的返回
    oracle 锁表问题
    LINQ的基本认识
    Oracle客户端配置
    REVERSE
    vchar2和nvchar2
  • 原文地址:https://www.cnblogs.com/ixenos/p/5792282.html
Copyright © 2011-2022 走看看