在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()呢,我们不知道,当然虚拟机也不可能会知道。
大佬,C++还不是完全面向对象呢。。 怎么把C++与Java混为一谈呀
这个答案我也在想,我们只知道规定接口是这样的,但同时thinking in java中也讲到,嵌套类是可以放到接口中去的,自然这个嵌套类是默认为public static的。而目的则是为了使这部分代码被这个接口的所有不同实现所公用。 static用来定义一个方法的一大用处就是,这部分内容不依赖于类的实例化,其内部也不会存在指向该类某对象的this指针。而嵌套类放到接口中后,过程是一样的,并不违反接口的定义。 当然,不可否认,这和在类中的静态方法作用是不太相同的。 下面这段代码可以看出来对接口中嵌套中的静态方法的调用:package com.test;interface ClassInterface { class InnerClass { public static void M() { System.out.println("M"); } } }public class test {
接口中的变量也都是Final、static。
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.(接口中静态的属性或者方法均与具体的实例无关)
如果你在接口中将方法声明为静态的(与具体的实例无关),但接口中的方法又要求必须被实现类去实现(可能会有多个实现类),这岂不是自相矛盾!
接口中的字段默认就是并且必须是public static final的????
搞错了吧,接口中都是是public abstract ,如果没指定,默认会加上,并没有final,如果定义final那谁来实现那个方法,定义接口的目的就是让子类实现了
可以是你笔误
字段是public static final
方法是 public abstract
从interface的定义上说,接口不允许用户在接口中写方法
static是立刻把接口放进内存,这样做很麻烦使接口失去了活性;如果再把接口实例化那(和普通类差不
多了)接口也没了存在的意义。
接口中的字段默认就是并且必须是public static final的,不是你所说的实例字段. 字段只能是属于类变量,不可以是实例变量.
接口里面只有常量和抽象方法,它只是定义了一种规范。很多程序是面向接口编程的~当然了,还有其他的编程思想了。
public String MyText = "ABCDEFG";
}如果在测试程序中用下面的语句,则会输出:ABCDEFG
System.out.println(MyInterface.MyText);
在这段程序中,没有创建关于 MyInterface 相关的任何对象,因此它是 static 的而如果在程序中试图修改 MyInterface.MyText 的值:
MyInterface.MyText = "1234567";
则会报编译错误:
无法为最终变量 MyText 指定值
Interface.MyText = "1234567";
因此 Interface.MyText 是最终(final)的
如果觉得难以理解的话,请看下面的例子
假设在 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()呢,我们不知道,当然虚拟机也不可能会知道。
大佬,C++还不是完全面向对象呢。。
怎么把C++与Java混为一谈呀
static用来定义一个方法的一大用处就是,这部分内容不依赖于类的实例化,其内部也不会存在指向该类某对象的this指针。而嵌套类放到接口中后,过程是一样的,并不违反接口的定义。
当然,不可否认,这和在类中的静态方法作用是不太相同的。
下面这段代码可以看出来对接口中嵌套中的静态方法的调用:package com.test;interface 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
接口里的方法不允许有方法体
再来看看静态方法,虽然没人具体说过静态方法是什么样的,但是谁见过没有方法体的静态方法呢? 所以static的方法100%是有方法体的,这与接口的定义完全不符所以,接口和静态方法是一对冤家,abstract和static关键字也是一对冤家,他们永远不可能在一起。