接口: 是对java单继承机制的一种补充; like-a 关系
步骤:
1. 先定义一个接口:
里边写抽象方法
2.让其它类 implement 接口:
并重写接口中的抽象方法
3. 在 总类中写一个 方法,并传入实现了接口的类, 然后通过接口调用接口的方法
语法:
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. 接口类型的变量, 可以指向 实现了该接口的类的对象实例。 (接口就类似于 父类)
2.多态数组
接口多态传递现象: (接口是可以继承的)
内部类:
类的成员: 属性,方法,构造器,代码块,内部类
内部类的最大特点就是 可以直接访问私有属性
语法:
class outer{
class inner{
}
}
class other{
}
内部类分类:
1. 定义在外部类的局部位置上(如方法内)
1) 局部内部类(有类名)
2)匿名内部类(没有类名)
2. 定义在外部类的成员位置上
1)成员内部类(没用static修饰)
2)静态内部类(使用static修饰)
1.局部内部类:
定义在 外部类 的局部位置上,通常是方法内
内部类 可以直接访问 外部类的所有成员,包括私有的
不能添加访问修饰符,但是可以添加final关键字
作用域: 仅仅在定义它的方法 或 代码块 内。
外部类如果想要调用 局部内部类的 的属性或方法, 需要在外部类中创建内部类的对象,然后再调用内部类的成员
如果外部类 和 局部内部类的成员 重名时, 默认遵守就近原则,如果内部类想要访问外部类的成员,使用 外部类名.this.成员 去访问; 外部类名.this 其实就是外部类的一个对象
外部其它类, 不能访问局部内部类!因为局部内部类的本质是局部变量
2.匿名内部类:
本质是类, 是一个内部类,定义在外部类的局部位置, 该类没有名字,但是jdk底层会给它分配一个名字只能通过getClass()看到,它还是一个对象
3. 成员内部类:
定义在 外部类的 成员位置, 并且没有static 修饰
可以直接访问 外部类的所有成员, 包括private的
可以添加任意的访问修饰符,因为它就是一个成员
作用域: 整个外部类
外部类 需要 先创建 成员内部类对象,再调用它的属性和方法
外部其它类 使用 成员内部类 的两种方式:
1) 先创建一个外部类的对象, 外部类.内部类 内部类对象名 = 外部类对象.new 内部类();
2)在外部类中,写一个返回内部类对象的方法
如果外部类 和 成员内部类的成员 重名时, 默认遵守就近原则,如果内部类想要访问外部类的成员,使用 外部类名.this.成员 去访问;
4. 静态内部类
定义: 放在外部类的成员位置, 使用static修饰
可以访问外部类的所有 静态成员,包含私有的, 但是不能直接访问 非静态成员
可以添加任意的访问修饰符,因为它就是一个成员
作用域:整个类体
外部其它类 使用 静态内部类 的方式:
1) 通过类名直接访问
外部类名.静态内部类名 静态内部类对象名 = new 外部类.静态内部类名();
2)在外部类中,写一个返回内部类对象的方法
如果外部类 和 静态内部类的成员 重名时, 默认遵守就近原则,如果内部类想要访问外部类的成员,使用 外部类名.成员 去访问;
枚举和注解框架:
枚举:enum
如何定义枚举类:
1. 将构造器私有化
2. 只保留getXxx,删掉setXxx
3. 在类的内部,直接创建固定的对象 public static final 类名 对象名 = new 类名();
使用enum 来实现枚举类:
1. 用enum代替class
2. 直接 常量名(实参列表), 。。。。
3. 定义常量对象放在前面