Java接口的理解

好久没有写博客了,最近真的是太忙了,没有时间写呀。补充一点,寒假在家里看Thinking in Java,但是看到一半时就发现真的是看不懂了,然后就一直停在那里没什么显著的进展了,最近上课老师讲了Java的一些东西,发现以前的理解真的是没理解。以前的博客学习笔记真的是没什么含金量,但那也是个学习的过程,就不删除了吧,毕竟那也是我的学习的一个过程,废话不多说了,写点关于接口的理解吧。


interface貌似与class平级,都会生成.class文件。在接口中要声明方法,但不可给出具体的实现,这一点与抽象类不同,要想使用接口就必须要有类实现接口(这么说似乎也不对,如果我仅仅无聊地在接口中定义了一些变量呢,这些变量都是自动static和final的,那我下面是不是就可以使用这些变量呢?!是的,其实这是在Java SE5中实现C++的enum的具有相同效果的唯一途径(书上写的),以前的人就是这么干的!),实现了接口中的方法,接口才可以被使用。

一个引用被声明为接口类型,这是不是就相当于向上转型呢,然后接下来一句就应该是调用子类的方法吧(抽象类里是这么说的吗?)。代码的可扩展性就强了,这真是极好的。

一个类继承另一个类,实现一些接口,就多重继承了,似乎比C++机制要好那么一丢丢。当然,我们也可以用接口继承接口(接口真的和类是同级的吗?),然后接口就被扩展了。适配接口,这里有个很好的例子:

package interfaces;
//thingking in java P182
//: interfaces/RandomWords.java
// Implementing an interface to conform to a method.
import java.nio.*;
import java.util.*;

public class RandomWords implements Readable {
  private static Random rand = new Random(47);
  private static final char[] capitals =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  private static final char[] lowers =
    "abcdefghijklmnopqrstuvwxyz".toCharArray();
  private static final char[] vowels =
    "aeiou".toCharArray();
  private int count;
  public RandomWords(int count) { this.count = count; }	
  public int read(CharBuffer cb) {
    if(count-- == 0)
      return -1; // Indicates end of input
    cb.append(capitals[rand.nextInt(capitals.length)]);
    for(int i = 0; i < 4; i++) {
      cb.append(vowels[rand.nextInt(vowels.length)]);
      cb.append(lowers[rand.nextInt(lowers.length)]);
    }
    cb.append(" ");
    return 10; // Number of characters appended
  }
  public static void main(String[] args) {
    Scanner s = new Scanner(new RandomWords(10));
    while(s.hasNext())
      System.out.println(s.next());
  }
} /* Output:
Yazeruyac
Fowenucor
Goeazimom
Raeuuacio
Nuoadesiw
Hageaikux
Ruqicibui
Numasetih
Kuuuuozog
Waqizeyoy
*///:~

太漂亮了!Scanner的构造方法要求的参数是Readable(接口,这个接口为Scanner而生)的,我们就实现这个接口,然后就可以作为Scanner的参数了,漂亮!


接口与工厂,增加了间接性,似乎是无用,但这似乎增加了代码的复用性,未尝不好,但这是不是值得?这一点我还没有考虑清楚。

package interfaces;

//: interfaces/Factories.java
import static net.mindview.util.Print.*;

interface Service {
  void method1();
  void method2();
}

interface ServiceFactory {
  Service getService();
}

class Implementation1 implements Service {
  Implementation1() {} // Package access
  public void method1() {print("Implementation1 method1");}
  public void method2() {print("Implementation1 method2");}
}	

class Implementation1Factory implements ServiceFactory {
  public Service getService() {
    return new Implementation1();
  }
}

class Implementation2 implements Service {
  Implementation2() {} // Package access
  public void method1() {print("Implementation2 method1");}
  public void method2() {print("Implementation2 method2");}
}

class Implementation2Factory implements ServiceFactory {
  public Service getService() {
    return new Implementation2();
  }
}	

public class Factories {
  public static void serviceConsumer(ServiceFactory fact) {
    Service s = fact.getService();
    s.method1();
    s.method2();
  }
  public static void main(String[] args) {
    serviceConsumer(new Implementation1Factory());
    // Implementations are completely interchangeable:
    serviceConsumer(new Implementation2Factory());
  }
} /* Output:
Implementation1 method1
Implementation1 method2
Implementation2 method1
Implementation2 method2
*///:~

对于任何的类,都可以创建一个接口加一个工厂,但是如果是不必要的增加这种抽象性是不值得的。如果能用类顺利解决问题,那就用类,除非是接口的必需性很明确。
有人说:接口很好,但容易被滥用!
修改以前的学习笔记去!
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值