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).注意:如果实现接口的类中没有实现接口中的全部方法,则必须将此类定义成抽象类。

总结:抽象类,是对某一类具体事物的高度抽象,其中既有属性也有方法。当需要对一类事物进行抽象的时候,应该使用抽象类,好形成一个父类。

      接口,是对方法的抽象,也就是对已一系列具体动作的抽象。当需要对一系列的动作进行抽象时,就使用接口,并需要使用这些动作的类去实现相应的接口即可。

posted @ 2020-03-20 14:06  苏胖胖  阅读(364)  评论(0)    收藏  举报