java 抽象类与接口
抽象类当基类比较抽象的时候一些函数就无法实现。比如动物类,你可以知道猫如何叫狗如何叫,但你无法说清动物如何叫,于是对于比较抽象的基类,其中的一些方法可以只声明,不实现。这样的方法叫做抽象方法,含有抽象方法的类叫做抽象类。抽象方法和抽象类需要用关键字abstract来标识。 含有抽象方法的类的对象是不安全的,因此java中不允许创建抽象类的对象。 对于一个不含有抽象方法的类也可以设为抽象类,这样,就能限制这个类不能产生对象了。 接口当一个类足够抽象,将不会实现任何方法。接口(interface)是一个完全抽象的类,不提供任何具体实现。 接口同类一样有public和默认(包)访问权限。 接口中的域默认是static和final的 接口中的方法默认是public的,所以继承的时候注意实现的时候要声明为public。 接口的用处和抽象类看起来并不相同。比如上面说的抽象基类动物类,动物会叫,继承类包括猫狗。但是汽车,电视都会“叫”,却并不合适继承,这时一个“声音”接口就比较合适。 接口的多重继承Because an interface has no implementation at all—that is,there is no storage associated with an interface—there’s nothing to prevent many interfaces from being combined.
A { B { <span style="color: #0000ff;">class C <span style="color: #0000ff;">implements<span style="color: #000000;"> A,B {
@Override <span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> f() { System.out.println("f()"<span style="color: #000000;">); } } <span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Test { 2、如果两个方法名字相同参数列表不同,会实现重载。 A { f( B { <span style="color: #0000ff;">class C <span style="color: #0000ff;">implements<span style="color: #000000;"> A,B {
@Override <span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> f() { System.out.println("f()"<span style="color: #000000;">); } @Override <span style="color: #0000ff;">public <span style="color: #0000ff;">void f(<span style="color: #0000ff;">int<span style="color: #000000;"> x) { System.out.println("f(" + x + ")"<span style="color: #000000;">); } } <span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Test {
A { B { <span style="color: #0000ff;">class<span style="color: #000000;"> C {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> f() { System.out.println("f()"<span style="color: #000000;">); } } <span style="color: #0000ff;">class D <span style="color: #0000ff;">extends C <span style="color: #0000ff;">implements<span style="color: #000000;"> A,B { <span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Test { ?
<div class="cnblogs_code"> A {
C++中存在菱形继承的问题。
?java虽然不存在类的多重继承,但是存在接口多重继承。考虑下面的代码 F { S1 F { S2 F { T S1,S2 { <span style="color: #0000ff;">class Fo <span style="color: #0000ff;">implements<span style="color: #000000;"> T {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void f() { System.out.println("f"<span style="color: #000000;">); } <span style="color: #0000ff;">public <span style="color: #0000ff;">void s1() { System.out.println("s1"<span style="color: #000000;">); } <span style="color: #0000ff;">public <span style="color: #0000ff;">void s2() { System.out.println("s2"<span style="color: #000000;">); } <span style="color: #0000ff;">public <span style="color: #0000ff;">void t() { System.out.println("t"<span style="color: #000000;">); } } <span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Diamond { 其实由上面的讨论也可以想到这完全不会有问题。因为java的接口根本不提供具体实现。这也是Java设计单一继承和接口的原因。 ?接口中的域定义时即要初始化,可以是被非常量的表达式初始化。 i = 0;
j = k = j * 10
这些域不是接口的一部分,它们的值被存储在该接口的静态存储区域内。 ?配适器设计模式某个现有的类的接口和需求不同,可以通过实现某个接口达到要求。(因为《thinking in java》提到所以稍微看了一下。。理解浅显。。 一般都是用插头举例,如果插头型号不合适就在外面在套一个转换插头实现工作。(原谅我是在写不出符合逻辑的例子。。。。。
AImplementsB A
举个实际的用处。Scanner的构造器接受的是一个Readable接口,也就是说只要一个类实现了Readable接口,就可以使Scanner作用于它。 Readable接口中只有一个方法public int read(CharBuffer arg0);在read内部将输入内容添加到CharBuffer参数中,返回添加或者没有输入返回-1。 <span style="color: #0000ff;">public <span style="color: #0000ff;">class RandomWords <span style="color: #0000ff;">implements<span style="color: #000000;"> Readable {
<span style="color: #0000ff;">private <span style="color: #0000ff;">static Random rand = <span style="color: #0000ff;">new<span style="color: #000000;"> Random(); <span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">final <span style="color: #0000ff;">char[] capitals = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"<span style="color: #000000;">.toCharArray(); <span style="color: #0000ff;">private <span style="color: #0000ff;">int count = 0<span style="color: #000000;">; <span style="color: #0000ff;">public RandomWords(<span style="color: #0000ff;">int<span style="color: #000000;"> count) { <span style="color: #0000ff;">this.count =<span style="color: #000000;"> count; } @Override <span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> read(CharBuffer cb) { <span style="color: #0000ff;">if (count-- == 0) <span style="color: #0000ff;">return -1<span style="color: #000000;">; cb.append(capitals[rand.nextInt(capitals.length)]); cb.append(" "<span style="color: #000000;">); <span style="color: #0000ff;">return 1<span style="color: #000000;">; } <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) { Scanner in = <span style="color: #0000ff;">new Scanner(<span style="color: #0000ff;">new RandomWords(10<span style="color: #000000;">)); <span style="color: #0000ff;">while<span style="color: #000000;"> (in.hasNext()) { System.out.print(in.next() + ","<span style="color: #000000;">); } in.close(); } } 接口可以嵌套在其他类或接口中。 private 或 public 或 默认访问权限 都可以。 没弄明白什么用ing。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |