2,简单框架回顾:
下面介绍几种常用的框架结构(第二种框架结构实际上是第一种框架结构的变体,为了对比,分开来说) 2.1,第一种框架结构:既继承抽象类,又实现接口(接口是一种特殊的抽象类)的框架结构:
2.1.1,接口:
public interface IApi {
public void add();
public void remove();
public void update();
}
2.1.2,抽象类
public abstract class AApi {
public abstract void testAdd();
public abstract void testRemove();
public void testUpdate() {
System.out.println("AApi/testUpdate");
}
}
2.1.3,实现类
public class ApiImpl extends AApi implements IApi {
//第一种情况:用抽象类来声明,用该抽象类的子类来创建实例对象
public static void main(String[] args) {
//用抽象类AApi声明,而用子类ApiImpl创建实例对象,该实例对象mIApi只能调用抽象类AApi里面的方法(子类ApiImpl新增的方法testIpml()不能调用,也不能调用接口里的方法),否则编译报错:The method testIpml() is undefined for the type AApi
AApi mIApi = new ApiImpl();
mIApi.testUpdate();
mIApi.testIpml();//编译报错
}
//第二种情况:用接口来声明,用该接口的实现类创建实例对象
public static void main(String[] args) {
//用接口IApi声明,而用实现类ApiImpl创建实例对象,该实例对象mIApi只能调用接口IApi里面的方法(实现类ApiImpl新增的方法testIpml()不能调用,也不能调用抽象类AApi里面方法),否则编译报错:The method testIpml() is undefined for the type AApi,现象同第一种情况,因为接口就是一种特殊的抽象类。
IApi mIApi = new ApiImpl();
mIApi.add();
mIApi.testIpml();//编译报错
}
//第三种情况:用抽象类的子类(或接口的实现类)来声明,用该抽象类的子类(或该接口的实现类)创建实例对象
public static void main(String[] args) {
//用子类(或实现类)ApiImpl来声明,子类(或实现类)ApiImpl创建实例对象,该实例对象mIApi既可以调用抽象类里面的方法又可调用接口里面的方法,也可调用自己新增的方法testIpml()。
ApiImpl mIApi = new ApiImpl();
mIApi.add();
mIApi.testUpdate();
mIApi.testIpml();
}
public void testIpml() {
System.out.println("ApiImpl/testIpml");
}
@Override
public void testAdd() {
System.out.println("ApiImpl/testAdd");
}
@Override
public void testRemove() {
// TODO Auto-generated method stub
System.out.println("ApiImpl/testRemove");
}
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("ApiImpl/add");
}
@Override
public void remove() {
// TODO Auto-generated method stub
System.out.println("ApiImpl/remove");
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("ApiImpl/update");
}
}
根据上述Demo总结:
(1)、凡是用抽象类或接口声明的实例对象,该实例对象只能调用该抽象类或该接口里面定义的方法,不在该抽象类或接口里面定义的方法,一律不能调用,否则编译报错。
(2)、用子类或实现类声明的实例对象,既可以调用抽象类里面定义的方法又可调用接口里面定义的方法,也可调用自己新增的方法。
(3)、抽象类或接口都不能直接用本身实例化自己,如下,都会编译报错:
AApi mIApi = new AApi();//编译报错:Cannot instantiate the type AApi
IApi mIApi = new IApi();//编译报错:Cannot instantiate the type IApi 由此可见,对于抽象类(或接口)只能通过子类(或实现类)来实例化。
2.2,第二种框架结构:首先抽象类实现接口,然后继承抽象类(实际上是第一种框架结构的变体,不建议使用这种方式)
对上面Demo进行变换下,如下:
2.2.1,接口:
public interface IApi {
public void add();
public void remove();
public void update();
}
2.2.2,抽象类(实现接口):实现部分接口方法,其他接口方法子类必须给与实现。
public abstract class AApi implements IApi {
public abstract void testAdd();
public abstract void testRemove();
public void testUpdate() {
System.out.println("AApi/testUpdate");
}
@Override
public void add() {//接口方法
// TODO Auto-generated method stub
}
}
2.2.3,子类(继承抽象类)
public class ApiImpl extends AApi {
public static void main(String[] args) {
}
public void testIpml() {
System.out.println("ApiImpl/testIpml");
}
@Override
public void testAdd() {
System.out.println("ApiImpl/testAdd");
}
@Override
public void testRemove() {
// TODO Auto-generated method stub
System.out.println("ApiImpl/testRemove");
}
@Override
public void remove() {//接口方法
// TODO Auto-generated method stub
}
@Override
public void update() {//接口方法
// TODO Auto-generated method stub
}
}
2.3,第三种框架结构:仅继承抽象类(效果等同于第二种框架结构,一般采用这种方式)
2.3.1,抽象类:
public abstract class AApi {
public abstract void testAdd();
public abstract void testRemove();
public abstract void add();
public abstract void remove();
public abstract void update();
public void testUpdate() {
System.out.println("AApi/testUpdate");
}
}
2.3.2,子类:
public class ApiImpl extends AApi {
public static void main(String[] args) {
}
public void testIpml() {
System.out.println("ApiImpl/testIpml");
}
@Override
public void testAdd() {
System.out.println("ApiImpl/testAdd");
}
@Override
public void testRemove() {
// TODO Auto-generated method stub
System.out.println("ApiImpl/testRemove");
}
@Override
public void add() {
// TODO Auto-generated method stub
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}
2.4,第四种框架结构:仅实现接口
2.4.1,接口:
public interface IApi {
public void add();
public void remove();
public void update();
}
2.4.2,实现类:
public class ApiImpl implements IApi {
public static void main(String[] args) {
}
public void testIpml() {
System.out.println("ApiImpl/testIpml");
}
@Override
public void add() {
// TODO Auto-generated method stub
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
@Override
public void update() {
// TODO Auto-generated method stub