<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } PRE.western { font-family: "Nimbus Roman No9 L" } PRE.cjk { font-family: "Nimbus Roman No9 L" } H1 { margin-bottom: 0.08in } H1.western { font-family: "Nimbus Sans L", sans-serif; font-size: 16pt } H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt } H1.ctl { font-family: "DejaVu Sans"; font-size: 16pt } TD P { margin-bottom: 0in } -->
最近活少了很多 打算补一补基础 ! 再看一边Thinking In java 为了加深印象 决定在这里写下笔记同期记录自己学习的进度! 希望大家能多多指教!
废话不多说我按我的顺序开始 现从第八章开始:
java的多重继承
java多重继承是依靠实现接口来实现的,去掉了 C++引以为荣的多重继承 java当然要想办法弥补这一特性于是引入了接口 呵呵! (当然接口还有其他用途);
接口实现多重继承其实跟原来的 Abstract比起来已经有很大进不了比如:
如果狗的主人只是希望狗能爬比较低的树,但是不希望它尾巴可以倒挂在树上,像猴子那样可以飞檐走壁,以免主人管不住它。那么狗
的主人肯定不会要一只猴子继承的狗。
设计模式更多的强调面向接口。猴子有两个接口,一个是爬树,一个是尾巴倒挂。我现在只需要我的狗爬树,但是不要它尾巴倒挂,那
么我只要我的狗实现爬树的接口就行了。同时不会带来像继承猴子来带来的尾巴倒挂的副作用。这就是接口的好处。
这是我见过最好的例子了! 原文引用!
使用接口需要什么原则? 让我们实验一下!
//Illegal modifier for the interface interfaceone ; only public & abstract are permitted // 接口只允许是 public abstract interface interfaceone{ // int ONENUMBER2; //The blank final field ONENUMBER2 may not have been initialized / / 这是 Eclipse 提醒的原文 指出 final 字段必须初始化! int ONENUMBER = 5; //private void f(); //Illegal modifier for the interface method f; only public & abstract are permitted // 这是 Eclipse 提醒的原文 接口中的方法必须是 public abstract ! //abstract 类能有非 abstract 的方法么? void f(); // 什么都不家等于加了 public abstract } public class Chapter001 implements interfaceone{
//public abstract void abstactf (); //The abstract method abstactf in type Chapter001 can only be defined by an abstract class //abstract 方法只能在 abstract 类中定义 public void noabstract(){ //this is no abstact System. out .println( "abstract 类的非 abstract 方法! " ); } @Override public void f() { // 在没有实例化的情况下调用字段 System. out .println(interfaceone. ONENUMBER ); // 输出 5 说明接口字段是静态的 } } |
总结一下:
1. 接口只允许是 public abstract
2.接口中所有属性都是 final static指出 final 字段必须初始化!
3. 接口中的方法必须是 public abstract !
-
4.abstract 方法只能在 abstract 类中定义
下面在看接口实现多重继承 接口实现了比原来 Class 更详细的功能划分 确切说是实现了细粒度的功能划分
下面是一个书中的例子 现定义了 Fight , Swim,Fly, 三个接口
ActionCharacter 实现了 Fight 接口
Hero 继承了 ActionCharacter 实现了这三个接口 然后去调用三个函数
这里 Hero 没有再实现 Fight 接口而是引用了 ActionCharacter 实现的接口 这里 i mplements CanFight, CanSwim, CanFly 其实只要 implements CanSwim, CanFly 就足够了
试想一下: 1. 实现接口可以不去实现函数么?
2. 如果是一个 abstract 类呢?
//: c08:Adventure.java // Multiple interfaces. interface CanFight { void fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } class ActionCharacter { public void fight() {} } class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() {} public void fly() {} } public class Adventure { public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x) { x.fight(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // Treat it as a CanFight u(h); // Treat it as a CanSwim v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter } } ///:~ |
上面代码中有 3个静态函数 u,v,w 这三个函数的参数是不相同的,但是却都接受了 Hero的实例对象就因为实现了这三个接口 所以调用时自动向上转型这就是所谓的接口会调
接口会调允许一个类向上转型为多个不同类型!而且在实际处理中经常是对一个接口特点进行操作最典型的应用就是控制器!
控制起的则是设计模式的问题 呵呵! 现不说那些高深的 今天就到这里!