interface & abstract class & static 方法

问题 

高手请教 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永远不能和abstract碰头;
原则二:interface是更抽象的抽象类,接口的所有方法都未实现,接口的方法默认为public abstract ,根据原则一,当然不能是static了;
原则三:抽象类是部分实现的,其中non-abstract方法可以带static,abstract方法不能带static;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值