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

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

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

下面举两个例子分别是 针对实现编程和针对接口编程: 我们的目的想要狗叫一声
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();
    }
  }

}

输出结果:
这里写图片描述

这样做会独立生成一个Test TestClass使Test TestClass.class文件删除即可。

以上内容来自《JAVA编程思想》和《Head First 设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值