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;