接口与抽象类

接口interface

在Java中接口的实现形式:

1 [public] interface InterfaceName {
2  
3 }

接口中可以定义变量、方法。对于变量,必须是public static final的变量,即使在定义过程中并没有显示指定,也会被默认指定为public static final类型。而方法则只能定义为public abstract,当然同样即使没有定义为相关类型,默认均会添加。但是不能将其定义为private、protected等类型,编译时就会报错。

可以通过观察生成的二进制文件来进一步确认一下相关配置。

代码实例如下:

interface InterfaceName
{
   String str = "test"; 
   
   void method1();
}

然后,我们通过Javap工具查看生成的二进制内容(Javap -verbose InterfaceName)详细确认一下,最后生成的内容。

警告: 二进制文件InterfaceName包含test.InterfaceName
Classfile /D:/z00364813/dev/test/bin/test/InterfaceName.class
  Last modified 2018-2-1; size 205 bytes
  MD5 checksum e5b89eb5161832de38178e8af05b89b8
  Compiled from "InterfaceName.java"
interface test.InterfaceName
  minor version: 0
  major version: 52
  flags: ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
   #1 = Class              #2             // test/InterfaceName
   #2 = Utf8               test/InterfaceName
   #3 = Class              #4             // java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               str
   #6 = Utf8               Ljava/lang/String;
   #7 = Utf8               ConstantValue
   #8 = String             #9             // test
   #9 = Utf8               test
  #10 = Utf8               method1
  #11 = Utf8               ()V
  #12 = Utf8               SourceFile
  #13 = Utf8               InterfaceName.java
{
  public static final java.lang.String str;
    descriptor: Ljava/lang/String;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    ConstantValue: String test

  public abstract void method1();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_ABSTRACT
}
SourceFile: "InterfaceName.java"

接口是可以被多次实现的,这是由于抽象类的特性。如果一个非抽象类继承了某一个接口,则必须实现所有的方法。

抽象类

在Java中实现抽象方法形式:

public abstract class TestAbstract
{
    abstract void function();//非必须存在
}

通过其实现形式,可以看出,包含抽象方法的类一定是抽象类,但是反之,则不是必须的。

抽象类与普通类的对比:

1、抽象类方法必须定义为public 或者protected,因为抽象类不能实例化,如果定义private方法,则无法使用该方法。

2、抽象类不能实例化。

3、一个类如果继承抽象类,则子类必须继承父类的抽象方法,如果没有实现,则子类也必须为抽象类。

抽象类与接口的区别

1、抽象类可以实现方法细节,但接口只能定义public abstract方法。

2、抽象类中的属性则可以是各种类型的,但是接口中只能是public static final类型。

3、接口中不能有静态代码块以及静态方法,但是抽象类则可以存在。

4、一个类只能继承一个抽象类,但是可用实现多个接口。

 

参考链接:

https://www.cnblogs.com/KingIceMou/p/7235649.html

posted @ 2018-02-01 11:11  woniu4  阅读(142)  评论(0)    收藏  举报