禹娜day23 接口

接口

什么是接口

使用interface关键字修饰的是接口

接口的定义
interface IClimbTree{
    
}

接口的规则

1.接口可以包含属性,但是属性必须是常量,也就是static final修饰的。static和final可以省略。若省略,在编译时jvm会自动为接口的属性添加关键字static final。

public interface IClimbTree{
    static final int AGE=0;
}
相当于
public interface IClimbTree{
    int AGE=0;
}

2.接口中的属性访问修饰符是public的,可以省略。如若省略的话在编译的时候,jvm会自动为接口属性添加public。

public interface IClimbTree {
            public int AGE=0;
}
相当于
public interface IClimbTree {
            int AGE=0;
}

3.接口名的访问修饰符与类相同,可以是public 和默认

interface IClimbTree {
    
}
同包可以访问
public interface IClimbTree {
    
}
任何地方都可以访问

4.接口中可以定义方法,接口中定义的方法必须是abstract方法,必修是public的方法。其中的abstract和public可以省略。在编译时jvm会自动添加abstract和public。

public interface IClimbTree {
    public abstract void climbTree();
}
相当于
public interface IClimbTree {
    void climbTree();
}

5.接口不允许有实现的方法

6.接口不能实例化

接口的作用

接口是定义规范的

接口的使用
一个子类可以继承一个父类,可以实现多个接口。例如
public class Cat extends Pet implements IClimbTree,ICatchMouse{
}

示例程序:
    以宠物店为基础,增加IClimbTree接口,该接口定义climbTree()的方法用于表示爬树,增加ICatchMouse接口,该接口定义catchMouse()方法,表示捉老鼠。让Cat类继承Pet类,实现IClimbTree接口和ICatchMouse接口。

package anmial;

public  abstract class Pet {
    public abstract void sound();
    private String name;
    
    public Pet() {
        this.name="无名氏";
    }
    public Pet (String name) {
        super();
        this.name =name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}


package anmial;

public interface ICatchMouse {
   void catchMouse();
}


package anmial;

public interface IClimbTree {
   void climbTree();
}



package anmial;

public class Cat extends Pet implements IClimbTree, ICatchMouse {
    private String name;
    public Cat(String name) {
        super();
        this.name = name;
    }
    @Override
    public void climbTree() {
        System.out.println("猫在爬树");
    }
    @Override
    public void catchMouse() {
    System.out.println("猫抓老鼠");
        
    }
    @Override
    public void sound() {
        System.out.println("喵喵");
        
    }
    
}


package anmial;

public class test {
    public static void main(String[] args) {
        //猫展示才华
        Cat cat = new Cat("花花");
        Pet pet = cat; //子类转换为父类
        //展示叫声
        pet.sound();
        //展示爬树
        IClimbTree cb = (IClimbTree) cat; //子类转换为接口
        cb.climbTree();
        //展示捉老鼠
        ICatchMouse cm = (ICatchMouse) cat; //子类转换为接口
        cm.catchMouse();
    }

}

接口与抽象类的区别

区别 抽象类 接口
多继承 子类只能继承一个直接抽象类 子类可以实现多个接口
实现 子类使用extends继承抽象类 子类通过implements实现接口
成员 抽象类中可以有实例成员、静态成员、抽象方法。 抽象类中的成员方法不能用default关键字修符。 接口中只能有常量、抽象方法。 JDK8.0及其以后的版本中可以有static方法和default方法。
成员变量修饰符 抽象类中可定义变量,也可定义常量 接口中只能定义常量(public static final修饰的变量)
子类实现 子类在实现抽象方法时不允许缩小访问权限 子类在实现抽象方法时必须指定public权限
构造函数 抽象类可以有构造函数 接口中不能定义构造函数
最高层 类的最高层是Object 接口没有最高层
相同点 两者都不能实例化 都是引用类型 都可以包含抽象方法

评论