zoukankan      html  css  js  c++  java
  • JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别

      abstract修饰符可以修饰类和方法。

    (1)abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型(见后面实例),也就是编译时类型。抽象类就相当于一类的半成品,需要子类继承并覆盖其中的抽象方法。

    (2)abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明而没有实现,需要子类继承实现(覆盖)。

    (3)注意的地方:

           A:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。abstract修饰符在修饰类时必须放在类名前。abstract修饰方法就是要求其子类覆盖(实现)这个方法,调用时就可以以多态方式调用子类覆盖(实现)后的方法,除非子类本身也是抽象类。

           B:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。简单的例子下面有一个抽象类

     1 abstract class E{
     2     public abstract void show();
     3 }
     4 
     5 class F extends E{
     6     public void show(){
     7         System.out.print("test all");
     8     }
     9 }
    10 public class TestNew 
    11 {
    12 
    13     public static void main(String[] args)throws InterruptedException {
    14         // TODO Auto-generated method stub
    15         E e = new F();
    16         e.show();
    17     }
    18 }

    在主方法里面定义一个父类引用指向子类对象,就会发生多态现象。执行结果就是在console输出test all。
    =============================================================================================================================

           extends是继承父类,只要那个类不是声明为final就能继承。JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements。继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了,比如 class A extends B implements C,D,E。
           与extends的差别:extends 是继承某个类,继承之后可以使用父类的方法也可以重写父类的方法;implements 是实现多个接口,接口的方法必须重写才能使用。要注意以下几点:

    A,接口中一般定义的是常量和抽象方法。抽象类中可以包含抽象方法,也可以有非抽象方法,但是有抽象方法的类一定是抽象类。抽象方法不能有方法体。

    B,接口(interface)中,方法只能定义抽象方法而且默认是Public,常量则是public static final 修饰的(不管有没有这些修饰符,方法和常量默认具这种属性)。

    C,一个类可以实现多个无关的接口(这点和继承要有所区别)。

    D,接口可以继承其他的接口,并添加新的属性和抽象方法。

    E,在类中实现接口的方法时必须加上public修饰符。

           示例:

     1 interface Runner{    //定义接口
     2     int i = 3;
     3     void start();
     4     void run();
     5     void stop();
     6 }
     7 
     8 interface Eater extends Runner{        //接口间可以继承,并添加新的属性方法
     9     public final static int j = 4;    //常量的修饰
    10     void openMonth();
    11     void upAndDown();
    12     void goIn();
    13 }
    14 
    15 class TT implements Eater{        
    16     public void start(){            //实现接口的同时会继承接口的变量,实现接口的方法加上public
    17         System.out.println("----start()----");
    18     }
    19     public void run(){
    20         System.out.println("----run()----");
    21     }
    22     public void stop(){
    23         System.out.println("----stop()----");
    24     }
    25     public void openMonth(){
    26         System.out.println("----openMonth()----");
    27     }
    28     public void upAndDown(){
    29         System.out.println("----upAndDown()----");
    30     }
    31     public void goIn(){
    32         System.out.println("----goIn()----");
    33     }
    34 }
    35 
    36 public class TestNew {
    37     public static void main(String[] args) {
    38         // TODO Auto-generated method stub
    39         Runner tt = new TT();                      //实现对象指向接口引用的父类
    40         System.out.println(TT.i);                //类名.静态变量
    41         System.out.println(Runner.i);        //接口名.静态变量
    42         tt.start();
    43         
    44         Eater ee = new TT();                        //实现对象指向接口引用
    45         System.out.println(ee.j);                //接口引用.静态变量
    46         System.out.println(Eater.j);        //接口名.静态变量
    47         ee.start();
    48     }
    49 }

     执行结果:
    3
    3
    ----start()----
    4
    4
    ----start()---- 

    得到这个结果,需要注意的几点:(1)静态变量(相当于常量)可以用类名.静态变量名直接使用,接口又是类的一种,所以接口名.静态变量名可用;(2)接口引用.静态变量是多态的体现。

    ==========================================================================================================================

            这里需要谈到抽象类和Interface的差别,abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力,两者的区别如下:

    (1)相同点
    A,两者都是抽象类,都不能实例化。
    B,interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

    (2)不同点
    A,interface实现,要用implements,而abstract class的实现,要用extends。
    B,一个类可以实现多个interface,但一个类只能继承一个abstract class。
    C,interface强调特定功能的实现,而abstract class强调所属关系。
    D,尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),必须要实现。而abstract class的子类可以有选择地实现。
           抽象类的这个选择有两点含义:一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。

    E,interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。

     转自:http://blog.csdn.net/zhandoushi1982/article/details/8458081

  • 相关阅读:
    js中call,apply,bind方法的用法
    使用react脚手架初始化一个项目
    常用的CSS居中方式
    react组件之间的通信
    React脚手架less的安装
    js操作DOM的方法
    常用的ement语法
    本机系统通过SSH访问虚拟机中的Linux系统
    Java_amr格式转mp3
    linux/ubantu 安装 mysql 并且使其支持远程连接
  • 原文地址:https://www.cnblogs.com/zl1991/p/5132558.html
Copyright © 2011-2022 走看看