您的位置:首页 > 编程语言

更好的针对接口编程,使用接口内部类

2017-08-01 21:53 295 查看
首先第一句话“针对接口编程,而不是针对实现编程”,这句话大家应该经常看到或者听到,但是也有很多人不理解这句话到底是什么意思。

“针对接口编程”真正的意思是“针对 超类型 编程”,因为这样做程序就更加具有弹性
这句话说的更直白一些就是“变量的声明类型最好是超类型,通常是一个抽象类或者接口,这样只要是实现了这个超类型的类的对象都可以指定给这个对象


下面举两个例子分别是 针对实现编程和针对接口编程: 我们的目的想要狗叫一声

1. Dog dog = new Dog();

dog.bark();

这样我们就实现了我们的目的,我们的目的让狗叫一声,我们new一个狗,调用的他bark()方法,然后狗叫了,但是这样有一点不好就是,硬编码导致代码死板,比如我们现在还想要猫、老虎、狮子、大象、鸟。。。都叫,我们就需要些 2*n行代码,而且几乎都是重复的。

2.针对接口编程——针对超类型编程

现在的类型有 猫、老虎、狮子、大象、鸟、狗,那他们的超类型(父类,接口)是什么呢?是Animal 没错吧,现在这个Animal的声明方式有三种:具体的父类、抽象父类、接口。 他们三个的优先选择顺序为:接口——抽象父类——具体父类,这里我就不解释为什么是这个顺序了,不够后面会说明为什么接口>抽象类。

我们把Animal定义成接口

interface Animal{
void makeSound();
}


然后我们让 所有的动物都实现这个接口

Class Dog implements Animal{
makeSound(){
bark();
}
viod bark(){......};
}


Animal a = new Dog();
a.makcSound();


这里我们没有针对让狗叫而编程,而是针对狗的超类型Animal而编程。

为什么使用接口而不使用抽象类?

答:因为java不支持多继承,但是支持接口的多实现。

但是如果我们使用接口的化有一点不足的地方就是,接口内部不能有任何实现。

所有的动物都是呼吸,而且呼吸都一样,如果用接口的化我们的每一个实现都要重写 呼吸方法,而且方法的代码还一模一样,这就导致了代码重复问题,那怎么解决这个问题呢?这就到了文章的主题上了。

接口内部类:

正常情况下,不能在接口内放置任何代码,但是接口内部静态类可以作为接口的一部分,接口内部的任何东西都会自动的是public 和static,更好和我们的静态内部类符合

public interface MyInstace {

void show();

class Test1 implements MyInstace {

@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("我是接口内部类的方法");
}

public static void main(String[] args) {
new Test1().show();
}

}
}


输出结果


这样我们完全可以正确运行,这样之后我们就可以让我们所以MyInstace接口的实现类都拥有静态内部类的show()方法

public class Test implements MyInstace {

public static void main(String[] args) {
Test test = new Test();
new Test.Test1().show();
}

@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("我是实现类");

}

}


输出结果 :



当然使用静态内部类还有一个好处就是,每个类中都写有一个main()方法,用来测试这个类,这样做的缺点就是,那些代码必须带着已经编译过的额外代码,我们可以这样做

public class Test {

public void f(){
System.out.println(" f()");
}

public static class TestClass {

public static void main(String[] args) {
Test test = new Test();
test.f();
}
}

}


输出结果:



这样做会独立生成一个TestTestClass的类,可以使用这个测试,但是在产品发布的时候将TestTestClass.class文件删除即可。

以上内容来自《JAVA编程思想》和《Head First 设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息