1 接口  interface implement

  接口的所有方法自动地属于public。因此,在接口中声明方法时,不必提供关键字public。
 
  接口可以包含多个方法,接口中可以定义常量。接口中的域将被自动设为public static final。
  SwingConstants就是只定义了常量,而没有定义方法,任何实现了SwingConstant接口的类都自动地继承了这些常量,并可以在方法中直接地引用一些常量。

1.1 接口的特性

接口不是类,尤其不能使用new运算符实例化一个接口
但是可以声明接口变量,必须引用实现了接口的类对象
 
使用instanceof检查一个对象是否属于某个特定类一样,也可以使用instance检查一个对象是否实现了某个特定的接口。
 
每个类只能够拥有一个超类,但却可以实现多个接口

1.2 接口与抽象类

抽象类也是只定义方法,但是不实现
总点在于继承只能继承一个,实现接口可以实现多个

2 对象克隆

当拷贝一个变量时,原始变量与拷贝变量引用同一个对象。也就是说,改变一个变量所引用的对象将会对另一个变量产生影响
拷贝与克隆:

clone方法
clone方法时Object类的一个protected方法,也就是说,在用户编写的代码中不能直接调用它。
  • 1默认的clone方法是否满足要求
  • 2默认的clone方法是否能够通过调用可变子对象的clone得到修补
  • 3是否不应该使用clone
  3是默认的
  如需要选择1和2
  • a 实现Cloneable接口类
  • b 使用public访问修饰符重新定义clone方法
 

3 接口和回调

  回调callback是一种常见的程序设计模式。在这种模式下,可以指出某个特定发生应该采取的动作。
 

4 内部类

 inner class 是定义在另一个类中的类
需要内部类的原因:
  • a 内部类方法可以访问该类定义所在作用域的所有数据,包括私有数据
  • b 内部类可以对同一个包中的其他类隐藏起来
  • c 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
 

4.1 使用内部类访问对象状态

  访问外围类的实例类
  内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域
  内部类的对象总有一个隐式引用(outer),它指向创建它的外部类对象。

4.2 内部类的特殊语法规则

  访问外围类引用的正规语法复杂,表达式OuterClass.this 表示外围类引用。
  在外围类的作用域之外,可以这样引用内部类
    OuterClass.InnerClass

4.3 内部类是否有用、必要和安全

           编译器会把内部类翻译成用($)美元符号分隔外部类名域内部类名的常规类文件。
           如果内部类访问了私有数据域,就有可能通过附加在外围类所在包中的其他类访问它们,但做这些事情需要高超的技巧和极大的决心。

4.4 局部内部类

           局部类不能用public和private访问说明符进行声明。它的作用域被限定在声明这个局部类的块中。
           局部类有一个优势,即对外部世界可以完全隐藏起来。

4.5 由外部方法访问final变量

           与内部类相比,不仅能够访问包含它们的外部类,局部类还可以访问局部变量。那些局部变量必须是final
           在内部类被首次提出时,原型编译器对内部类中修改的局部变量自动地进行转换。

4.6 匿名内部类

           假如只创建这个类的一个对象,就不必命名了。这种累叫做匿名内部类。

4.7 静态内部类

使用内部类只是为了把一个类隐藏在另一个类的内部,可以将内部类声明为static,以便取消产生的引用
 

5 代理 proxy java1.3

  利用代理可以在运行时创建一个实现了一组给定接口的新类。
      假设有一个表示接口的Class对象,它的确切类型在编译时无法知道。
  要想构造一个实现这些接口的类,就需要使用newInstance方法或反射找出这个类的构造器。但是不能实例化接口,需要在程序处于运行状态时定义一个新类
      代理机制是一种解决方案,代理类可以在运行时创建全新的类。这样的代理类能够实现指定的接口。
      指定接口所需要的全部方法
      Object类中的全部方法,
      然而不能再运行时定义这些方法的新代码,而是要提供一个调用处理器(invocation handler)。调用处理器是实现了invocationHandler接口的对象。在这个接口中只有一个方法:
      Object invoke(Object proxy,Method method,Object[] args)
      无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。调用处理器必须给出处理调用的方法。
      要想创建一个代理对象,需要使用Proxy类的newProxyInstance方法。这方法有三个参数

    一个类加载器 作为java安全模型的一部分,对于系统类和从因特网上下载下来的类,可以使用不同的类加载器。

    一个Class对象数组,每个元素都是需要实现的接口

    一个调用处理器。

  • 这有两个需要解决的问题
           如何定义一个处理器?
           能够用结果代理对象做些什么?
 
           路由对远程服务器的方法调用
           在程序运行期间,将用户接口事件与动作关联起来。
           为调试,跟踪方法调用

