黑马程序员技术交流社区

标题: 抽象类和接口的问题 [打印本页]

作者: study123    时间: 2013-9-2 18:00
标题: 抽象类和接口的问题
本帖最后由 杨增坤 于 2013-9-3 08:28 编辑

看见书上说:“抽象类中可以包含静态方法,接口中不能包含静态方法“。这句话着实不理解。
接口是一个特殊的抽象类啊,那么接口应该跟抽象类一样可以包含静态方法呀???
哪位大哥大姐给解释下,谢谢!!!

作者: gulup    时间: 2013-9-2 18:21
接口不是一个特殊的抽象类,接口是一个特殊的类。接口是类的最高层次的抽象。
接口用于指定标准,协议。
作者: masterV    时间: 2013-9-2 18:40
JDK1.5中定义了Type接口,位于java.lang.reflect包中,它是Java编程语言中所有类型的公共高级接口。class,interface,enum等类型都实现了该接口,他们之间不存在所属关系
作者: 黑马-文鸿利    时间: 2013-9-2 19:05
接口和抽象类之间的关系:
相同点:(1)接口和抽象了都不能被实例化,它们都位于继承树的顶端,用于被其他的类实现和继承。
        (2)接口和抽象类都是可以包含抽象方法的,实现接口或是继承抽象类的普通子类都必须实现这些抽象方法。
不同点: (1)接口只能包含抽象方法,不能包含已经提供实现的方法;抽象类则完全可以包含普通的方法
(2)接口不能定义静态方法;抽象类完全可以定义静态方法。
(3)接口中只能定义静态常量Field,不能定义普通的Field;抽象类既可以定义普通的Field也能定义静态常量Field
(4)接口不能包含构造器;抽象类中可以包含构造器,抽象类中的构造器并不是用于创建对象的,而是让其子类调用这些构造器来完成抽象类的初始化操作。
(5)接口里面不能够包含初始化块;但是抽象类里面则完全可以包含初始化块
(6)一个类最多只能有一个直接父类,包括抽象类;但是一个类可以直接实现多个接口,通过实现多个接口可以弥补Java中的单继承的不足。
作者: 杨增坤    时间: 2013-9-2 19:07
接口中的方法都是抽象的,但是static 和abstract关键字不能同时使用。所以接口中不能有静态的方法。

相关的请点击这
希望对你有帮助!

作者: 焦允    时间: 2013-9-2 20:35

接口的所有方法都是抽象的,而抽象方法是没有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;
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
作者: qqhao01    时间: 2013-9-2 20:38
写的可能有一些乱 请见谅 以下是我个人的一些理解

视频里毕老师说过在初期理解,可以认为接口是一个特殊的抽象类

你先看一下被static修饰后的成员具备以下特点:
1.随着类的加载而加载
2.优先于对象存在  
3.被所有对象所共享
4.除了可以被对象调用外,还可以直接被类名调用 格式:类名.静态成员  
可以看出这些特点接口是都不需要的

什么时候定义静态变量(类变量)?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中。

什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。

可以看出被静态修饰过的是有数据的 你定义static方法时可以是空的 但必须有{} 而接口是不可以有{}的 也就是说静态方法是需要实现的

我也在接口里定义static方法试了试 出现了
Illegal modifier for the interface method Test; only public & abstract are permitted
非法的 修饰语                                                     被允许的
可以看出也是接口的规则 你如果定义静态是非法的

这些说明静态方法是类的功能实现 而接口只能定义功能,不可能实现功能   但抽象是可以实现功能的 所以说接口是一个特殊的抽象类

有哪里不对的地方 请看到的大神可以指出来 并加以修改 谢谢了
作者: lonely_zb    时间: 2013-9-3 02:17
java 中不能定义既是抽象又是静态方法static
interface中所有的成员方法都是abstract的,当然也就不能定义静态方法static。
静态法多的话制作成专门的类 想Math 一样....希望有帮助!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2