接口

  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 }
原文地址:https://www.cnblogs.com/ivy-xu/p/5295895.html