/*
- 接口(interface)的使用
- 1,使用 interface 接口名{} 的格式来定义一个接口,接口的主要用途就是被实现类实现。(面向接口编程)
- 2,在java中接口与类是并列的结构,
- 3,接口里面的成员
- 3.1在JDK7及以前的版本中,接口里面只能定义全局常量和抽象方法
-
全局常量:public static final 变量类型 变量名 = 值;因为默认是公共的静态常量,前面可以在书写时省略
- 可以使用接口名.变量名的方式调用全局常量。
-
抽象方法:public abstract 方法名();书写时前面可以省略
- 3.2在JDK8及以后的版本中,接口里面可以定义静态方法与默认方法。
- 4,接口不能实例化,里面不能有构造器
- 5,接口需要通过实现类(implements)来使用
- 5.1如果实现类实现了接口中所有的抽象方法,此实现类就可以实例化。
- 5.2如果没有重写所有的抽象方法,实现类依然是抽象类,不能实例化
- 6,java中实现类可以实现多接口,变相实现了多重继承的功能。
- 格式为 class 类名 implements 接口名1,接口名2,…{}
- 如果有父类,则书写上先继承父类在实现接口
- 格式为class 类名 extends 父类名 implements 接口名1,接口名2,…{}
- 实现类中需要实现多个接口的全部抽象方法才可以实例化。
- 父类中实现的接口抽象法方法子类可以继承,不用再实现
- 7,接口与接口之间可以单继承也可以多继承
- 格式为 interface 接口名1 extends 接口名2,接口名3,…{}
- 实现类需要实现接口与接口继承的其他接口中的所有抽象方法才可以实例化。
- 继承的接口中有重名方法,参数也相同,实现类只需要实现一个方法。
- 8,接口的具体使用可以体现多态性,方法形参中可以定义抽象类或接口,传入参数的时候
- 使用抽象类的子类对象或接口的实现类对象传入。
- 9,接口可以理解为一种规范,定义的是一组规则,体现了现实世界中“如果你是/要…则
- 必须能…”的思想。继承是一个"是不是"的关系,而接口实现则是 "能不能"的关系。
- 10,类似抽象类,接口也可以有匿名实现类或匿名对象。格式与抽象类情况相同。
- 11,接口的应用:代理模式
- 应用场景:
* 1,安全代理:屏蔽对真实角色的直接访问。 - 2,远程代理:通过代理类处理远程方法调用(RMI)
- 3,延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象比如你要开发一个大文档查看软件,
- 大文档中有大的图片,有可能一个图片有100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理
- 模式,当需要查看图片时,用proxy来进行大图片的打开。
- 分类
- 1,静态代理(静态定义代理类)
- 2, 动态代理(动态生成代理类) JDK自带的动态代理,需要反射等知识
- 12,抽象类与接口的异同:
- 相同点:不能实例化,可以被继承,都有可以有抽象方法,必须有子类重写后才能使用
- 不同点:
- 1 定义: 抽象类是包含抽象方法的类 ,接口主要是抽象方法和全局常量的集合
- 2 组成: 抽象类中可以有 构造器、抽象方法、普通方法、常量、 变量 。接口中可以有全局常量、抽象方法、(jdk8.0增加默认方法、静态方法)
- 3 使用 :子类继承抽象类(extends) ,子类实现接口(implements)
- 4 关系 :抽象类可以实现多个接口, 接口不能继承抽象类,但允许继承多个接口
- 5 常见设计模式 :抽象类是模板方法 ,接口是简单工厂、工厂方法、代理模式
- 6 对象: 都通过对象的多态性产生实例化对象
- 7 局限: 抽象类有单继承的局限 接口没有此局限
- 8 实际应用 :抽象类作为一个模板,接口是作为一个标准或是表示一种能力
- 如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限
- 在开发中,常看到一个类不是去继承一个已经实现好的类,而是要么继承抽象类,要么实现接口。
*/
package object_chapter2;
import javax.management.RuntimeErrorException;
public class Object_Interface {
public static void main(String[] args) {
System.out.println(A.MAX_SPEED);//可以通过接口名.属性名的方式调用接口中的全局常量
D d = new D();
d.method();
new E().method();
new E().method(10);
new E().out();
//非匿名实现类非匿名对象调用
USB m = new MP3();//多态性
Computer c = new Computer();
c.connect(m);
//非匿名实现类匿名对象调用
c.connect(new Camera());
//匿名实现类非匿名对象调用
USB u = new USB() {
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("手机传输文件");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("手机充电中");
}
};
c.connect(u);
//匿名实现类匿名对象调用
c.connect(new USB() {
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("移动硬盘传输电影");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("移动硬盘供电中");
}});
//测试代理模式
Designer design = new Customer();
Designer company = new Company(design);
company.CAD();
//测试比较类实现比较接口抽象方法
CompareableCamera c1 = new CompareableCamera(3.2,8);
CompareableCamera c2 = new CompareableCamera(3.3,7);
System.out.println(c1.compareTo(c2));
System.out.println(c2.compareTo(c1));
System.out.println(c2.compareTo(d));
System.out.println(c1.compareToWeight(c2));
System.out.println(c2.compareToWeight(c1));
}
}
interface A{
public static final int MAX_SPEED = 120;
public abstract void method();
}
interface B{
int MIN_SPEED = 80;
void method(int n);
}
interface C extends A,B{
E e = new E();
int MID_SPEED = 100;
void method();
}
class D implements A{
int MAX_SPEED = 160;
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("我是谁");
}
}
class E extends D implements C{
// @Override
// public void method() {
// // TODO Auto-generated method stub
// System.out.println("我在哪里");
// }
@Override
public void method(int n) {
// TODO Auto-generated method stub
System.out.println("我要干什么");
System.out.println(Math.sqrt(n));
}
void out() {
// e = new E();//e为全局常量,不能修改
// System.out.println(MAX_SPEED);//因为重名,编译不通过
System.out.println(super.MAX_SPEED);//调取父类的MAX_SPEED方式
System.out.println(A.MAX_SPEED);//调取接口的MAX_SPEED方式
}
}
class Computer{
public void connect(USB u) {
u.transferDate();
u.charge();
}
}
interface USB{
void transferDate();
void charge();
}
class MP3 implements USB{
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("传输音乐");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("MP3充电中");
}
}
class Camera implements USB{
private double f;
Integer weight;
public Camera(double f, Integer weight) {
super();
this.f = f;
this.weight = weight;
}
public Camera() {
super();
}
public double getF() {
return f;
}
public void setF(double f) {
this.f = f;
}
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("传输照片");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("相机充电中");
}
}
//代理模式
interface Designer{
void CAD();
}
class Customer implements Designer{
@Override
public void CAD() {
// TODO Auto-generated method stub
System.out.println("得到设计图纸");
}
}
class Company implements Designer{
private Designer d;
Company(Designer d){
this.d = d;
}
void professionalDesign() {
System.out.println("专业人员精心设计");
}
@Override
public void CAD() {
// TODO Auto-generated method stub
professionalDesign();
d.CAD();
}
}
//创建比较接口
interface CompareObject{
int compareTo(Object o);
}
//创建比较接口的实现类,比较Camera类的对象。
class CompareableCamera extends Camera implements CompareObject{
public CompareableCamera() {
super();
// TODO Auto-generated constructor stub
}
public CompareableCamera(double f, Integer weight) {
super(f, weight);
// TODO Auto-generated constructor stub
}
@Override
public int compareTo(Object o) {
if(this == o) {
return 0;
}
if(o instanceof Camera) {
Camera cam = (Camera)o;
if(this.getF() > cam.getF()) {
return 1;
}else if(this.getF() < cam.getF()) {
return -1;
}else {
return 0;
}
// return new Double(this.getF()).compareTo(new Double(cam.getF()));//可以将数据转换为包装类,直接调取包装类的比较方法
}else {
throw new RuntimeException("数据类型错误");
}
}
public int compareToWeight(Object o) {
if(this == o) {
return 0;
}
if(o instanceof Camera) {
Camera cam = (Camera)o;
return this.weight.compareTo(cam.weight); //对于包装类可以直接调取包装类中的比较方法
}else {
throw new RuntimeException("数据类型错误");
}
}
}