Java学习day22-接口(interface)
一、接口(interface)
1.有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
2.接口(interface)是抽象方法和常量值的定义的集合。
3.从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
4.实现接口类:
class Subclass implements InterfaceX{ }
5.一个类可以实现多个接口,接口也可以继承其他接口。
二、接口的特点
1.用interface来定义。
2.接口中的所有成员变量都默认是由public static final修饰的。
3.接口中的所有方法都默认是由public abstract 修饰的。
4.接口没有构造器。
5.接口采用多层继承机制。
例如:创建新的new interface-- TestIn 和 TestIn1
package day15; public interface TestIn { int ID = 1;//等同于public static final int ID = 1; void test();//等同于public abstract void test(); }
package day15; public interface TestIn1 { void test1(); }
创建新的new class -- TestInImpl来实现
package day15; /** * 子类继承父类,只能继承一个父类 * 类可以实现多个接口,多个接口中间用,分隔 * */ public class TestInImpl implements TestIn,TestIn1{ public void test() {//需要实现具体的方法 // TODO Auto-generated method stub } public void test1() { // TODO Auto-generated method stub } }
此外,接口是可以继承接口的
package day15; public interface TestIn2 extends TestIn1{ //接口是可以继承接口的 }
6.实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。否则,仍为抽象类。
7.接口的主要用途就是被实现类实现。(面向接口编程)
package day15; /** * 如果类没有实现接口的所有方法,那么这个类就要定义成抽象类 * */ public abstract class TestInImpl1 implements TestIn{ }
8.与继承关系类似,接口与实现类之间存在多态性。如果一个类是既有继承,又有实现,先继承后实现。(定义Java类的语法格式:先写extends,后写implements)
package day15; /** * 如果一个类既继承父类,又实现接口 * 那么先继承,再实现 * */ public class TestInImpl2 extends Person implements TestIn,TestIn1{ public void test() { // TODO Auto-generated method stub super.test(); } public void test1() { // TODO Auto-generated method stub } }
问题:接口和抽象类很相似,好像是用接口能做的事情,抽象类也能做,那么为什么还要有接口呢?
答:抽象类在新增抽象方法的时候是存在问题的,问题是继承了父类的子类,就要必须实现父类新增的抽象方法,或者将子类改为抽象类。解决办法是新建一个借口,把新增的抽象方法放到借口里面,子类如果需要,再实现接口。

父类需要稳定的抽象,如果父类的抽象总是改变,那么基于这个父类的子类,子类的子类...等,都会受到影响。但是有时我们确实需要给父类增加一些方法,那么就不能直接在父类上下手,只能新建一个接口,在接口上扩展方法,让其它有需要的子类自行去实现接口。
三、接口应用举例
(1).如何用Java描述一个会唱歌的厨子也是一个老师?

具体流程为:1.先创建一个Person1的父类
package day15; public abstract class Person1 { int age; String name; int sex; public abstract void showInfo(); }
2.创建Cooking 和 Sing 两个接口
package day15; /** * 这是一个厨艺的接口 * */ public interface Cooking { void fry();//炒菜的方法 }
package day15; /** * 这是一个歌唱的接口 * */ public interface Sing { void singing();//这是一个唱法的方法 }
3.创建一个SCTeacher的子类,调用两个接口,并进行具体方法的实现
package day15; /** * 这是描述会唱歌的厨子是一个老师的类 * */ public class SCTeacher extends Person1 implements Cooking,Sing{//先继承后实现 String course;//属于老师本身的属性,科目 public void setInfo(){ super.age = 26; super.name = "王富贵"; super.sex = 1; this.course = "数学"; } public void showInfo() { // TODO Auto-generated method stub System.out.println("会唱歌的厨子的老师的信息是:"); System.out.println(super.age); System.out.println(super.name); System.out.println(super.sex); System.out.println(this.course); } public void fry() { // TODO Auto-generated method stub System.out.println(super.name + "老师拿手的厨艺是炒菜"); } public void singing() { // TODO Auto-generated method stub System.out.println(super.name + "老师擅长的唱法是美声"); } }
4.在Test方法中进行测试
package day15; public class Test { public static void main(String[] args) { SCTeacher sct = new SCTeacher(); sct.setInfo();//初始化信息 sct.showInfo(); sct.fry(); sct.singing(); } }
打印结果为:

(2).一个类可以实现多个无关的接口。与继承关系类似,接口与实现类之间存在多态性
package day15; public class Test { public static void main(String[] args) { Cooking c = new SCTeacher();//用接口来接收new对象 c.fry();//接口形态只能访问本接口中的方法 Sing s = new SCTeacher(); s.singing(); } }
打印结果为:
null老师拿手的厨艺是炒菜
null老师擅长的唱法是美声
(3).注意:如果实现接口的类中没有实现接口中的全部方法,则必须将此类定义成抽象类。
总结:抽象类,是对某一类具体事物的高度抽象,其中既有属性也有方法。当需要对一类事物进行抽象的时候,应该使用抽象类,好形成一个父类。
接口,是对方法的抽象,也就是对已一系列具体动作的抽象。当需要对一系列的动作进行抽象时,就使用接口,并需要使用这些动作的类去实现相应的接口即可。

浙公网安备 33010602011771号