5.1 代理类的特性

  代理类是在程序运行过程中创建的。
  所有的代理类都扩展于Proxy类,一个代理类只有一个实例域——调用处理器,它定义在Proxy的超类中。
  所有的代理类都覆盖了Object类中的方法toString、equals和hashCode。如同所有的代理方法一样,这些方法仅仅调用了调用处理器的invoke。Object类的其他方法都没有被重新定义。
  没有定义代理类的名字,sun虚拟机中的Proxy类将生成一个以字符串$Proxy开头的类名
  代理类一定是public 和 final 。如果代理类实现的所有接口都是public,代理类就不属于某个特定的包,否则,所有非公有的接口都必须属于同一个包,同时,代理类也属于这个包。
  可以通过Proxy类中的isProxyClass方法检测一个特定的Class对象是否代表一个代理类。
 
          
 

Java基础语法<九> 接口与内部类的更多相关文章

  1. Java 基础三、接口与内部类

    1.   在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...

  2. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  3. JAVA基础语法——标识符、修饰符、关键字(个人整理总结)

    JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...

  4. Java基础语法(11)-面向对象之关键字

    title: Java基础语法(11)-面向对象之关键字 blog: CSDN data: Java学习路线及视频 1.this this是什么 它在方法内部使用,即这个方法所属对象的引用: clas ...

  5. Java基础语法(上篇)

                     Java基础语法(上篇) 知识概要: (1)关键字的表示与规范       (2)标示符              (3)注释                (4 ...

  6. java基础语法(一)

    java基础语法(一) 1.类是一种抽象的概念,对象是类的一种具体表示形式,是具体的概念.先有类,然后由类来生成 对象(Object).对象又叫做实例(Instance). 2.类由两大部分构成:属性 ...

  7. Java基础语法入门01

    Java基础语法入门01 学习java你要先进行去了解JDK,JRE,JVM JDK Java开发工具包 JRE Java语言开发的运行环境 JVM Java虚拟机,用于Java语言的跨平台所用. 当 ...

  8. Java匹马行天下之JavaSE核心技术——Java基础语法

    Java基础语法 一.   认识Java 1. Java 简介 java 是一种高级的面向对象的程序设计语言,使用Java语言编写的程序时跨平台的.从pc到手机,都有Java开发的程序和游戏,Java ...

  9. Java基础语法(基本语句)

    Java基础语法 标识符在程序中自定义的一些名称.由26个英文字母大小写,数字:0-9符号:_&组成定义合法标识符规则:1.      数字不可以开头2.      不可以使用关键字Java中 ...

随机推荐

  1. 初识Java(2) 变量与数据类型

    一. 变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 1)  必须以字母.下划线 _ .美元符号 $ 开头 2) 变量中,可以包括数字 3) 变量中,不能出现特殊的符号,空格 4 ...

  2. 数据库并行读取和写入(Python实现)

    这篇主要记录一下如何实现对数据库的并行运算来节省代码运行时间.语言是Python,其他语言思路一样. 前言 一共23w条数据,是之前通过自然语言分析处理过的数据,附一张截图: 要实现对news主体的读 ...

  3. Core ML 机器学习

    在WWDC 2017开发者大会上,苹果宣布了一系列新的面向开发者的机器学习 API,包括面部识别的视觉 API.自然语言处理 API,这些 API 集成了苹果所谓的 Core ML 框架.Core M ...

  4. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  5. Visual studio常用的code snippets

    作为全球第一的IDE,VS用起来自然相当的爽,当你在visual studio里敲出几个字母,能帮你生成一大段代码,省时省力又能装逼. 比如,你打一个 prop,然后按tab键,就能生成一个带get/ ...

  6. idea live template高级知识, 进阶(给方法,类,js方法添加注释)

    为了解决用一个命令(宏)给方法,类,js方法添加注释,经过几天的研究.终于得到结果了. 实现的效果如下: 给Java中的method添加方法: /** * * @Method : addMenu * ...

  7. 定期清空log文件

    # auto-del-log.sh #!/bin/shfor i in `find . -name "*.out" -o -name "*.log"`do  c ...

  8. 制作Ubuntu Kylin局域网源

    国人参与开发的开源操作系统UbuntuKylin(http://www.ubuntukylin.com/)已经发布有一段时间了,一直想在单位的局域网内部用用,可惜离线安装比较麻烦,于是搜索了些如何制作 ...

  9. Vulkan Tutorial 19 Vertex input description

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在接下来几个章节中,我们将会使用内存顶点缓冲区来替换之前硬 ...

  10. java排序算法之冒泡排序

    冒泡排序的基本思想即将一串数字进行由小到大进行排序 例如1,9,7,2,4,3,6,10,20,5 实现思路: 第一个数分别与接下来的数字做对比 第一次  1<9不变,再1<7不变,1&l ...