java中类和接口的一点整理

java中类和接口的一点整理

Table of Contents

1 引言

刚开始接触java的时候,也是第一次接触面向对象的思想。对于java中的继承,多态等概念非常模糊,在实际编程的时候也没有怎么用到。有了一段时间的项目经历加上阅读相关书籍,其他开源框架代码后的源码后就稍微有了点认识。这里稍微整理下,有不正确的方法还请大家指正,谢谢。

2 接口

 

2.1 定义

在说接口之前,先说下抽象方法。抽象方法指得是没有任何实现的方法,只是一个空的方法体,一般用abstratc修饰词修饰。如下所示:

abstract void function();

而接口中的方法全部都是抽象方法,如果接口中还有变量定义,那么那么变量默认是final static类型的,接口中还可以含有内部类。

2.2 使用

  • 除了接口定义之外地一些琐碎的整理都放在这个地方了。一直不是很明白sun设计接口的初衷是什么,但是感觉有了接口以后,整个项目的设计就会非常的清晰。接口可以继承于另外一个接口,可以被其他很多类实现。
  • 一个类要实现一个接口,那么必须实现这个接口中的所有方法。这也意味着一个接口如果被很多类实现了,那么这些类中都会对这个接口有不同的实现。这样就可以在类中把一些事务共有的特性给抽象出来了。比如在《thinking in java》中的一个比较好理解的例子。所有的形状圆形,矩形,菱形等都有不同的计算周长和面积的方法,那么就可以定义一个形状接口,里面有周长和面积等抽象方法,让不同的类来实现。如图所示:
  • 接口中的方法默认是用public abstract来修饰的,所以某个接口被实现后,实现的方法也必须由public来修饰。
  • 接口的定义特别适合用来体现java中的多态性,因为java中有向上转型的概念。例如上面的例子中,可以定义一个形状接口的对象,但是具体可以有不同的类来实例化,如下所示:
Shape circle=new Circle();
Shape square=new Square();
...

如果一个类实现了非常多的接口,那么它可以向上转型成任意一个类型。

3

类中有些比较特殊的类型,列举如下

3.1 抽象类

抽象类被abstract关键词修饰,和接口一样不能被直接实例化。抽象类中可以包含抽象方法,当然也可以不含有任意的抽象方法,这样可以使得该类不被实例化。而接口可以看做是一种特殊的抽象类,里面的方法全部都是抽象方法。
抽象方法可以看成是接口的部分实现。比如说上面的形状的例子中,可以定义不规则形继承于形状,但是只实现里面的计算周长的方法,不实现里面的计算面积的方法。如下图所示:

3.2 内部类

内部类按照字面意思就可以知道,存在于一个类的内部。它和普通类的区别不仅是存在的位置不一样,而且内部类还可以被关键词private和static修饰。 内部类的存在,总结了下它的作用:

  • 可以被修饰为private,从而隐藏了其实现细节,不能被外面的对象访问。
  • 内部类可以对其封装类所有元素拥有访问权限
  • 内部类在GUI中很有用,用于控制框架的应用。 还有别的一些功能暂时还不知道。

内部类按照类型又可以分成好几类,如:

  • 内部匿名类
  • static内部类
  • 内部类存在于控制块中

等等,内部类也可以在其他类中被继承,不过必须明确地指定,如下所示1

// Proper inheritance of an inner class
class Egg2 {
  protected class Yolk {
    public Yolk() {
      System.out.println("Egg2.Yolk()");
    }
    public void f() {
      System.out.println("Egg2.Yolk.f()");
    }
  }
  private Yolk y = new Yolk();
  public Egg2() {
    System.out.println("New Egg2()");
  }
  public void insertYolk(Yolk yy) { y = yy; }
  public void g() { y.f(); }
}
public class BigEgg2 extends Egg2 {
  public class Yolk extends Egg2.Yolk {
    public Yolk() {
      System.out.println("BigEgg2.Yolk()");
    }192
    public void f() {
      System.out.println("BigEgg2.Yolk.f()");
    }
  }
  public BigEgg2() { insertYolk(new Yolk()); }
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
} 

Footnotes:

1 :《think in java 第四版》,191-192

Date: 2012-05-09 17:53:43

Author:

Org version 7.8.09 with Emacs version 23

Validate XHTML 1.0
原文地址:https://www.cnblogs.com/csophys/p/2492189.html