禹娜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 | 接口没有最高层 |
相同点 | 两者都不能实例化 都是引用类型 都可以包含抽象方法 |
点赞
评论