`

有关abstract interface 和interface的问题??

    博客分类:
  • Java
阅读更多

摘自:SCJP Guide和sun doc

网址:http://www.witscale.com/ebook/Browsable/ebook078.htm

网址:http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html


To summarize the modifiers in relation with interfaces, note that

         Interface can be declared with either public or default access . It is implicitly abstract.

         Interface methods are by default public and abstract.

         Interface variables are by default public, static and final.

1.接口可以声明为public(公共)或默认的访问权限。接口隐含表明是抽象的(abstract)的。
2.接口的方法默认即为public(公共)且是abstract(抽象)的.
3.接口中的变量默认即为public(公共), static(静态) and final(最终的)。

Table 3.3 shows the various combinations for the interface methods and constant declarations and how the compiler sees them.


Table 3.3 Valid declarations of interface methods and constants


Interface declarations

How the compiler interprets them

public interface Searchable {}

public abstract interface Searchable {}

abstract interface Searchable {}

abstract interface Searchable {}

interface Searchable {}

abstract interface Searchable {}

void search(String searchString);

public abstract void search(String searchString);

abstract void search(String searchString);

public abstract void search(String searchString);

public void search(String searchString);

public abstract void search(String searchString);

char MATCH_ONLY_ONE = ‘?’;

public static final char MATCH_ONLY_ONE = ‘?’;

public char MATCH_ONLY_ONE = ‘?’;

public static final char MATCH_ONLY_ONE = ‘?’;

static  MATCH_ONLY_ONE = ‘?’;

public static final char MATCH_ONLY_ONE = ‘?’;

final char MATCH_ONLY_ONE = ‘?’;

public static final char MATCH_ONLY_ONE = ‘?’;

final public char MATCH_ONLY_ONE = ‘?’;

public static final char MATCH_ONLY_ONE = ‘?’;




The order of modifiers does not matter in any variable or method declaration. For instance, the declaration public abstract static method(); is same as the abstract public static method(); . It is also the same as abstract static public method(); . By convention, however, the access modifier (if any) is written before the other modifiers.


Interfaces specify the set of methods that have to be implemented ultimately by a concrete (non-abstract class).

Abstract will specify a method which is not implemented in an abstract base class, and that must be implemented in a concrete subclass.


A side note; Values defined in an interface are public static final my default so

int VALUE = 5;

is the same as

public static final int VALUE = 5;

in an interface.


abstract Interfaces

Every interface is implicitly abstract . This modifier is obsolete and should not be used in new programs.

分享到:
评论
5 楼 gch_h 2010-12-01  
ryxxlong 写道

Interface can be declared with either public or default access . It is implicitly  abstract.
Interface methods are by default public and abstract.
Interface variables are by default public, static and final.
1.接口可以被声明为public或者默认的包访问权限.只要是接口(interface),它就隐含表明这是抽象的(abstract)的.即你写成public interface A{}其实它就等于public abstract interface A{},因为interface隐含是abstract的,所以编译器在编译时会自动加上abstract,不信的话你可以把public interface A{}反编译过来,它就会成为public abstract interface A{}了.所以abstract interface 与interface是没有区别的.
2. 你可以在接口中将方法声明为public的,但即使你不这么做,它们也是public的.同时是abstract的.也就是说方法void B()其实就是等于public abstract B(),你也可以通过反编译看一下.因为,当要实现一个接口时,在接口中被定义的方法必须被定义为是public的,否则,它们只能得到默认的包访问权限,这样在方法的继承过程中,其访问权限就被降低了,也就是说另一个包中的一个类实现了它,但因为这个方法是包访问权限,所以你无法对它进行实现,因为它对你是不可见的,所以这是java编译器所不允许的,所以它就默认是public的了.
3. 接口中的域默认是static 且是final 的.如int VALUE = 5 == static final int VALUE = 5
crabboy 写道
有区别吧:
abstract interface 的类可以extends 其他类

这句话真没看明白是啥意思.如果的意思是以为abstract interface可以extends,而interface不可以extends的话,那你完全错了,你还以为abstract interface与interface有区别.请看下面的代码:
interface IA{}
interface IB{}
interface IC extends IA{}
public interface ID extends IA,IB{
}
这是完全可以编译通过的.interface完全可以extends,并且可以同时extends多个接口,只要用逗号将接口名一一分隔即可.希望对你有帮助,如有错误,欢迎指出,再一起讨论!


你的理解是错误的!“abstract interface 的类可以extends 其他类”是指如下情况
abstract interface IC extends java.lang.Object implement I1,I2{}
extends 其他类不是extends 其他接口
我以前看过这样的代码,当时没时间注意到底为什么要这样写,现在我也想了解一下。等高人回答。
4 楼 gch_h 2010-12-01  
ryxxlong 写道

Interface can be declared with either public or default access . It is implicitly  abstract.
Interface methods are by default public and abstract.
Interface variables are by default public, static and final.
1.接口可以被声明为public或者默认的包访问权限.只要是接口(interface),它就隐含表明这是抽象的(abstract)的.即你写成public interface A{}其实它就等于public abstract interface A{},因为interface隐含是abstract的,所以编译器在编译时会自动加上abstract,不信的话你可以把public interface A{}反编译过来,它就会成为public abstract interface A{}了.所以abstract interface 与interface是没有区别的.
2. 你可以在接口中将方法声明为public的,但即使你不这么做,它们也是public的.同时是abstract的.也就是说方法void B()其实就是等于public abstract B(),你也可以通过反编译看一下.因为,当要实现一个接口时,在接口中被定义的方法必须被定义为是public的,否则,它们只能得到默认的包访问权限,这样在方法的继承过程中,其访问权限就被降低了,也就是说另一个包中的一个类实现了它,但因为这个方法是包访问权限,所以你无法对它进行实现,因为它对你是不可见的,所以这是java编译器所不允许的,所以它就默认是public的了.
3. 接口中的域默认是static 且是final 的.如int VALUE = 5 == static final int VALUE = 5
crabboy 写道
有区别吧:
abstract interface 的类可以extends 其他类

这句话真没看明白是啥意思.如果的意思是以为abstract interface可以extends,而interface不可以extends的话,那你完全错了,你还以为abstract interface与interface有区别.请看下面的代码:
interface IA{}
interface IB{}
interface IC extends IA{}
public interface ID extends IA,IB{
}
这是完全可以编译通过的.interface完全可以extends,并且可以同时extends多个接口,只要用逗号将接口名一一分隔即可.希望对你有帮助,如有错误,欢迎指出,再一起讨论!


你的理解是错误的!“abstract interface 的类可以extends 其他类”是指如下情况
interface IC extends java.lang.Object implement I1,I2{}
extends 其他类不是extends 其他接口
我以前看过这样的代码,当时没时间注意到底为什么要这样写,现在我也想了解一下。等高人回答。
3 楼 ryxxlong 2010-05-20  

Interface can be declared with either public or default access . It is implicitly  abstract.
Interface methods are by default public and abstract.
Interface variables are by default public, static and final.
1.接口可以被声明为public或者默认的包访问权限.只要是接口(interface),它就隐含表明这是抽象的(abstract)的.即你写成public interface A{}其实它就等于public abstract interface A{},因为interface隐含是abstract的,所以编译器在编译时会自动加上abstract,不信的话你可以把public interface A{}反编译过来,它就会成为public abstract interface A{}了.所以abstract interface 与interface是没有区别的.
2. 你可以在接口中将方法声明为public的,但即使你不这么做,它们也是public的.同时是abstract的.也就是说方法void B()其实就是等于public abstract B(),你也可以通过反编译看一下.因为,当要实现一个接口时,在接口中被定义的方法必须被定义为是public的,否则,它们只能得到默认的包访问权限,这样在方法的继承过程中,其访问权限就被降低了,也就是说另一个包中的一个类实现了它,但因为这个方法是包访问权限,所以你无法对它进行实现,因为它对你是不可见的,所以这是java编译器所不允许的,所以它就默认是public的了.
3. 接口中的域默认是static 且是final 的.如int VALUE = 5 == static final int VALUE = 5
crabboy 写道
有区别吧:
abstract interface 的类可以extends 其他类

这句话真没看明白是啥意思.如果的意思是以为abstract interface可以extends,而interface不可以extends的话,那你完全错了,你还以为abstract interface与interface有区别.请看下面的代码:
interface IA{}
interface IB{}
interface IC extends IA{}
public interface ID extends IA,IB{
}
这是完全可以编译通过的.interface完全可以extends,并且可以同时extends多个接口,只要用逗号将接口名一一分隔即可.希望对你有帮助,如有错误,欢迎指出,再一起讨论!

2 楼 crabboy 2010-05-19  
有区别吧:
abstract interface 的类可以extends 其他类
1 楼 sbpya 2010-05-12  
我也觉得abstract interface与interface是没有区别,之所以,有些写成abstract interface在编译时没有报错,应该是JDK为了兼容之前的1.1或更早的版本时期的代码,才不会报错,后期我们在写interface时,完全没有必要加上abstract关键字,这也是不推荐的写法,纯属脱了裤子放屁。

相关推荐

Global site tag (gtag.js) - Google Analytics