精华内容
下载资源
问答
  • 接口和抽象类

    2018-12-08 13:39:33
    接口和抽象类接口和抽象类的定义接口和抽象类的区别选择使用抽象类和接口的依据 最近重新温故Java基础知识,理解设计模式,但是代码量不够可能很多理解的不够到位,先记一下,以后再来更新。接口和抽象类使用起来很...


    最近重新温故Java基础知识,理解设计模式,但是代码量不够可能很多理解的不够到位,先记一下,以后再来更新。接口和抽象类使用起来很简单,但是如果要明确何时何地何种条件下使用接口和抽象类,可能还得需要更多的思考和代码阅读量。

    接口和抽象类的定义

    • 接口
      interface关键字产生了一个完全抽象的类,一个接口表示“所有实现了该接口的类看起来都像这样”,接口被用来创建类与类之间的协议。
      接口的特点:
      1:接口中可以存在成员变量,但是只能是 public static final 类型的,且必须给初值。
      2:接口中的方法默认是public修饰的。Java8之后允许接口中有default方法和静态方法。(默认方法主要是提供了一种在不破坏现有代码基础上扩展接口的方式。实现接口的类也会自动拥有默认方法但是不拥有静态方法。)
    • 抽象类
      定义:包含抽象方法的类。抽象方法是一种只有声明没有具体实现的方法。
      抽象类的特点
      1:抽象方法必须是public或者protected修饰的,缺省时为public。(抽象方法是用来继承的,private就没意义了)
      2:继承抽象类的子类必须实现所有的抽象方法,否则就只能定义为抽象类。

    接口和抽象类的区别

    抽象类更像是普通类和接口间的中庸之道,在构建具有某些未实现方法的类时,可能你的第一想法是创建接口,但不可能总是使用纯接口,所以抽象类仍然是用于此目的一种重要工具。
    接口能更完全的解耦。如果一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。接口可以在很大程度上放宽这种限制。

    • 语法层面
      1:抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法。
      2:抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
      3:一个类只能继承一个抽象类,而一个类却可以实现多个接口。
      4:接口没有构造方法,抽象类可以有。【1)因为类是单继承的,而接口可实现多个,如果每个接口都有构造方法的话在调用父类构造方法时就没办法指定了。2)接口主要关注的是接口里面的方法,方法只需要声明而不需要初始化。】
    • 设计层面
      1:抽象类是对整个对象的抽象,而接口是对行为(对象的一部分)的抽象。抽象类更多是为了代码重用,通过继承来扩展。接口更纯粹,只是一种行为约束,你实现了我的接口就要实现我接口中的方法。
      2:抽象类作为父类,通过继承实现一种模板设计。而接口是一种行为规范,是实现了该接口的都能有这种功能。

    选择使用抽象类和接口的依据

    任何抽象性都应由正真的需求产生。恰当的原则应该是优先选择类而不是接口。从类开始,如果接口的必要性变得非常明确,就进行重构拆分出接口。 对于创建类,任何时候都可以替换为创建一个接口和一个工厂。-------《Java 编程思想》

    展开全文
  • 接口和抽象类区别

    2018-12-24 14:00:13
    抽象类和接口区别 语法层面区别 参数 抽象类 接口 默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现, 是极度抽象的类型 实现 子类使用extends关键字来继承抽象类。如果...

    抽象类和接口区别

    语法层面区别

    参数抽象类接口
    默认的方法实现它可以有默认的方法实现接口完全是抽象的。它根本不存在方法的实现, 是极度抽象的类型
    实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
    构造器抽象类可以有构造器接口不能有构造器
    访问修饰符抽象方法可以有public、protected和default这些修饰符接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)
    多继承抽象方法可以继承一个类和实现多个接口接口只可以继承一个或多个其它接口

    设计层面区别

    1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

    2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

    下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

    abstract class Door {
        public abstract void open();
        public abstract void close();
    }
    

    或者:

    interface Door {
        public abstract void open();
        public abstract void close();
    }
    

    但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

    1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

    2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

    从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

    interface Alram {
        void alarm();
    }
     
    abstract class Door {
        void open();
        void close();
    }
     
    class AlarmDoor extends Door implements Alarm {
        void oepn() {
          //....
        }
        void close() {
          //....
        }
        void alarm() {
          //....
        }
    }
    

    抽象类和普通类的区别

    抽象类和普通类的主要有三点区别:

    1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

    2)抽象类不能用来创建对象;

    3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

    在其他方面,抽象类和普通的类并没有区别。

    参考链接:

    https://www.cnblogs.com/dolphin0520/p/3811437.html
    http://www.importnew.com/12399.html

    展开全文
  • 在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。我们一起来学习一下Java中的接口和抽象...
  • 接口类的特性: 接口中的方法会被隐式的指定为 public abstract(使用其他修饰符会报错) 接口中所有变量会被隐式的指定为 public static final 变量...抽象类特点抽象类不能被实例化,所以抽象类必须被...

    接口类的特性:

    1. 接口中的方法会被隐式的指定为 public abstract(使用其他修饰符会报错)

    2. 接口中所有变量会被隐式的指定为 public static final 变量(使用其他修饰符会报错)

    3. JDK 8 后,接口中可以加入 static 和 default 修饰的非抽象方法,它们分别使用类名其实现的子类 调用

    抽象类的特点:

    1. 抽象类不能被实例化,所以抽象类必须被继承,才能被使用

    2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类

    3. 继承抽象类的子类一定会用到父抽象类的构造器。抽象类默认有空参构造器,其继承的子类会默认使用空参构造器。如果抽象类中只有含参数的构造器,那么其继承的子类的构造器中,必须要使用 super(…) 指明抽象类的构造器


    接口与抽象类的配合使用:

    1. 接口中的抽象方法,对于实现它的子类,都要求重写它的抽象方法。

      当在一个接口中,加入一个抽象方法时,他的子类都必须去实现新的抽象方法。

    2. 抽象类中既可以有抽象方法,也可以有非抽象方法。对于继承它的子类,具有它的非抽象方法,但必须重写它的抽象方法。

      当在一个抽象类中,加入一个非抽象方法时,那么它的所有子类都同时具有了这个新方法。

    3. 接口和抽象类的配合使用,就可以实现缺 省适配置模式

      用抽象类实现接口,在接口中,定义出抽象方法,在抽象类,实现默认的抽象方法。
      对于其所有子类,继承抽象类,如果需要子类完成的方法,不在抽象类中实现,则所有子类都需要去实现抽象方法;如果不需要子类去实现的方法,可以在接口中定义、在抽象类中实现,则子类就具有了这个新方法。

    interface interfac {
        //接口中只能定义方法
        void methodIn();
    }
    
    abstract class abstrac implements interfac {
        //在抽象类中,可不用实现接口中的方法
        @Override
        public void methodIn() {
    
        }
    
        //可以对方法进行实现
        public String methodAb() {
            return "methodAb";
        }
    
        //可以使用抽象方法
        abstract public String methodAb1();
    }
    
    class myClass extends abstrac implements interfac {
    
        //本类 或者 其父类必须实现接口中的方法
    //    @Override
    //    public void methodIn() {
    //
    //    }
    
        //必须实现继承的抽象类中的抽象方法
        @Override
        public String methodAb1() {
            return null;
        }
        //可以使用抽象类中定义好的方法
        public String myMethod() {
            return this.methodAb();
        }
    }
    

    接口与抽象类的使用可参考

    展开全文
  • 接口和抽象类的区别

    2019-12-21 10:58:11
    接口定义:接口抽象类的变体(接口就是一些方法特征的集合------接口是对抽象的抽象) 2 接口使用 3 接口里的抽象方法 4 接口里的默认方法 上述解决接口升级是什么意思 5 接口里的私有方法 ...

    定义

    接口

    1 接口定义

    接口定义:接口是抽象类的变体(接口就是一些方法特征的集合------接口是对抽象的抽象)

     

    2 接口使用

     

    3 接口里的抽象方法

    4 接口里的默认方法

    上述解决接口升级是什么意思

    5 接口里的私有方法

     

     

     

    6 接口中的静态方法

     

    7 接口中的常量

    8 接口中不能有静态代码块

    静态代码块介绍

    一 般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情 况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用
    比如main方法就必须是静态的 这是程序入口
    两者的区别就是:静态代码块是自动执行的;
    静态方法是被调用的时候才执行的.

     

    区别很简单:
    静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
    非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次

     

    相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
        一般在代码块中对一些static变量进行赋值。
    不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
        静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new
        一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

    9 接口中的代码运用

    抽象类(抽象方法)

    抽象类的意义在于思想上,而非内容上,这是面向对象的精华。如果我们觉得一大类“东西”,可以提取出一个“共同概念”,那么这个“共同概念”就可以是一个基类。如果这个“共同概念”本身没有现实存在,那么这个基类就可以是一个“抽象类”,至于抽象类有没有方法,取决于这个“共同概念”要不要做什么事情。如果它只是表达一些属性,其他的什么也不做,那仍然不影响它在概念上是一个合情合理的抽象类

    抽象类定义

    抽象类定义:声明方法的存在而不去实现它的类叫做抽象类(抽象类对某具体类型的部分实现------抽象类是对具体的抽象。)

    抽象方法定义

     

    不同点:  

    1).抽象类可以有实现(包括构造函数),而接口不可以有任何实现,重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。

     

            接口中所有方法都必须是未实现的,都是抽象的。

     

    2).抽象类中还以有成员变量(包含静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的;

     

            而接口中不能有成员变量、常量、静态方法,只能有公共的属性。

     

    3).抽象类可以从另一个类或者一个/ 多个接口派生;

     

    而接口不能从另一个类派生却可以实现另一个或多个接口。

     

        4).一个.net 类只能从一个基类中派生即使这个基类是抽象类;然而一个.net 类可以实现多个接口。

          (但是如果从一个抽象类派生或者从一个/ 多个接口实现,则必须实现抽象类中抽象方法或接口中所有的方法)

    相同点:

             1)、都不能被实例化;

             2)、包含未实现的方法声明;

             3)、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

    抽象类和接口的使用:

          1)如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。

          2)如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。

          3)如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。   

          4)抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

     

    展开全文
  • Java:接口和抽象类,傻傻分不清楚?

    千次阅读 多人点赞 2019-04-26 07:28:15
    再来聊聊接口和抽象类
  • 方法的重写重载,接口抽象类区别,新手入门必看!!!!!要记住方法的重写重载重写重载接口抽象类接口抽象类说明 方法的重写重载 重写 重载 接口抽象类 接口 抽象类 说明
  • 你想定义一个接口抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法 解决方案 使用 abc 模块可以很轻松的定义抽象基类: from abc import ABCMeta, abstractmethod class IStream(metaclass=ABCMeta)...
  • java接口和抽象类

    2015-08-18 11:15:07
    在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口...
  • Java-接口和抽象类

    热门讨论 2019-05-16 20:31:11
      小咸儿在重新学习Java基础的时候,看到有关接口和抽象类的知识,特此总结下来。 文章目录概览宝图抽象类是什么特点抽象方法关系空方法abstract接口 概览 宝图 抽象类 是什么   什么是抽象类,就小咸儿的话来...
  • Java的接口和抽象类

    2016-04-05 21:20:03
    深入理解Java的接口和抽象类  对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的...
  • java 接口和抽象类

    2019-03-25 13:54:33
    Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 抽象类: 使用了关键词...
  • 聊聊~接口和抽象类

    千次阅读 2019-08-25 10:15:42
    先介绍一下抽象类和接口的概念 一、抽象类:  抽象类是特殊的类,只是不能实例化,除此之外,具有类的其他特性。并且抽象类可以包含抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,...
  • Java接口和抽象类的区别

    千次阅读 2020-12-06 15:13:33
    接口中可以有变量方法,但是变量会被隐式的指定为public static final变量,而方法会被指定为public abstract【所有方法在接口中不能有实现,也说明接口中都是抽象方法】,(Java 8 开始接⼝⽅法可以有默认实现)...
  • 九.接口和抽象类

    2020-08-12 12:23:20
    抽象类特点: (1)抽象方法所在的类必须是抽象类 抽象方法:在返回值前面加上abstract就是一个抽象方法 抽象方法特点:只有方法的定义,没有方法体 (2)抽象类不能实例化 (3)如果要实现一个抽象类,创建一个子类去...
  • c++ 接口和抽象类

    2018-07-23 16:10:56
    其实对抽象类接口的区别一直是搞不太清楚,最近正在学习《设计模式》,期间用到了很多c++多态的知识。这是才恍然发现,是应该整理下这方面的知识了。但在翻阅书本、上网查阅资料之际,发现有篇文章总结的不错。...
  • 本文总结最常见的面试题之一:接口和抽象类的区别。 二、区别 如下表所示: 接口和抽象类对比 区别 Interface接口 Abstract class(含有抽象方法的类成为抽象类) 声明方式 ...
  • Java中接口和抽象类的区别

    千次阅读 2019-04-29 19:51:53
    java中接口和抽象类的区别 ...
  • java接口和抽象类的区别作用 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过(implements)接口的方式,从而来实现接口的抽象方法。接口并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 234,085
精华内容 93,634
关键字:

接口和抽象类的特点