抽象类和接口的区别:
- 抽象类和子类是 is-a的关系(如animal类和cat类)
- 接口和实现类是 has-a的关系(如bird类和fly接口)
关于抽象类:
public abstract class Animal { public abstract void eat(); public void sleep() { System.out.println("动物都得睡觉"); } }
public class Cat extends Animal { public void eat() { System.out.println("猫吃鱼"); } }
public class Test {
//老是忘记,直接在类的代码里面开始new对象,忘psvm public static void main(String[] args) { Cat cat = new Cat(); Animal animal=new Cat();//使用了抽象类多态 cat.eat(); cat.sleep(); animal.eat(); animal.sleep(); } }
- 方法要么有实现体,要么是抽象方法
- 抽象方法只能在抽象类里面
- 抽象类中所有的抽象方法都必须被继承的类重写(要么继承的子类本身就是个抽象类
- 抽象类不能new对象
- 抽象类中可以有正常的方法
- 可以有成员变量
- 可以搞构造方法?(用于子类访问父类数据的初始化
关于接口:
是对行为的抽象,配合多态使用
成员变量的默认修饰符为:public static final
方法的默认修饰符是:public abstract
修饰符都不用写了
看以下例子,同一个logging登录接口有好几个实现类,之后使用时只用new合适的类并且传参即可
public interface Logging { void logging(); }
public class QQLogging implements Logging{ public void logging() { System.out.println("采用QQ方式登录"); } }
public class WeChatLogging implements Logging{ public void logging() { System.out.println("采用微信方式登录"); } }
public class Test { public static void main(String[] args) { Logging logQQ=new QQLogging(); Logging logWeChat=new WeChatLogging(); log(logQQ); log(logWeChat); } private static void log(Logging log) { log.logging(); } }
现在实际开发中,这种“面向接口编程”使用的很多