测试类:
package cn.jbit.test;
import cn.jbit.homeletter.HomeLetter;
import cn.jbit.homeletter.HomeLetterWriter;
import cn.jbit.homeletter.impl.HomeLetterImpl;
/**
* 测试类
*
* @author kyaccp
*
*/
public class HomeLetterTest {
/**
* 程序的入口
*
* @param args
* 输入参数
*/
public static void main(String[] args) {
// 创建一个实现家书对象
HomeLetter letter = new HomeLetterImpl();
// 调用按照约定格式书写方法
HomeLetterWriter.write(letter);
}
}
接口类:
package cn.jbit.homeletter;
/**
* 家书接口
*
* @author kyaccp
*
*/
public interface HomeLetter {
/**
* 书写称谓
*/
public void writeTitle();
/**
* 书写问候
*/
public void writeHello();
/**
* 书写内容
*/
public void writeBody();
/**
* 书写祝福
*/
public void writeGreeting();
/**
* 书写落款
*/
public void writeSelf();
}
package cn.jbit.homeletter;
/**
* 家书写手
*
* @author kyaccp
*
*/
public class HomeLetterWriter {
/**
* 按照约定格式书写家书
*
* @param letter
*/
public static void write(HomeLetter letter) {
letter.writeTitle(); // 书写称谓
letter.writeHello(); // 书写问候
letter.writeBody(); // 书写内容
letter.writeGreeting(); // 书写祝福
letter.writeSelf(); // 书写落款
}
}
实现类:
package cn.jbit.homeletter.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import cn.jbit.homeletter.HomeLetter;
/**
* 实现家书接口
*
* @author kyaccp
*
*/
public class HomeLetterImpl implements HomeLetter {
/**
* 书写称谓
*/
public void writeTitle() {
System.out.println("亲爱的爸爸、妈妈:");
}
/**
* 书写问候
*/
public void writeHello() {
System.out.println(" 你们好吗?\n");
}
/**
* 书写内容
*/
public void writeBody() {
System.out.println(" 我在这里挺好的。");
System.out.println(" 您二老保重身体啊!");
}
/**
* 书写祝福
*/
public void writeGreeting() {
System.out.println(" 此致\n敬礼");
}
/**
* 书写落款
*/
public void writeSelf() {
String date = new SimpleDateFormat("yyyy年MM月dd日").format(new Date());
System.out.println("\t\t小明\n\t" + date);
}
}
接口基础知识
[修饰符] interface 接口名 extends 父接口1,父接口2,……{
常量定义
方法定义
}
class 类名 extends 父类名 implements 接口1,接口2,……{
类的内容
}
说明如下。
接口和类、抽象类是一个层次的概念,命名规则相同。如果修饰符是public,则该接口在整个项目中可见。如果省略修饰符,则该接口只在当前包可见。
接口中可以定义常量,不能定义变量。接口中属性都自动用public static final修饰,即接口中属性都是全局静态常量。接口中的常量必须在定义时指定初始值。
public static final int PI=3.14;
int PI=3.14; //在接口中,这两个定义语句效果完全相同
int PI; //错误 !在接口中必须指定初始值,在类中会有默认值
接口中所有方法都是抽象方法。接口中方法都会自动用public abstract修饰,即接口中只有全局抽象方法。
和抽象类一样,接口同样不能实例化,接口中不能有构造方法。
接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
一个类只能有一个直接父类,但可以通过implements实现多个接口。类必须实现接口的全部方法,否则必须定义为抽象类。类在继承父类的同时又实现了多个接口时,extends必须位于implements之前。
接口中属性都是全局静态常量,接口中方法都是全局抽象方法,接口中没有构造方法。
类只能继承一个父类,但可以实现多个接口。一个类要实现接口的全部方法,否则必须定义为抽象类。Java通过实现接口达到了多重继承的效果。
接口表示一种约定,接口表示一种能力,接口体现了约定和实现相分离的原则。
通过面向接口编程,可以降低代码间的耦合度,提高代码的可扩展性和可维护性。
面向接口编程意味着:开发系统时,主体构架使用接口,接口构成系统的骨架,这样就可以通过更换实现接口的类来更换系统的实现。