Intro

面向对象的核心概念包含封装,继承,多态。

封装,又称 information hiding, 在我们设计车子和接口的时候不必告诉用户细节,只需要告诉他们怎么用就行了;但是一些像方向盘一类的东西不能被隐藏。

抽象的过程告诉你应该集中于描述是什么而不是怎么做。

注释非常重要,在工作中我们可能会反复修改,先确定 interface 后注释写下大致功能完成具体实现后回头再看看修改注释完善上交给老板。


Comments

工业设计中一律使用 Javadoc 写注释,每个 public class 或者 public method 前都需要用 /** 开始 */ 结束的注释,在其中的 @ 是作为标签的意思,比如说 @param 表示以下 method 里的一个参数,@return 代表一个 return 值,@throws 代表一个异常。Javadoc 可以被生成一个 html 的前端界面作为一个说明书给别人看。

Precondition

那么在我们一开始写程序的时候要考虑到先决条件,对方的 input 和可能产生的 result 是什么,需要考虑到输入的参数必须返回 true. 比如说一个求平方根的公式,我们需要提前考虑到 x >= 0 作为先决条件。

Postcondition

后置条件就是我们描述输出的时候了,如果有 return value, 那么我们就描述那个 value, 如果是 void 方法那就描述在我们 call 这个方法的时候会发生什么变化。但是无论是 Pre 还是 Post, 我们都不会探讨具体的 how, 只是在讨论一种状态。

后置条件在这里有个弊端就是在其中运行的过程中可能会抛出异常,我们脑子里想的后置条件可能和实际情况有所不同。

Responsibility

也就是职责,我们需要详细描述可能发生的情况例如:

/** Computes the square root of a number 
    @param x A real number
    @return The square root of x if x >= 0
    @throws AritheticException if x < 0
*/

Assert

断言在 Java 语言中用于表达一些事实,同理我们也可以在注释中书写;验证是不是事实,如果正确不会返回任何内容,如果违反事实会直接报错。

assert sum > 0
// Assertion: sum > 0
assert sum > 0 : sum;
// 这里的 sum 是一个用于验证的数值比如 -5, 就会报错

在 Java 中 assert 语句是一种高效的验证逻辑是否错误的方法,用于程序员查找错误使用,在部署后不应该存在于程序中除非对方有特殊要求,更不应该认为其可以取代 if 语句。


Java Interface

接口界面,我们常说的 application program interface, api 就是该意思, 他是程序的组件之一,里面有所有的 public methods 和被定义了的 public named constants, 详细的使用注释。

而任何调用了这个接口的实例叫 client, 当我们为的接口写成详细细节的那个过程,叫 the class implements the interface. 我们可以自己写接口,也可以用 Java 官方给出的已经写好了的接口。最后要记住接口文件和实例 class 是两个不同的分开文件。

以下是一个接口例子。

/** An interface for methods that return 
    the perimeter and area of an object.
*/
public interface Measurable
{
    /** Gets the perimeter 
        @return The perimeter. */
    public double getPerimeter();

    /** Gets the area.
        @return The area. */
    public double getArea();
} // end Measurable

接口文件是个书写注释的好地方,告诉人们 pre post 以及 purpose, 以及别忘了接口必须要是 public methods. 接口中的方法不可以是 static 和 final 形式,但是如果想要用那种方法可以在导包后自己的实现文件中申明。上面的接口示例中的名字 Measurable 其实并不规范,一般使用 “NameInterface” 这样子。


Java Implement

在我们实例的过程中必须要声明是实例了哪个接口例如

/** 我们为 Measurable 接口写两个实例化, 在这里我们详细实现方法里的内容 */
public class Circle implements Measurable
public class Square implements Measurable
// 然后客户对其调用
public class Client 
{
    Measurable aCircle;
    Measurable aSquare;
    aCircle = new Circle();
    aSquare = new Square();
}

在继承中我们为了防止混乱无法多继承但是我们可以多实例化。

// 先继承 Shape class 再实例化两个接口
public class Circle extends Shape implements Measurable, Circular
public void giveLastNameTo(NameInterface aName)
// 同时在参数中接口也能被当作一个数据类型,但是传参的数据必须是像 Circle 这样的实例化了的 class

接口类型是一个引用类型。

NameInterface myName;
myName = new Name("Coco","Puffs");
myName = new AnotherName("April","MacIntosh");
// Use myName.getFirst() returns result

作为一个接口,你可以多项继承其他的接口.

// 这里有个接口叫 Nameable 
public interface Nameable
{
    public void setName(String petName);
    public String getName;
}

// 开始逐渐多项继承

public interface Callable extends Nameable
{
    public void come(String petName);
}

public interface Trainable extends Callable, Capable
{
    public void sit();
    public void speak();
    public void lieDown();
}

在 Java 编程里 class 并不能多项继承 class 但是 interface 可以。

Java Interface public constants

接口内容必须公共,变量也可以在接口中用 final 声明。

public interface ConstantsInterface
{
    public static final double INCHES_PER_CENTIMETER = 0.392312;
    public static final double FEET_PER_METER = 3.23232;
    public static final double MILES_PER_KILOMETER = 0.62137199;
}

public class Demo implements ConstantsInterface
{
    public static void main(String[] args)
    {
        System.out.println(FEET_PER_METER);
        System.out.println(ConstantsInterface.MILES_PER_KILOMETER);
    }
}

在 Java 中到底是把变量声明在 class 里还是接口里呢?constant definitions 是一个实施的过程,而在接口里我们一般就是声明下公共的方法;所以如果按照规范来说我们一般把变量在 class 中声明,interafce 只用来声明公共方法。

public class Constants 
{
    private Constants()
    {
    } // end private default constructor
    public static final double INCHES_PER_CENTIMETER = 0.392312;
    public static final double FEET_PER_METER = 3.23232;
    public static final double MILES_PER_KILOMETER = 0.62137199;
    // 由于每一个 constant 都是不同的个体,防止被 reference 直接用 static 加快运行效率,加了 private 构建函数这样以来用户无法再实例化。
}

public class Demo
{
    public static void main(String[] args)
    {
        System.out.println(Constants.FEET_PER_METER);
        System.out.println(Constants.MILES_PER_KILOMETER);
    }
}
// 这样的 Constants. 会让别的程序员更加清晰的了解你的程序,当然会比较繁琐,我们只需要以下这样做

final double FEET_PER_METER = Constants.FEET_PER_METER;