`
robinsoncrusoe
  • 浏览: 747062 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA接口学习笔记

    博客分类:
  • JAVA
阅读更多

一, 接口基础知识
1, java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承.
2, 与接口相关的设计模式:
1, 定制服务模式
   设计精粒度的接口,每个接口代表相关的一组服务,通过继承来创建复合接口
2, 适配器模式
   当每个系统之间接口不匹配时,用适配器来转换接口
3, 默认适配器模式
   为接口提供简单的默认实现
4, 代理模式
   为接口的实现类创建代理类,使用者通过代理来获得实现类的服务
5, 标识类型模式
   用接口来标识一种没有任何行为的抽象类型
6, 常量接口模式
   在接口中定义静态常量,在其它类中通过import static语句引入这些常量
3, 接口的特征归纳:
1, 接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
2, 接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
   public interface A
   {
    int CONST = 1; //合法,CONST默认为public,static,final类型
    void method(); //合法,method()默认为public,abstract类型
    public abstract void method2(); //method2()显示声明为public,abstract类型
   }
3, 接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
   public interface A
   {
    int var; //错,var是常量,必须显示初始化
    void method(){...};   //错,接口中只能包含抽象方法
    protected void method2(); //错,接口中的方法必须是public类型
    static void method3(){...};   //错,接口中不能包含静态方法
   }
4, 接口中没有构造方法,不能被实例化
   public interface A
   {
    public A(){...}; //错,接口中不能包含构造方法
    void method();
   }
5, 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
   public interface A
   {
    void methodA();
   }
   public interface B
   {
    void methodB();
   }
   public interface C extends A, B   //C称为复合接口
   {
    void methodC();
   }
   public interface C implements A{...}   //错
6, 接口必须通过类来实现它的抽象方法
   public class A implements B{...}
7, 当类实现了某个接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的
8, 不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
   public class B implements A{}
   A a = new B(); //引用变量a被定义为A接口类型,引用了B实例
   A a = new A(); //错误,接口不允许实例化
9, 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.
   public class A extends B implements C, D{...} //B为class,C,D为interface
4, 通过接口,可以方便地对已经存在的系统进行自下而上的抽象,对于任意两个类,不管它们是否属于同一个父类,只有它
们存在相同的功能,就能从中抽象出一个接口类型.对于已经存在的继承树,可以方便的从类中抽象出新的接口,但从类
中抽象出新的抽象类却不那么容易,因此接口更有利于软件系统的维护与重构.对于两个系统,通过接口交互比通过抽象
类交互能获得更好的松耦合.
5, 接口是构建松耦合软件系统的重要法宝,由于接口用于描述系统对外提供的所有服务,因此接口中的成员变量和方法都
必须是public类型的,确保外部使用者能访问它们,接口仅仅描述系统能做什么,但不指明如何去做,所有接口中的方法
都是抽象方法,接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量.
二, 比较抽象类与接口
1, 抽象类与接口都位于继承树的上层
相同点
1, 代表系统的抽象层,当一个系统使用一颗继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,
   这样可以提高两个系统之间的送耦合
2, 都不能被实例化
3, 都包含抽象方法,这些抽象方法用于描述系统能提供哪些服务,但不提供具体的实现
不同点:
1, 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势
   限制了多继承,而接口中只能包含抽象方法.
   由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中添加具体方法,不会对它的子类造
   成影响,而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实
   现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类
2, 一个类只能继承一个直接的父类,这个父类可能是抽象类,但一个类可以实现多个接口,这是接口的优势,但这
   一优势是以不允许为任何方法提供实现作为代价的
三, 为什么Java语言不允许多重继承呢?
当子类覆盖父类的实例方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定规则,假如还允许
一个类有多个直接的父类,那么会使绑定规则更加复杂,因此,为了简化系统结构设计和动态绑定机制,Java语言
禁止多重继承.
而接口中只有抽象方法,没有实例变量和静态方法,只有接口的实现类才会实现接口的抽象方法(接口中的抽象方
法是通过类来实现的),因此,一个类即使有多个接口,也不会增加Java虚拟机进行动态绑定的复杂度.因为Java虚
拟机永远不会把方法与接口绑定,而只会把方法与它的实现类绑定.
四, 使用接口和抽象类的总体原则:
1, 用接口作为系统与外界交互的窗口
   站在外界使用者(另一个系统)的角度,接口向使用者承诺系统能提供哪些服务,站在系统本身的角度,接口制定
   系统必须实现哪些服务,接口是系统中最高层次的抽象类型.通过接口交互可以提高两个系统之间的送耦合
   系统A通过系统B进行交互,是指系统A访问系统B时,
   把引用变量声明为系统B中的接口类型,该引用变量引用系统B中接口的实现类的实例.
   public interface B
   {
   }
   public class C implements B
   {
   }
   public class A
   {
   }
   B a = new C();
2, 接口本身必须非常稳定,接口一旦制定,就不允许随遇更加,否则对外面使用者及系统本身造成影响
3, 用抽象类来定制系统中的扩展点
   抽象类来完成部分实现,还要一些功能通过它的子类来实现
                   2008/1/9

一, Java多态机制中的绑定规则深入剖析
class Base
{
   String var = "BaseVar";   //实例变量
   static String staticVar = "StaticBaseVar";   //静态变量
   void method()   //实例方法
   {
    System.out.println("Base method");
   }
   static void staticMethod()   //静态方法
   {
    System.out.println("Static Base method");
   }
}
public class Sub extends Base
{
   String var = "SubVar";   //实例变量
   static String staticVar = "StaticSubVar";   //静态变量

   void method()   //隐藏父类的method()方法
   {
    System.out.println("Sub method");
   }
   static void staticMethod()   //隐藏父类的staticMethod()方法
   {
    System.out.println("Static Sub method");
   }
   String subVar = "Var only belonging to Sub";
   void subMethod()
   {
    System.out.println("method only belonging to Sub");
   }
   public static void main(String args[])
   {
    //引用变量who被声明为Base类型,引用Sub类的实例
    Base who = new Sub();  

    //成员变量(静态变量,实例变量)与引用变量所声明的类型(Base类型)的成员变量绑定
    System.out.println("who.var = "+who.var);   //所以,打印Base类的var变量
    System.out.println("who.staticVar = "+who.staticVar); //所以,打印Base类的staticVar变量
    //实例方法与引用变量实际引用的对象(Sub对象)的方法绑定
    who.method();   //所以,打印Sub实例的method()方法
    //静态方法与引用变量所声明的类型(Base类型)的方法绑定
    who.staticMethod();   //所以,打印Base类的staticMethod()方法
   }
}

【分析过程】
1, 对于一个引用类型的变量,Java编译器按照它声明的类型来处理.
   例如在以下代码中,编译器认为who是Base类型的引用变量,不存在subVar成员变量喝subMethod()方法,编译报错
   Base who = new Sub(); //引用变量who被声明为Base类型,引用Sub类的实例
   who.subVar = "123";   //编译错,在Base类中没有subVar属性
   who.subMethod();   //编译错,在Base类中没有submethod()方法
   如果要访问Sub类的成员,必须通过强制类型转换:
   Base who = new Sub();
   //把Base引用类型的who成员变量强制转换为Sub引用类型
   //把引用变量转换为子类的类型称为向下转型,把引用变量转换为父类的类型称为向上转型
   ((Sub)who).subVar = "123";
   ((Sub)who).subMethod();
   Java编译器允许在具有直接或间接继承关系的类之间进行类型转换,对于向上转型,Java编译器会自动进行,对于
   向下转型,需要进行强制类型转换
   如果两种类型之间没有继续关系,即不在继承树的同一个继承分支上,那么Java编译器不允许进行类型转换
2, 对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象来处理
   例如以下代码虽编译可通过,但运行时会抛出ClassCastException运行时异常
   Base who = new Base();   //who引用Base类的实例
   Sub s = (Sub)who;   //运行时会抛出ClassCastException
   在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子类类型
3, 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
   1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机
    动态决定的
   2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经
    绑定
   3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为
    实际上是在编译阶段就已经绑定
为了您的安全,请只打开来源可靠的网址

打开网站    取消
来自: http://hi.baidu.com/%D0%A1%C0%BC%B5%C4%D6%F7%C8%CB/blog/item/44d13ecba379494cf21fe785.html


分享到:
评论

相关推荐

    java接口学习笔记

    ### Java接口学习笔记 #### 一、Java接口基础知识与特性 **1. 多继承的替代方案** Java语言为了保持简单性和一致性,不支持多继承,即一个类不能同时继承多个父类。然而,Java提供了接口的概念作为多继承的一个...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    Java入门学习笔记

    这份"Java入门学习笔记"涵盖了imooc网站上Java入门课程的三个赛季的内容,旨在为初学者提供一个全面的学习资源。 笔记的第一部分是"Java入门第一季学习笔记",它可能包括Java的基础概念和语法。这部分可能会讲解...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    java李兴华学习笔记之Java常用类库

    ### Java李兴华学习笔记之Java常用类库 #### 一、课程介绍及知识点概览 根据提供的资料,“Java李兴华学习笔记之Java常用类库”这份文档来源于北京MLDN软件实训中心的教学资料,主要涵盖了Java编程语言中常用类库...

    Java开发学习笔记

    Java开发学习笔记主要针对的是初学者,旨在帮助他们掌握Java编程的基础知识。下面将详细讲解Java开发中的核心概念和步骤。 一、Java环境变量设置 在开始Java编程之前,我们需要安装Java Development Kit (JDK)并...

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    Java学习笔记(必看经典).pdf

    本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    java基础学习笔记

    ### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...

    Java学习笔记(源码)

    【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...

    Java JDK 7学习笔记 PDF

    这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...

    Java学习笔记及心得

    ### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...

    java学习笔记.pdf

    "Java学习笔记" 本资源是一个关于Java编程语言的学习笔记,涵盖了Java的基础知识、语法、数据类型、变量、类型转换等方面的内容。 标题:"java学习笔记.pdf" 描述:"想自学的小伙伴可以看俺" 标签:"Java" 部分...

    Java学习笔记PPT

    这份"Java学习笔记PPT"是针对Java2版本的学习资源,旨在帮助初学者或有一定基础的开发者深入理解Java的核心概念和应用。 在Java学习的初期,掌握基本语法是至关重要的。Java的语法与C++有诸多相似之处,但更加强调...

    java校招学习笔记

    "java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。

Global site tag (gtag.js) - Google Analytics