接口: 是对java单继承机制的一种补充;   like-a 关系

步骤:

1. 先定义一个接口:

  里边写抽象方法

2.让其它类 implement 接口:

  并重写接口中的抽象方法

3. 在 总类中写一个 方法,并传入实现了接口的类, 然后通过接口调用接口的方法

Day 14_抽象方法

 

 

语法:

interface 接口名{

  属性;      

  方法;      // 可以是: 1. 抽象方法(可以省略abstract) 2. 静态方法  3. 默认实现方法(必须加default)  2和3都是在jdk8以后才可以使用的

}

 

class 类名 implements 接口名{

  自己的属性;

  自己的方法;

  接口的所有抽象方法;

}

 

细节:

1. 接口不能实例化。 (因为接口是abstract的)

2. 接口中所有方法都是public的可以省略public, 接口中的抽象方法可以省略abstract

3. 一个普通类 实现接口,就必须实现接口中的所有抽象方法

4. 抽象类 实现 接口时, 可以不实现接口中的抽象方法

5. 接口中的属性 必须是 public static final修饰的

6. 接口不能继承其它的类, 但是接口可以继承多个其它的接口

7. 接口的访问修饰符只能是 public 或者 默认,这点和类的修饰符是一样的

 

接口的多态:

1. 接口类型的变量, 可以指向 实现了该接口的类的对象实例。 (接口就类似于 父类)

Day 14_局部内部类_02

 

Day 14_抽象方法_03

 

 

 2.多态数组

Day 14_外部类_04

 

Day 14_外部类_05

 

 

 

 接口多态传递现象: (接口是可以继承的)

Day 14_外部类_06

 

 Day 14_外部类_07

 

 

内部类:

类的成员: 属性,方法,构造器,代码块,内部类

内部类的最大特点就是 可以直接访问私有属性

语法:

class outer{

  class inner{

  }

}

class other{

}

 

内部类分类:

1. 定义在外部类的局部位置上(如方法内)

  1) 局部内部类(有类名)

  2)匿名内部类(没有类名)

2. 定义在外部类的成员位置上

  1)成员内部类(没用static修饰)

  2)静态内部类(使用static修饰)

 

1.局部内部类:

  定义在 外部类 的局部位置上,通常是方法内

  内部类 可以直接访问 外部类的所有成员,包括私有的

  不能添加访问修饰符,但是可以添加final关键字

  作用域: 仅仅在定义它的方法 或 代码块 内。

  外部类如果想要调用 局部内部类的 的属性或方法, 需要在外部类中创建内部类的对象,然后再调用内部类的成员

  如果外部类 和 局部内部类的成员 重名时, 默认遵守就近原则,如果内部类想要访问外部类的成员,使用 外部类名.this.成员 去访问;  外部类名.this 其实就是外部类的一个对象

  外部其它类, 不能访问局部内部类!因为局部内部类的本质是局部变量

Day 14_抽象方法_08

 

 

 

2.匿名内部类:

本质是类, 是一个内部类,定义在外部类的局部位置, 该类没有名字,但是jdk底层会给它分配一个名字只能通过getClass()看到,它还是一个对象

 

 

 

 

 

 

3. 成员内部类:

  定义在 外部类的 成员位置, 并且没有static 修饰

  可以直接访问 外部类的所有成员, 包括private的

  可以添加任意的访问修饰符,因为它就是一个成员

  作用域: 整个外部类

       外部类 需要 先创建 成员内部类对象,再调用它的属性和方法

    外部其它类 使用 成员内部类 的两种方式:

      1) 先创建一个外部类的对象, 外部类.内部类  内部类对象名 =  外部类对象.new  内部类(); 

      2)在外部类中,写一个返回内部类对象的方法

  如果外部类 和 成员内部类的成员 重名时, 默认遵守就近原则,如果内部类想要访问外部类的成员,使用 外部类名.this.成员 去访问;

 

 

4. 静态内部类

  定义: 放在外部类的成员位置, 使用static修饰

  可以访问外部类的所有 静态成员,包含私有的, 但是不能直接访问 非静态成员

  可以添加任意的访问修饰符,因为它就是一个成员

  作用域:整个类体

  外部其它类 使用 静态内部类 的方式:

    1) 通过类名直接访问

        外部类名.静态内部类名   静态内部类对象名   =    new   外部类.静态内部类名();

    2)在外部类中,写一个返回内部类对象的方法

  如果外部类 和 静态内部类的成员 重名时, 默认遵守就近原则,如果内部类想要访问外部类的成员,使用 外部类名.成员 去访问;

 

 

 

枚举和注解框架:

Day 14_外部类_09

 

 

枚举:enum

如何定义枚举类:

  1. 将构造器私有化

  2. 只保留getXxx,删掉setXxx

  3. 在类的内部,直接创建固定的对象   public static final 类名  对象名 = new 类名();

 

使用enum 来实现枚举类:

  1. 用enum代替class

  2. 直接 常量名(实参列表), 。。。。

  3. 定义常量对象放在前面