接口
2016-03-19 18:21
435 查看
接口:比抽象类更抽象的类,是一种规范标准。可以表示一种能力,定义不同层之间的操作标准。 在进行某些公共操作的时候一定要定义出接口 接口和类都是类型 如果没有继承关系,就要用接口(优先考虑) ★接口必须要有子类★ 范例: public interface A{ /*接口里面只能是抽象方法*/ public static final String MSG = "Hello"; //全局变量 public abstract void print(); //抽象方法 } 接口存在抽象方法,所以接口对象★★★不能new进行实例化★★★的操作 注意: 一个子类可以实现(implements)多个接口 ◆一个接口可以extends多个接口◆ ★类和接口之间 不能(extends),只能(implements)★ ★类和类,接口和接口可以继承(extends)★ 子类一定要实现(implements)接口的●所有●的方法【重写全部的抽象方法,向上转型】 范例: /*接口A*/ public interface A { //定义了接口 String MSG = "Hello"; //全局常量 void print(); //抽象方法,不写访问修饰符默认是public } /*接口B*/ public interface B { public void get(); //这里是抽象方法,可以省略abstract } //X类实现了 A和B两个接口 public class X implements A,B{ public void print(){ System.out.println("A接口的抽象方法"); } public void get(){ System.out.println("B接口的抽象方法"); } } public class TestX{ public static void main(String[] args) { X x = new X();//接口A,B不能实例化 实例化子类对象 A a = x; B b = x; a.print(); b.get(); System.out.println(b instanceof A); /*多个栈空间可以指向同一个堆空间*/ System.out.println(a instanceof B); /*一个栈空间【不可以】指向多个堆空间*/ } } 如果X不想实现print方法,就定义X为抽象类,print()为抽象方法,再写一个其非抽象类的子类实现即可 如果既有继承,又有实现,那么先写extends,再写implements,它们的所有抽象方法都要重写 接口里面可以定义普通内部类,抽象内部类,内部接口 如果内部类,内部接口有static,此时内部类称为外部类,或外部接口 范例: public interface A { public void fun1(); abstract class B{//内部类 abstract void fun2(); } } //看不到内部类B class H implements A{ @Override public void fun1() { System.out.println("A的抽象方法"); } } //调用A所有的方法 class D extends A.B implements A{ @Override public void fun1() { System.out.println("A的抽象方法"); } @Override void fun2() { System.out.println("B的抽象方法"); } } //调用内部类B class E extends A.B{ @Override void fun2() { System.out.println("B的抽象方法"); } } 应用:USB /*定义USB接口*/ public interface UsbInterFace { void start(); void stop(); } /*要做的事情computer*/ public class Computer{ public void plugIn(UsbInterFace usbInterface) { usbInterface.start(); usbInterface.stop(); } } /*USB的类型1,实现USB*/ public class UDisk implements UsbInterFace { @Override public void start() { System.out.println("U盘开始工作了"); } @Override public void stop() { System.out.println("U盘停止工作了"); } } /*USB的类型2,实现USB*/ public class UsbFan implements UsbInterFace{ @Override public void start() { System.out.println("电风扇开始工作了"); } @Override public void stop() { System.out.println("电风扇停止工作了"); } } /*测试类*/ public class TestComputer { public static void main(String[] args) { Computer computer = new Computer(); computer.plugIn(new UsbFan()); computer.plugIn(new UDisk()); } } 【工厂设计模式】 普通:在Factory类的方法中加if 高级:修改配置 范例1: /*Fruit接口*/ public interface Fruit { void eat(); } /*实现子类1*/ public class Apple implements Fruit { @Override public void eat() { System.out.println("吃苹果"); } } /*实现子类2*/ public class Orange implements Fruit { @Override public void eat() { System.out.println("吃橘子"); } } /*工厂类,批量生产实现子类*/ public class Factory { public static Fruit getInstance(String className){ //有多少子类就写多少子类 if ("apple".equalsIgnoreCase(className)) { return new Apple(); } else if("orange".equalsIgnoreCase(className)){ return new Orange(); } else { return null; } } } /*测试类*/ public class TestFruit { public static void main(String[] args) { Fruit f = Factory.getInstance("orange");【工厂类.(静态方法)getInstance(“用户输入的实现子类的名称”)】 f.eat(); } } 范例2: /** * 墨盒类 */ public interface Ink { public String getColor(); /*接口内的抽象方法,可以有返回值,也可以没有返回值*/ } /** * 纸张类 */ public interface Paper { public String getSize(); } public class MyColorInk implements Ink { @Override public String getColor() { return "暗金色"; } } public class MyColorInkV3 extends MyColorInk { @Override public String getColor() { return "暗红色"; } } public class LaojiuPaper implements Paper{ @Override public String getSize() { return "A6L"; } } public class LaojiuPaper implements Paper{ @Override public String getSize() { return "A6L"; } } import java.io.IOException; import java.util.Properties; /** * 配置类 */ public class Config { public static Properties props = new Properties(); //静态块-生命周期在整个应用程序运行之前 static{ //加载配置文件 try { props.load(Config.class.getClassLoader(). getResourceAsStream("MyConfig.properties") ); } catch (IOException e) { e.printStackTrace(); } } /** * 根据传入的名称得到相应实现类的实例(使用反射技术) * @param name * @return * @throws ClassNotFoundException * @throws InstantiationException * @throws IllegalAccessException */ public static Object getInstance(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //根据接口名得到实现类的全称 String fullName = getProperty(name); if(null == fullName) return null; //得到实现类 Class objClass = Class.forName(fullName); //返回实现类的实例 return objClass.newInstance(); } /** * 根据键得到配置文件中对应的值 * @param key * @return */ public static String getProperty(String key){ //key == 对象 return props.getProperty(key); } } ★同一个java projiect中的MyConfig.properties记事本★(控制台输出的结果MyColorInk,LaojiuPaper) ink=com.ljxy.kenny.printerdemo.MyColorInk paper=com.ljxy.kenny.printerdemo.LaojiuPaper 【代理设计模式】 范例: public interface Subject { //整个操作的核心主题 public void make(); //整个主题的核心功能 } /*实现子类1*/ public class RealSubject implements Subject { //真正执行核心功能的人 public void make() { System.out.println("皇帝陛下正在XX。"); } } /*实现子类2-代理*/ public class ProxySubject implements Subject { private Subject subject; /*代理的带参构造方法*/ public ProxySubject(Subject subject){ this.subject=subject; } @override public void make() { this.prepare(); this.subject.make(); this.destory(); } public void prepare(){ System.out.println("为临幸做准备!"); } public void destory(){ System.out.println("把娘娘搬走了,皇帝伺候睡觉了!"); } } public class TestDemo { public static void main(String args[]){ Subject sub=new ProxySubject(new RealSubject());//实际实施临幸的RealSubject sub.make(); //调用的是代理主题操作 } }
相关文章推荐
- [国嵌攻略][164][USB驱动程序设计]
- Android5.0常用颜色属性说明
- Android5.0常用颜色属性说明
- Spring中@Autowired注解、@Resource注解的区别
- Android5.0常用颜色属性说明
- 第27章 窗口与消息(1)
- Android5.0常用颜色属性说明
- 利用jquery给指定的table动态添加一行、删除一行
- N皇后问题
- 制作基于centos7的mysql的docker镜像
- Object.prototype.toString应用和原理探析
- 作业:用HTML制作简历
- 00docker安装和简介
- HAProxy几个重要的结构体
- 《深入浅出数据分析》笔记一
- Problem G: C语言习题 医生值班
- 第四周项目1求最大公约数
- JavaScript的闭包理解
- iOS开发扫盲篇
- VS2008/VS2010安装时提示VC++9.0 Runtime安装失败问题的解决方法