接口是定义了一些方法,但本身并没有实现他,会根据需要用不同的类来实现他。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口是定义了一些方法,但本身并没有实现他,会根据需要用不同的类来实现他。相关的知识,希望对你有一定的参考价值。
接口是定义了一些方法,但本身并没有实现他,会根据需要用不同的类来实现他。
有接口a类
package demo;
public interface a
public void println();
public String test(String str);
类b和类c来实现接口a类
package demo;
public class b implements a
public void println()
System.out.println("bbbbb");
public String test(String str)
return str;
;
package demo;
public class c implements a
public void println()
System.out.println("ccccc");
public String test(String str)
return str;
;
假如我是客户,我只知道接口里的方法,我要用接口的话,怎么用?
是这样用吗:
package demo;
public class d implements a
public void println()
System.out.println("dddd");
public String test(String str)
return str;
;
package demo;
class e
d dd = new d();
dd.text("dddd");
如果是这样用的话,那b类和c类就没有用到啊,这样实现类a又是什么意思呢?不实现类a自己写方法不也一样吗?
package demo;
import demo.a;
class f
a aa = null;
aa.text("ffff");
这样写的对吗?我测试的有错,是空指针。
如果我调用接口里的test(String str)方法,他是去执行b类里的这个方法还是去执行c类里的这个方法。
那我直接
d dd = new d();
dd.println();
dd.text("dddd");
那还new 一个接口的对象干嘛
假如我给其他人接口a里面的方法的话,还用给b类和c类里面的方法吗。
List list = null;
list.size();
就可以用了,我
a aa = null;
aa.text("aaa");
怎么就出错呢?
==========================================
假如我给其他人接口a里面的方法的话,还用给b类和c类里面的方法吗。
是这样给吗
接口a
方法
println();
text(String str);
类b
println();
text(String str);
类c
println();
text(String str);
在这里,他怎么用我的接口呢,给写个例子。
a aa = new d();//可以换成其它的实现,比如 new b(); new c();
a.println();
a.text("ffff");
看接口不能静态的看它
1、接口可以封装底层实现的变化
你知道Line, Circle 都是Shape,而在Shape这个接口中,你定义了所有你需要的操作,这样你就可以不管Shape是Line,还是Circle,而只需要他是Shape,就可以操作了
这样对客户端就封装了底层实现的变化
2、接口有利于系统的扩展
同样是上面的例子,因为对客户端,你开放的只是 Shape的接口,当你的Shape有增加或变化的时间,你不需要通知客户端
在OO的设计中重要的一条就是对接口编程而不是对实现编程
因为有了接口才有了多态,多重继承
有了多态才有了灵活的动态绑定。
其实可以这么说:有了接口(抽象)才有了OO
你可以取百度搜下 为什么用接口 java
---------------------------------
别人只能调用接口的方法,你说的“给”的意思如果是指把b和c的class文件拷贝过去的话,是要给的
List list = null;
list.size();
运行时会包空指针异常的(刚试过)
16-抽象类及接口
抽象类 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。这个抽象方法无法执行,因此这个类也必须申明为抽象类(abstract class) 抽象类本身被设计是只能用于被继承,强迫子类实现其定义的抽象方法。因此,抽象方法实际上相当于定义了“规范”。 //Person类定义了抽象方法run(),那么,在实现子类Student的时候,就必须覆写run()方法 public class Main public static void main(String[] args) Person p = new Student(); p.run(); abstract class Person public abstract void run(); class Student extends Person @Override public void run() System.out.println("Student.run"); 注意:父类Person的run()方法没有实际意义,也不能去掉父类的run()方法。去掉父类的run()方法,就失去了多态的特性。 面向抽象编程 当我们定义了抽象类Person,以及具体的Student、Teacher子类的时候,我们可以通过抽象类Person类型去引用具体的子类的实例,这种引用抽象类的好处在于,我们对其进行方法调用,并不关心Person类型变量的具体子类型。 这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。 Person s = new Student(); Person t = new Teacher(); 个人理解:将子类向上转型为父类,而父类中自定义 “规范”,具体的实现全都由子类覆写,由于“规范” 的存在,整个继承树中针对某一类型的方法签名完全相同,那么在具体运行过程中的,只需引用父类,而无需关心子类的具体实现。 接口 在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力。 如果一个抽象类没有字段,所有方法全部都是抽象方法,就可以把该抽象类改写为接口:interface。 abstract class Person public abstract void run(); public abstract String getName(); //改写为 接口interface interface Person void run(); String getName(); 所谓interface,就是比抽象类还要抽象的纯抽象接口,连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符都可以省略。 当一个具体的class去实现一个interface时,需要使用implements关键字,在Java中,一个类只能继承自另一个类,不能从多个类继承。但是,一个类可以实现多个interface。 class Student implements Person, Hello // 实现了两个interface private String name; public Student(String name) this.name = name; @Override public void run() System.out.println(this.name + " run"); 术语 注意区分术语: Java的接口特指interface的定义,表示一个接口类型和一组方法签名,而编程接口泛指接口规范,如方法签名,数据格式,网络协议等。 抽象类和接口的对比如下:
-------------------------------------------------------------------------- abstract class interface 继承 只能extends一个class 可以implements多个interface 字段 可以定义实例字段 不能定义实例字段 抽象方法 可以定义抽象方法 可以定义抽象方法 非抽象方法 可以定义非抽象方法 可以定义default方法
--------------------------------------------------------------------------- 接口继承 一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。 interface Hello void hello(); interface Person extends Hello void run(); String getName(); //Person接口现在可以实现Hello接口的hello方法。 合理理设计interface和abstract class的继承关系,可以充分复用代码。一般来说,公共逻辑适合放在abstract class中,具体逻辑放到各个子类,而接口层次代表抽象程度。 Java的集合类定义的一组接口、抽象类以及具体子类的继承关系: ┌───────────────┐ │ Iterable │接口 └───────────────┘ ▲ ┌───────────────────┐ │ │ Object │父类 ┌───────────────┐ └───────────────────┘ │ Collection │ ▲ └───────────────┘ │ ▲ ▲ ┌───────────────────┐ │ └──────────│AbstractCollection │抽象类 ┌───────────────┐ └───────────────────┘ │ List │ ▲ └───────────────┘ │ ▲ ┌───────────────────┐ └──────────│ AbstractList │ └───────────────────┘ ▲ ▲ │ │ │ │ ┌────────────┐ ┌────────────┐ │ ArrayList │ │ LinkedList │具体子类 └────────────┘ └────────────┘ 在使用的时候,实例化的对象永远只能是某个具体的子类,但总是通过接口去引用它,因为接口比抽象类更抽象(接口回调): List list = new ArrayList(); // 用List接口引用具体子类的实例 Collection coll = list; // 向上转型为Collection接口 Iterable it = coll; // 向上转型为Iterable接口 注意:Iterable接口也可以调用具体子类。 default方法 在接口中,可以定义default方法。通常情况下,继承自某个接口的子类需要对接口中的所有方法覆写,但对于default方法,子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。 default方法和抽象类的普通方法是有所不同的。因为interface没有字段,default方法无法访问字段,而抽象类的普通方法可以访问实例字段。 public class Main public static void main(String[] args) Person p = new Student("Xiao Ming"); p.run(); interface Person String getName(); default void run() System.out.println(getName() + " run"); class Student implements Person private String name; public Student(String name) this.name = name; public String getName() return this.name; //无需覆写 run方法
以上是关于接口是定义了一些方法,但本身并没有实现他,会根据需要用不同的类来实现他。的主要内容,如果未能解决你的问题,请参考以下文章