Giter Club home page Giter Club logo

Comments (14)

siyehua avatar siyehua commented on August 28, 2024 1

别以为这就吓到我了,我说下我的理解,说出来才会进去.
首先继承只能是一个,而接口的实现可以是多个.
继承的原意是希望得到父类的特性.而实现接口是对自身一个插入式的扩展

...木有了,等答案

看了一下关于空接口的使用.空接口是一个限定,.像kk微信公众平台这几天的文章中有提到的注解.
关于空接口,比较典型的是Serializable.
刚才看到一个题目,说Toast的显示时间是否只有两种,我选择了可以自己定义,因为有时候我确实自己定义了.答案是只有两种,看了一下Toast的源码

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
        Toast result = new Toast(context);

        LayoutInflater inflate = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
        TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
        tv.setText(text);

        result.mNextView = v;
        result.mDuration = duration;

        return result;
    }

Toast就是被Druation这个接口限定了.Draution的实现

/** @hide */
    @IntDef({LENGTH_SHORT, LENGTH_LONG})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Duration {}

只有两种时间可以使用.

总上面的例子,可以得到接口的一个使用场景:做限定.

from android-discuss.

Rowandjj avatar Rowandjj commented on August 28, 2024 1

之前有总结过,直接copy过来:)

抽象类:
抽象类体现了数据抽象的**,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式由派生类来实现。同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。
在语法方面:
1.由abstract关键词修饰的类称之为抽象类。
2.抽象类中没有实现的方法称之为抽象方法,也需要加关键字abstract。
3.抽象类中也可以没有抽象方法,比如HttpServlet方法。
4.抽象类中可以有已经实现的方法,可以定义成员变量。

接口:
接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字。 接口是抽象类的延伸,java为了保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷,
语法方面:
1.由interface关键词修饰的称之为接口;
2.接口中可以定义成员变量,但是这些成员变量默认都是public static final的常量。
3.接口中没有已经实现的方法,全部是抽象方法。
4.一个类实现某一接口,必须实现接口中定义的所有方法。
5.一个类可以实现多个接口。

区别:
一.语法层次上:如上所述。
二.设计层次上:
1、 抽象层次不同。抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2、 跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!所以说抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a" 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已,相当于是"like-a"的关系。
3、 设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

附加,空接口的作用:
通常是作为一个标记,你比如这个Serializable、Cloneable。

from android-discuss.

jorry avatar jorry commented on August 28, 2024

别以为这就吓到我了,我说下我的理解,说出来才会进去.
java 单继承,可以创建构造函数
接口:没有实体方法,变量为final类型

from android-discuss.

Trinea avatar Trinea commented on August 28, 2024

问题延伸:

  1. 各自使用场景,更推荐用什么,为什么
  2. 空接口的作用
  3. 抽象类和接口的区别

from android-discuss.

lchad avatar lchad commented on August 28, 2024

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

* 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
* 类可以实现很多个接口,但是只能继承一个抽象类
* 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
* 抽象类可以在不提供接口方法实现的情况下实现接口。
* Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
* Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
* 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

from android-discuss.

erhu avatar erhu commented on August 28, 2024

接口提供一种协议, 用于模块解耦.

from android-discuss.

liumingJ avatar liumingJ commented on August 28, 2024

Java中继承与接口的使用场景区别、原因

一个类在描述其基本概念时可以用继承,用来实现方法的重用,更多是体现了"is-a"的关系.比如写一个AlramDoor类,可以继承Door类来重用它的"open()"和"close()"方法,因为本质上AlarmDoor就是Door,Door应该有的所有方法AlarmDoor都应该有;
一个类在原有体系上实现扩展功能或想在此类中做些不同的事情时用接口,更多是体现了"like-a"的关系.比如在AlramDoor类上添加一个"alarm()"方法,因为本质上"alarm()"方法并不是Door应该具备的基本方法,所以如果想增添新的方法可以用接口来实现;

空接口的作用

空接口的主要作用是用来做判断的.
为了判断某一个类是否满足其筛选条件时可以做一个空接口,然后利用instanceof方法来判断某一类是否使用了该接口,以达到你要筛选指定类型类的需求. 

抽象类和接口的区别

1.抽象类在Java里表示的是一种单一继承关系,而接口是可以实现类似于多继承的关系但又不会破坏继承体系;
2.抽象类中不但有静态常量的数据成员、抽象方法,还可以有自己的数据(非static final)、方法(非abstract)而接口所有的数据成员都是静态常量(static final),方法都是abstract的;
3.抽象类主要用来描述整体的基本框架,接口主要用来规范行为;
4.抽象类的子类可以由下向上反推,但是接口不行;

不知道描述的对不对,如有不对之处请指正.

from android-discuss.

wangsg avatar wangsg commented on August 28, 2024

提倡面向接口编程

from android-discuss.

LuckyJayce avatar LuckyJayce commented on August 28, 2024

接口:
<1>标识接口 例如Serializable,标识实现它的类是一个序列化的类
<2>表示一种能力或者功能Compare,实现它说明他有比较的功能

抽象类:
是类的一种特殊形式"抽象",由此具有类的含义代表一类事物,但是由于抽象所以需要子类继承实现部分功能

from android-discuss.

Lujango avatar Lujango commented on August 28, 2024

学习了 mark

from android-discuss.

dasunsy avatar dasunsy commented on August 28, 2024

关于空接口可以看这篇blog http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html

其英文名称比较直观反映出它的作用, marker interface或者tag interface

from android-discuss.

bigsquirrel avatar bigsquirrel commented on August 28, 2024

@siyehua 我看 api 19 的 Toast 源码是支持自定义的,提供了 setDuration 了啊,是不是没有限定了

from android-discuss.

DysaniazzZ avatar DysaniazzZ commented on August 28, 2024

设计理念的区别:

  • 继承体现的是 is a 的关系,父类中一般定义的是整个继承机构的共性功能;
  • 实现体现的是 like a 的关系,接口中一般定义的是整个继承结构的扩展功能;

类与接口的区别:

  • 类与类:继承关系,而且只能是单继承;
  • 类与接口:实现关系,可以多实现;
  • 接口与接口:继承关系,可以多继承;

成员区别:

  • 在继承关系的父类中,成员变量可以是变量,可以是常量,甚至可以私有不被子类继承,有构造方法,子类继承父类,默认先走父类的构造,成员方法可以是抽象的也可以不是抽象的;
  • 在实现关系的接口中,成员变量只能是常量,默认用 public staic final 修饰,没有构造方法,子类数据的初始化默认走Object类的构造,成员方法只能是抽象的,默认用 public abstract 修饰;

from android-discuss.

wangfree86 avatar wangfree86 commented on August 28, 2024

Good, alright

from android-discuss.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.