class Biology{ /** * 内部抽象类:使用static修饰 */ abstract static class Animal{ public abstract String doing(); } } /** * 子类:继承抽象类Animal */ class Dog extends Biology.Animal{ @Override public String doing() { return "狗咬吕洞宾"; } } public class TestAbstract{ public static void main(String[] args) { Biology.Animal dog = new Dog(); System.out.println(dog.doing()); //狗咬吕洞宾 } }
/** * 有时候,由于抽象类只需要一个特定的系统子类,此时可以通过内部类来实现(避免了不必要的外部子类) */ abstract class Animal{ public abstract String doing(); /** * 通过内部子类,实例化抽象类 */ public static Animal getInstance(){ return new Dog(); //通过内部子类,实例化抽象类 } /** * 子类:继承抽象类Animal * 私有内部类,在外部不可见 */ private static class Dog extends Animal{ @Override public String doing() { return "狗咬吕洞宾"; } } } public class TestAbstract{ public static void main(String[] args) { Animal dog = Animal.getInstance(); System.out.println(dog.doing()); //狗咬吕洞宾 } }
二、接口
interface IAaa{ void fa(); } interface IBbb{ void fb(); } interface ICcc extends IAaa,IBbb{ void fc(); } /** * 子类: */ class Child implements ICcc { @Override public void fa() { } @Override public void fb() { } @Override public void fc() { } }
interface Biology{ String printType(); /** * 内部接口: */ interface Animal{ String eat(); String work(); } /** * 内部抽象类 */ abstract class Plant{ public abstract String grow(); } } /** * 子类:实现外部接口 * 只需要重写外部接口的抽象方法,和其中的内部类或内部接口无关 */ class Robot implements Biology{ @Override public String printType() { return "自能机器人"; } } /** * 子类:实现内部接口 */ class Dog implements Biology.Animal { @Override public String eat() { return "狗啃骨头"; } @Override public String work() { return "狗咬吕洞宾"; } } /** * 子类:实现内部抽象类 */ class Bamboo extends Biology.Plant{ @Override public String grow() { return "芝麻开花节节高"; } } public class Test { public static void main(String[] args) { Biology robot = new Robot(); System.out.println(robot.printType()); //自能机器人 Biology.Animal dog = new Dog(); System.out.println(dog.eat()); //狗啃骨头 System.out.println(dog.work()); //狗咬吕洞宾 Biology.Plant bamboo = new Bamboo(); System.out.println(bamboo.grow()); //芝麻开花节节高 } }
三、接口在实际开发之中有三大核心作用
四、抽象类和接口的比较
No | 区别 | 抽象类 | 接口 |
1 | 关键字 | abstract | interface |
2 | 组成 |
构造方法、静态方法、普通方法、抽象方法、 常量、变量 |
抽象方法、全局常量 |
3 | 权限 | 可以使用任意权限修饰符 | 只能使用public |
4 | 关系 | 抽象类可以实现多个接口 |
接口不能继承抽象类, 接口可以继承多个接口 |
5 | 子类使用 | class 子类 extends 抽象类 | class 子类 implement 接口一,接口二 |
6 | 限制 | 单继承限制 | 没有单继承限制 |
7 | 重写抽象方法 | 抽象类和接口都必须有子类,非抽象子类必须重写所有的抽象方法 | 【同抽象类】 |
8 | 实例化方式 | 抽象类和接口,都是依靠子类对象向上转型,进行实例化 | 【同抽象类】 |
五、其他说明
语法要求:定义类时,先写继承extends,再写接口实现implements,否则,编辑时就会报错。
class Dog extends AbstractFather implements IAnimal { ….. }
原文:https://www.cnblogs.com/newbie27/p/10500691.html