day12

接口:

 1、如何声明一个接口
    【修饰符】 interface 接口名{

      }
   【修饰符】 class 类名{
     }
2、接口的成员
      JDK1.8之前:
     (1)全局静态的常量  public static final
     (2)公共的抽象的方法  public abstract
     JDK1.8之后:增加了两个成员
    (1)默认方法
    (2)静态方法
 3、如何使用接口?
    (1)全局静态的常量:通过接口名直接调用
    (2)抽象方法,由实现类(就是子类)来实现它
  
    【修饰符】 class 实现类名  implements 接口们{
      //如果这个类不是抽象类,那么必须实现接口的所有的抽象方法
       }
  
     接口可以比喻成“干爹”,可以有好几个
     继承可以比喻成“亲爹”,只能有一个,所以单继承
    
4、接口的特点
   (1)接口也是不能直接创建对象
   (2)一个类可以同时实现多个接口
   (3)一个类可以同时继承它的父类,又实现接口,要求必须继承在前,实现在后
    【修饰符】 class 实现类名 extends 父类  implements 接口们{
     //如果这个类不是抽象类,那么必须实现接口的所有的抽象方法
      }
   (4)接口和父类有点像,所以接口的变量与实现类对象可以构成多态引用
   (5)一个实现类实现接口时,必须实现接口的所有的抽象方法,否则这个实现类也得是抽象类
   (6)接口可以继承接口,并且可以继承多个接口。
    【修饰符】interface 接口名 extends 接口们{
      }


关系:
     类与类之间:继承,单继承  extends
     类与接口之间:类实现接口,可以多实现 implements
     接口与接口之间:继承,多继承 extends
  
JDK1.8之后,接口增加了两个成员:
  1、静态方法
       和类中的静态方法的格式一样。
       调用时:通过“接口名."调用即可
       原来为了为某个接口提供工具类,还要增加一个类,现在就不同了,直接在接口中声明静态方法即可。
       而且这些静态的实现和接口的实现类是什么类型无关。
  2、默认方法
      语法格式:
      【修饰符】 interface 接口{
                【修饰符】 default 返回值类型  方法名([形参列表]){
                         方法体
                         }
         }
 如何调用?
       必须通过接口的"实现类对象."才能调用
 
       某一个接口的某个抽象方法,可能它的多数实现类对该方法的实现是一样的,那么就没必要每一个实现类都写一遍。
       把这样的方法实现,提取到接口中声明为默认方法,如果其他不一样的实现类,可以选择“重写”。

默认方法的冲突问题:
    1、当某个类实现了多个接口,多个接口的默认方法的方法签名是一样的
         必须重写,但是在重写的时候可以选择(1)保留其中一个(2)选择完全重写
    2、当某个类继承了父类,又实现了接口,但是父类中有一个方法和接口中的默认方法的方法签名是一样的
        默认选择保留“父类”,当然也可以选择重写(1)选择父接口的(2)完全重写

简单工厂模式(了解):
    (1)当创建某个对象比较麻烦
    (2)想要与被创建的对象的类型解耦合
 工厂模式的目的:对象的创建者与对象的使用者角色分离
 代码的结构:
    (1)接口
    (2)有接口的很多实现类
    (3)有一个工厂类,专门new接口的各种实现类的对象
    (4)使用接口的实现类对象的地方,通过工厂类之间获取对象,而不直接new实现类对象
代理模式:(了解)
     1、接口:主题接口
     2、被代理者
     3、代理者
    (1)被代理者和代理者都要实现主题接口。
    (2)要指定代理者为谁代理,即代理者中必须持有被代理者对象的引用

内部类:定义在另一个类里面的类叫做内部类。把外面的这个类称为外部类。
   内部类分为:
       1、成员内部类
            在外部类的里面,在外部类的方法的外面。
       (1)静态成员内部类:有static修饰
       (2)非静态成员内部类:没有static修饰
       2、局部内部类
          在外部类的方法体里面。
      (1)有名局部内部类
      (2)匿名局部内部类

为什么要用内部类?
       类的概念:一类具有相同特性的事物,用一个Java类进行描述。例如:学生类,身体类
       内部类也是类,当某个事物的内部,存在另一个事物,发现也需要一个Java类进行描述,而且这个内部的事物只为外部类服务,
       基本上不会单独使用,那么这个时候用内部类比较合适。定义内部类还有一个好处,内部类可以使用外部类的私有成员。

一、静态内部类
    1、语法格式:
       【修饰符】 class 外部类{
            //静态成员内部类
       【修饰符】 static class 内部类{
            }
         }

     2、静态内部类也是一个类
      (一)静态内部类的成员(都可以)
        (1)属性:类变量和实例变量
        (2)方法:静态方法和非静态方法,抽象方法(只有静态内部类是个抽象类就可以)
        (3)构造器:无参构造,有参构造
        (4)代码块:静态代码块和非静态代码块
        (5)内部类:各种内部类
     (二)静态内部类可以继承父类实现接口
     (三)有自己的字节码文件: 外部类名$静态内部类名.java
    3、如何使用静态内部类
     (1)在外部类中使用静态内部类, 和原来使用其他类一样。
     (2)在外部类的外面使用静态内部类
              使用静态内部类,前面要加“前缀”,“外部类名.内部类名”
     (3)在静态内部类中,使用外部类的成员
              不能在静态内部类中,使用外部类的非静态成员(属性和方法),其他的都能用
二、非静态的成员内部类
     1、语法格式:
       【修饰符】 class 外部类{
            //非静态成员内部类
            【修饰符】 class 内部类{
               }
         }
     2、非静态内部类也是一个类
     (一)非静态内部类的成员(都可以)
         (1)属性:实例变量
         (2)方法:非静态方法,抽象方法(只有非静态内部类是个抽象类就可以)
         (3)构造器:无参构造,有参构造
         (4)代码块:非静态代码块
         (5)内部类:各种非静态内部类
    (二)非静态内部类可以继承父类实现接口
    (三)有自己的字节码文件: 外部类名$非静态内部类名.java
   3、如何使用静态内部类
  (1)在外部类中使用非静态内部类
           在外部类的静态成员中不能使用非静态的内部类(特殊)
  (2)在外部类的外面使用非静态内部类
          步骤:
             第一步:先创建外部类的对象
             第二步:通过外部类的对象访问内部类的构造器创建内部类的对象  或者  通过外部类的某个方法来返回内部类的对象
             第三步:才能通过内部类的对象访问它的成员
 (3)在非静态内部类中,使用外部类的成员
           直接使用,没有限制
 

posted @ 2019-09-23 16:07  zzz222zzz  阅读(391)  评论(0编辑  收藏  举报