接口
1 接口:比抽象类更抽象的类,是一种规范标准。可以表示一种能力,定义不同层之间的操作标准。 2 在进行某些公共操作的时候一定要定义出接口 3 接口和类都是类型 4 如果没有继承关系,就要用接口(优先考虑) 5 ★接口必须要有子类★ 6 范例: 7 public interface A{ 8 /*接口里面只能是抽象方法*/ 9 public static final String MSG = "Hello"; //全局变量 10 public abstract void print(); //抽象方法 11 } 12 接口存在抽象方法,所以接口对象★★★不能new进行实例化★★★的操作 13 14 注意: 15 一个子类可以实现(implements)多个接口 16 ◆一个接口可以extends多个接口◆ 17 ★类和接口之间 不能(extends),只能(implements)★ 18 ★类和类,接口和接口可以继承(extends)★ 19 子类一定要实现(implements)接口的●所有●的方法【重写全部的抽象方法,向上转型】 20 范例: 21 /*接口A*/ 22 public interface A { //定义了接口 23 String MSG = "Hello"; //全局常量 24 void print(); //抽象方法,不写访问修饰符默认是public 25 } 26 27 /*接口B*/ 28 public interface B { 29 public void get(); //这里是抽象方法,可以省略abstract 30 } 31 32 //X类实现了 A和B两个接口 33 public class X implements A,B{ 34 public void print(){ 35 System.out.println("A接口的抽象方法"); 36 } 37 38 public void get(){ 39 System.out.println("B接口的抽象方法"); 40 } 41 } 42 43 public class TestX{ 44 public static void main(String[] args) { 45 X x = new X();//接口A,B不能实例化 实例化子类对象 46 A a = x; 47 B b = x; 48 a.print(); 49 b.get(); 50 System.out.println(b instanceof A); /*多个栈空间可以指向同一个堆空间*/ 51 System.out.println(a instanceof B); /*一个栈空间【不可以】指向多个堆空间*/ 52 } 53 } 54 55 如果X不想实现print方法,就定义X为抽象类,print()为抽象方法,再写一个其非抽象类的子类实现即可 56 如果既有继承,又有实现,那么先写extends,再写implements,它们的所有抽象方法都要重写 57 接口里面可以定义普通内部类,抽象内部类,内部接口 58 如果内部类,内部接口有static,此时内部类称为外部类,或外部接口 59 范例: 60 public interface A { 61 public void fun1(); 62 63 abstract class B{//内部类 64 abstract void fun2(); 65 } 66 } 67 //看不到内部类B 68 class H implements A{ 69 70 @Override 71 public void fun1() { 72 System.out.println("A的抽象方法"); 73 } 74 } 75 76 //调用A所有的方法 77 class D extends A.B implements A{ 78 79 @Override 80 public void fun1() { 81 System.out.println("A的抽象方法"); 82 } 83 84 @Override 85 void fun2() { 86 System.out.println("B的抽象方法"); 87 } 88 } 89 90 //调用内部类B 91 class E extends A.B{ 92 93 @Override 94 void fun2() { 95 System.out.println("B的抽象方法"); 96 } 97 } 98 99 应用:USB 100 /*定义USB接口*/ 101 public interface UsbInterFace { 102 void start(); 103 void stop(); 104 } 105 106 /*要做的事情computer*/ 107 public class Computer{ 108 public void plugIn(UsbInterFace usbInterface) { 109 usbInterface.start(); 110 usbInterface.stop(); 111 } 112 } 113 114 /*USB的类型1,实现USB*/ 115 public class UDisk implements UsbInterFace { 116 @Override 117 public void start() { 118 System.out.println("U盘开始工作了"); 119 } 120 121 @Override 122 public void stop() { 123 System.out.println("U盘停止工作了"); 124 } 125 } 126 127 /*USB的类型2,实现USB*/ 128 public class UsbFan implements UsbInterFace{ 129 @Override 130 public void start() { 131 System.out.println("电风扇开始工作了"); 132 } 133 134 @Override 135 public void stop() { 136 System.out.println("电风扇停止工作了"); 137 } 138 } 139 140 /*测试类*/ 141 public class TestComputer { 142 public static void main(String[] args) { 143 Computer computer = new Computer(); 144 computer.plugIn(new UsbFan()); 145 computer.plugIn(new UDisk()); 146 } 147 } 148 149 【工厂设计模式】 150 普通:在Factory类的方法中加if 151 高级:修改配置 152 范例1: 153 /*Fruit接口*/ 154 public interface Fruit { 155 void eat(); 156 } 157 158 /*实现子类1*/ 159 public class Apple implements Fruit { 160 @Override 161 public void eat() { 162 System.out.println("吃苹果"); 163 } 164 } 165 166 /*实现子类2*/ 167 public class Orange implements Fruit { 168 @Override 169 public void eat() { 170 System.out.println("吃橘子"); 171 } 172 } 173 174 /*工厂类,批量生产实现子类*/ 175 public class Factory { 176 public static Fruit getInstance(String className){ 177 //有多少子类就写多少子类 178 if ("apple".equalsIgnoreCase(className)) { 179 return new Apple(); 180 } else if("orange".equalsIgnoreCase(className)){ 181 return new Orange(); 182 } else { 183 return null; 184 } 185 } 186 } 187 188 /*测试类*/ 189 public class TestFruit { 190 public static void main(String[] args) { 191 Fruit f = Factory.getInstance("orange");【工厂类.(静态方法)getInstance(“用户输入的实现子类的名称”)】 192 f.eat(); 193 } 194 } 195 196 范例2: 197 /** 198 * 墨盒类 199 */ 200 public interface Ink { 201 public String getColor(); 202 /*接口内的抽象方法,可以有返回值,也可以没有返回值*/ 203 } 204 205 /** 206 * 纸张类 207 */ 208 public interface Paper { 209 public String getSize(); 210 } 211 212 public class MyColorInk implements Ink { 213 @Override 214 public String getColor() { 215 return "暗金色"; 216 } 217 } 218 219 public class MyColorInkV3 extends MyColorInk { 220 @Override 221 public String getColor() { 222 return "暗红色"; 223 } 224 } 225 226 public class LaojiuPaper implements Paper{ 227 @Override 228 public String getSize() { 229 return "A6L"; 230 } 231 } 232 233 public class LaojiuPaper implements Paper{ 234 @Override 235 public String getSize() { 236 return "A6L"; 237 } 238 } 239 240 import java.io.IOException; 241 import java.util.Properties; 242 243 /** 244 * 配置类 245 */ 246 public class Config { 247 public static Properties props = new Properties(); 248 //静态块-生命周期在整个应用程序运行之前 249 static{ 250 //加载配置文件 251 try { 252 props.load(Config.class.getClassLoader(). 253 getResourceAsStream("MyConfig.properties") 254 ); 255 } catch (IOException e) { 256 e.printStackTrace(); 257 } 258 } 259 260 /** 261 * 根据传入的名称得到相应实现类的实例(使用反射技术) 262 * @param name 263 * @return 264 * @throws ClassNotFoundException 265 * @throws InstantiationException 266 * @throws IllegalAccessException 267 */ 268 public static Object getInstance(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ 269 //根据接口名得到实现类的全称 270 String fullName = getProperty(name); 271 if(null == fullName) return null; 272 //得到实现类 273 Class objClass = Class.forName(fullName); 274 //返回实现类的实例 275 return objClass.newInstance(); 276 } 277 278 /** 279 * 根据键得到配置文件中对应的值 280 * @param key 281 * @return 282 */ 283 public static String getProperty(String key){ //key == 对象 284 return props.getProperty(key); 285 } 286 } 287 288 ★同一个java projiect中的MyConfig.properties记事本★(控制台输出的结果MyColorInk,LaojiuPaper) 289 ink=com.ljxy.kenny.printerdemo.MyColorInk 290 paper=com.ljxy.kenny.printerdemo.LaojiuPaper 291 292 【代理设计模式】 293 范例: 294 public interface Subject { //整个操作的核心主题 295 public void make(); //整个主题的核心功能 296 } 297 /*实现子类1*/ 298 public class RealSubject implements Subject { //真正执行核心功能的人 299 public void make() { 300 System.out.println("皇帝陛下正在XX。"); 301 } 302 } 303 /*实现子类2-代理*/ 304 public class ProxySubject implements Subject { 305 private Subject subject; 306 /*代理的带参构造方法*/ 307 public ProxySubject(Subject subject){ 308 this.subject=subject; 309 } 310 311 @override 312 public void make() { 313 this.prepare(); 314 this.subject.make(); 315 this.destory(); 316 } 317 318 public void prepare(){ 319 System.out.println("为临幸做准备!"); 320 } 321 322 public void destory(){ 323 System.out.println("把娘娘搬走了,皇帝伺候睡觉了!"); 324 } 325 } 326 327 public class TestDemo { 328 public static void main(String args[]){ 329 Subject sub=new ProxySubject(new RealSubject());//实际实施临幸的RealSubject 330 sub.make(); //调用的是代理主题操作 331 } 332 }