interface & abstract class 为什么不能包含static 方法!
sun这么做的动机是什么?
好像大名鼎鼎的 thinking in java中也没有解释!
abstract class A {
static void doSomething() ;
}
不能通 过编译 是因 为 你没有定 义 doSomething 的方法体 , 比如 该语 句最后你加上 {}, 就可以了用了 . 这时 候 doSomething 是 A 的一个 类 方法 .
如果你想把它定 义为 一个抽 象方法那 么 你必 须 定 义 它的 时 候使用 关键 字 abstract. 如果你想定 义 一个方法同 时 使用 关键 字 abstract 和 static 这 是 办 不到的 . 你想想, static 方法是 类 方法 , 它是不允 许 子 类 覆写( override )的(所以必 须 在定 义 的 时 候 给 出 实现 ),而 abstract 方法,是只有特征 标 ,没有 实现 的方法,是必 须 由子 类 来覆写的,两者是水火不相容的, sun 当然不会允 许 定 义 一个同 时为 abstract 和 static 的方法。
至于接口和抽象 类还 有点不同,因 为 它是 纯 粹的 设计 ,不 涉 及任何的 实现 ,它所有的方法都是共有和 抽象的( 关键 字 public 和 abstract 可以省略)所以接口不能有 static 方法( 类 方法),上面提到的 static void doSomething(){} ;在抽象 类 中可以存在,但是在接口中是不允 许 的。
顺 便提以下,在接口中可以定 义 staic 的属性的。 实际 上接口中定 义 的属性必 须 是 static,final 和 public 的(因 为 是必 须 的,所以 这 3 个 关键 字也都是可以省略的)
static void doSomething() ;
}
不能通 过编译 是因 为 你没有定 义 doSomething 的方法体 , 比如 该语 句最后你加上 {}, 就可以了用了 . 这时 候 doSomething 是 A 的一个 类 方法 .
如果你想把它定 义为 一个抽 象方法那 么 你必 须 定 义 它的 时 候使用 关键 字 abstract. 如果你想定 义 一个方法同 时 使用 关键 字 abstract 和 static 这 是 办 不到的 . 你想想, static 方法是 类 方法 , 它是不允 许 子 类 覆写( override )的(所以必 须 在定 义 的 时 候 给 出 实现 ),而 abstract 方法,是只有特征 标 ,没有 实现 的方法,是必 须 由子 类 来覆写的,两者是水火不相容的, sun 当然不会允 许 定 义 一个同 时为 abstract 和 static 的方法。
至于接口和抽象 类还 有点不同,因 为 它是 纯 粹的 设计 ,不 涉 及任何的 实现 ,它所有的方法都是共有和 抽象的( 关键 字 public 和 abstract 可以省略)所以接口不能有 static 方法( 类 方法),上面提到的 static void doSomething(){} ;在抽象 类 中可以存在,但是在接口中是不允 许 的。
顺 便提以下,在接口中可以定 义 staic 的属性的。 实际 上接口中定 义 的属性必 须 是 static,final 和 public 的(因 为 是必 须 的,所以 这 3 个 关键 字也都是可以省略的)
原
则
一:
static
永
远
不能和
abstract
碰
头
;
原 则 二: interface 是更抽象的抽象 类 ,接口的所有方法都未 实现 ,接口 的方法默 认为 public abstract ,根据原 则 一,当然不能是 static 了;
原 则 三:抽象 类 是部分 实现 的,其中 non - abstract 方法可以 带 static , abstract 方法不能 带 static ;
原 则 二: interface 是更抽象的抽象 类 ,接口的所有方法都未 实现 ,接口 的方法默 认为 public abstract ,根据原 则 一,当然不能是 static 了;
原 则 三:抽象 类 是部分 实现 的,其中 non - abstract 方法可以 带 static , abstract 方法不能 带 static ;