- 整理了一些Java面向对象的笔记,记录在这里 @Zeii
接口
接口类似于一种特殊的抽象类,但它不属于类。
- 语法
public interface Fortune{
}
public class Gold implements Fortune{
}
特点:
- 接口由interface声明,不再是类,不需要class
- 能继承接口的只能是接口,类可以实现接口implements
- 接口中所有变量都是全局静态常量:public static final (一般不在接口中写变量)
- 接口中所有的方法都是抽象方法,没有方法体,并且接口的所有内容都是public公共的。在声明方法时可以将public abstract省略不写
- JDK1.8之后有个新特性,在接口的方法前面加上关键字default,可以写方法体。
public interface Fortune{
void value(); // public abstract省略不写
}
接口的实现
- 因为接口所有的方法都是抽象方法,所以类在实现接口时,必须将接口的抽象方法实现(即重写)。
public class Gold implements Fortune{
// 必须实现接口的方法
public void value(){
}
}
- 接口同样具有多态性:接口可以理解为对抽象类的进一步抽象,类实现接口,和抽象类的继承基本上是一样的,同样可以向上造型。
Fortune wallet = new Gold(); // 向上造型
接口和类有什么区别
- Java中类只能单继承,即一个类只能继承一个父类;
- 但是可以实现多个接口。即单继承,多实现。
public interface manMade{ }
public interface Fortune{ }
public class Money{ }
// 单继承,多实现
public class RMB extends Money implements Forturn,manMade{ }
多态性
RMB rmb = new RMB();
Money mon = new RMB(); // 向上造型
Fortune fort = new RMB(); // 向上造型
manMade mad = new RMB(); // 向上造型
- 注意
上面创建的对象中,rmb包含了RMB中所有的方法,都可以使用;但mon只能使用Money类中的方法;fort只能使用Fortune中的方法;mad只能使用manMade中的方法。要想使用RMB中的所有方法,可以先向下转型为RMB.
RMB new_mon = (RMB) mon;
- 接口的主要作用,是把很多不相关的东西进行了整合
练习
实现两个数据库类Mysql和Oracle,根据用户的输入选择使用的数据库。
- 类图
IDAO(接口) | AbstractDao | Sql | ||
---|---|---|---|---|
connect(); add(); del(); upd(); sel(); | > | add(); del(); upd(); sel(); | > | Mysql connect(); ————— Oracle connect(); |
这是Java中非常常见的一种设计方法:
接口包含所有的方法 --> 抽象类实现一部分方法 -->最终的类重写剩下的方法
接口IDAO包含数据库的所有操作,两个数据库相同的操作抽象为AbstractDao类,其实现了接口的一部分方法,而后数据库Mysql和Oracle继承AbstractDao类,各自实现自身的connect()方法。
- 代码
public interface IDAO { // 接口
void connect();
void add();
void del();
void upd();
void sel();
}
public abstract class AbstractDAO implements IDAO {
@Override
public void add() {
System.out.println("add");
}
@Override
public void del() {
System.out.println("delete");
}
@Override
public void upd() {
System.out.println("update");
}
@Override
public void sel() {
System.out.println("select");
}
}
public class MysqlDAO extends AbstractDAO{
@Override
public void connect() {
System.out.println("Mysql connect");
}
}
public class OracleDAO extends AbstractDAO{
@Override
public void connect() {
System.out.println("Oracle connect");
}
}
// 测试
public class Client {
public static void main(String[] args) {
System.out.println("选择你要使用的数据库(1,Mysql 2,Oracle):");
Scanner scn = new Scanner(System.in);
int in = scn.nextInt();
IDAO db = null; // 声明
if(in == 1) {
db = new MysqlDAO();
}else if(in == 2) {
db = new OracleDAO();
}else {
System.out.println("输入有误!");
}
db.connect();
db.add();
db.del();
db.upd();
db.sel();
}
}
这样做代码结构层次分明,重复代码抽象化,减少了代码量。同时代码具有很高的可扩展性,如果加入新的数据库,只需要从AbstractDao继承,实现自己的connect()方法即可。