Java—接口和抽象类
一、接口
Java 接口(Interface) 是面向对象编程中用于定义行为规范的核心机制。接口通过抽象方法约定“能做什么”,而不关心“如何做”,从而实现多态和代码解耦。
1.1 接口的特点
- 接口用interface定义
- 接口中全为抽象方法
- 默认用public abstract修饰,protected、private 不可以修饰 因为要实现继承
- 接口中的变量都是被static final修饰的 全部都是和类相关的属性
- 接口没有构造方法,如果要用使用多态实现
- 实现接口使用implements关键字,实现接口必须要实现接口中所有方法 如果不实现接口中所有方法,那么该类为抽象类
- 接口与类之间是实现关系 可以支持多实现 public abstract class AnmalIntImpl implements AnimalInt,B,C
- 接口与接口之间是继承关系 使用extends关键字表示继承,可以实现多继承 public interface AnimalInt extends B,C
- 类可以既实现接口 同时继承其他类 public abstract class AnmalIntImpl extends Demo implements AnimalInt,B,C
- Java8之后,接口中可以有默认方法(有实现),用default修饰即可
1.2 代码实现
//B.java
public interface B {void DB(); //隐式 public abstract 实现类必须覆写 DB()
}//C.java
public interface C {void CC(); //隐式 public abstract 实现类必须覆写 CC()
}//Demo.java
public class Demo {}//Animal.java 抽象类
//继承是单继承,只能有一个父亲
public abstract class Animal {//四个抽象方法public abstract void eat(); public abstract void run();public abstract void jump();public abstract void sleep();
}
//抽象类无法实例化;子类必须实现所有抽象方法,或自身声明为 abstract//AnimalInt.java
public interface AnimalInt extends B,C{ // 多继承接口static final int a = 5; //常量void eat(); //默认用public abstract修饰public abstract void run();public abstract void jump();// 默认方法(Java 8+)default void sleep() {System.out.println("xxx");}
}//AnimalIntImpl.java 抽象类:无需实现任何接口方法(由子类完成),可添加自己的抽象/具体方法
public abstract class AnmalIntImpl extends Demo implements AnimalInt,B,C{}
1.3 测试
public class Test extends AnmalIntImpl{@Overridepublic void eat() {System.out.println("eat");}@Overridepublic void run() {System.out.println("run");}@Overridepublic void jump() {System.out.println("jump");}@Overridepublic void DB() {System.out.println("DB");}@Overridepublic void CC() {System.out.println("CC");}public static void main(String[] args) {Test test = new Test();test.CC();test.DB();test.eat();test.jump();test.run();test.sleep();System.out.println(AnimalInt.a);}}
1.4 运行结果
二、抽象类
抽象类(Abstract Class) 是面向对象编程中一种特殊的类,用于定义部分实现的模板,强制子类完成特定行为。抽象类介于普通类和接口之间,既包含抽象方法(无实现)也可包含具体方法(有实现)。
2.1 抽象类的特点
- 抽象——提取共性
- 形象——描述完成后脑海里出现的具体的样子
- abstract 抽象类(为了提取共性)不允许直接new,即不可实例化
- 不允许直接new自己,只能通过多态的形式使用
- 抽象方法的目的:为了让子类重写
- abstract修饰且没有函数体的方法
- 抽象方法(需子类实现)必须存在于抽象类中,非抽象类不能有抽象方法
- 抽象类中可以有具体方法,抽象类中可以没有抽象方法
- private和abstract关键字不能同时用-->private修饰的方法子类不可见
- static和abstract关键字不能同时用-->static是针对类的,abstract是对象层次的
- 抽象类里可以有构造方法,目的是在子类初始化前先初始化父类
- 子类将继承抽象类,如果不想实现抽象类的抽象方法,那么该类必须是抽象类
- 如果子类也是抽象类,可以不用实现父类的抽象方法
- 子类只能继承一个抽象类(与接口的多继承互补)
2.2 代码实现
//Animal.java
public abstract class Animal {public abstract void move();
}//Brid.java
public class Brid extends Animal{public void move() {System.out.println("飞");}
}//Dog.java
public class Dog extends Animal{public void move() {System.out.println("跑");}
}
2.3 测试及运行结果
public class Test {public static void main(String[] args) {Animal aa = new Dog();aa.move();}
}
三、接口与抽象类的区别
- 接口与抽象类的区别
- 接口中所有的方法默认族是public,是抽象的。接口中的方法不能有实现(Java8之后,接口的方法可以有实现 使用default修饰)
- 抽象类可以有非抽象的方法
- 接口中的变量默认是final类型,抽象类里不一定
- 一个类可以实现多个接口,但是最多只能继承一个抽象类
- 接口和抽象类都不能使用new来实例化,但是抽象类有构造方法而接口没有
- 从设计层面来讲,抽象类是对事物的抽象(抽象类里可以有行为和属性),接口是对行为的抽象(接口里只有行为,没有属性)