2 ss sign SS_Sign 于 2016.09.23 19:05 提问

关于Java接口的问题,,,,,

为什么接口中不能有静态代码块???为什么接口中的方法不能用static修饰
谢谢了。

5个回答

feng1790291543
feng1790291543   Ds   Rxr 2016.09.23 19:11

java接口中为什么不能有静态方法 接口的所有方法都是抽象的,而抽象方法是没有static,有static的方法是不能override的,所以这样定义接口才有意义。

接口中的变量也都是Final、static。

在Thinking in Java中有这样的描述:
The interface keyword produces a completely abstract class, one that provides no implementation at all. It allows the creator to determine method names, argument lists, and return types, but no method bodies. An interface provides only a form, but no implementation.(接口是完全抽象的一个类,不提供任何实现) 接口中的字段默认就是并且必须是public static final的,不是你所说的实例字段. 字段只能是属于类变量,不可以是实例变量. 同样在Thinking in Java中有:
When you say something is static, it means that particular field or method is not tied to any particular object instance of that class.(接口中静态的属性或者方法均与具体的实例无关)

如果你在接口中将方法声明为静态的(与具体的实例无关),但接口中的方法又要求必须被实现类去实现(可能会有多个实现类),这岂不是自相矛盾!

静 态方法是不能被子类重写(也叫覆盖)的(为什么不能重写,则是另外一个问题了) 接口中是不能有被实现的方法的,否则它就不是接口而是抽象类 一个类要实现接口中的方法,其实就是对接口方法的重写。而要实现静态方法,就必须重写接口中的静态方法,这和第一点产生冲突。 如果觉得难以理解的话,请看下面的例子
假设在 java 中可以定义静态方法:
public interface MyInterface {
public static void f();
} 有两个子类实现了这个接口:
public class A implements MyInterface {
public static void f(){
System.out.println("AAAA");
}
} public class B implements MyInterface {
public static void f(){
System.out.println("BBBB");
}
} 现在有段程序需要调用 MyInterface 中定义的静态方法 f(),由于 f 是静态的,因此我们可以用
MyInterface.f();
来调用这个方法。 但是,在 MyInterface 中并没有实现 f() 方法,因此必须是调用子类的实现。

那么这里就存在一个问题,到底是调用 A.f() 还是调用 B.f()呢,我们不知道,当然虚拟机也不可能会知道。

这个答案我也在想,我们只知道规定接口是这样的,但同时thinking in java中也讲到,嵌套类是可以放到接口中去的,自然这个嵌套类是默认为public static的。而目的则是为了使这部分代码被这个接口的所有不同实现所公用。
static用来定义一个方法的一大用处就是,这部分内容不依赖于类的实例化,其内部也不会存在指向该类某对象的this指针。而嵌套类放到接口中后,过程是一样的,并不违反接口的定义。
当然,不可否认,这和在类中的静态方法作用是不太相同的。
下面这段代码可以看出来对接口中嵌套中的静态方法的调用:
package com.test; i
nterface ClassInterface {
class InnerClass {
public static void M() {
System.out.println("M");
}
}
} public class test {

public static void main(String[] args) throws Exception {
ClassInterface.InnerClass.M();
}

} 输出是M

hxzon:单例与静态方法的比较
单例方法可以被覆盖。

SS_Sign
SS_Sign 回复StefanChen一只小小毛驴: 不好意思啊,我想问的是接口中的方法为什么不能用static修饰,以及为什么不能有静态块。
大约一年之前 回复
SS_Sign
SS_Sign 回复StefanChen一只小小毛驴: 不好意思啊,我想问的是接口中的方法为什么不能用static修饰,以及为什么不能有静态块。
大约一年之前 回复
SS_Sign
SS_Sign 回复StefanChen一只小小毛驴: 不好意思啊,我想问的是接口中的方法为什么不能用static修饰,以及为什么不能有静态块。
大约一年之前 回复
SS_Sign
SS_Sign 回复StefanChen一只小小毛驴: 不好意思啊,我想问的是接口中的方法为什么不能用static修饰,以及为什么不能有静态块。
大约一年之前 回复
qq_29594393
qq_29594393   Ds   Rxr 2016.09.23 19:57

看一下接口的定义 ,只能有抽象方法,所有方法都是抽象方法的抽象类称之为接口,如果有static 那只能是抽象类 ,而不能说是接口

qq_29594393
qq_29594393 回复SS_Sign: 说了有了静态后就是不接口,而称之为抽象类,这就是为什么不能有static
大约一年之前 回复
SS_Sign
SS_Sign 回复当作看不见: 不好意思啊,我想问的是接口中的方法为什么不能用static修饰,以及为什么不能有静态块。
大约一年之前 回复
SS_Sign
SS_Sign 回复当作看不见: 不好意思啊,我想问的是接口中的方法为什么不能用static修饰,以及为什么不能有静态块。
大约一年之前 回复
oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.23 21:38

static方法是与类绑定而不是对象,所以不支持多态、继承等。。

接口中的方法都是抽象方法,如果定义成static则无法被子类实现,这与抽象方法必须由子类实现相矛盾

blueair_ren
blueair_ren 回复SS_Sign: 静态块是程序运行起来就首先被执行的,不符合接口把实现交给子类实现的道理!
大约一年之前 回复
SS_Sign
SS_Sign 明白了,谢谢;那为什么不能有静态块呢?
大约一年之前 回复
blueair_ren
blueair_ren   2016.09.23 22:03

抽象方法意味着只是在此类(接口)中定义,要求子类完成功能。是模板模式的设计常用手段!
如果是static的,表示可以不需实例化类就执行,显然不符合把细节交给子类的设计初衷。

oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.23 22:05

也是类似的道理,静态代码块在类加载的时候就必须执行,而接口则依赖于具体的实现类

SS_Sign
SS_Sign 还是不太明白。接口中如果有静态代码块,类加载时候执行了又会怎么样呢?和实现类有什么关系啊?麻烦咯。。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片