先说普通类,大家比较熟悉。
一般普通类包含有:
- 成员变量
- 静态成员变量
- 普通方法
- 静态方法
- 局部变量
- 构造方法
- set/get 方法等
在说一下抽象类和接口
思考一个问题:既然已经有了普通类,为什么要有抽象类和接口呢?
java是面像对象编程,抽象类的目的,就是将一个事物抽象成为一个对象,便于我们理解和开发。
比如,这个世界由男人和女人构成,本质都是人类;
因此我抽象一个人类作为抽象类,抽取二者共同的一些特点;比如:说话和写字都是我们人类独有的,区别于其他动物
记住:抽象类重生的目的,抽取公共的特性,方便子类继承和实现
而男人和女人又有不同,但是都具备人类的共同点,于是继承Human抽象类:
并添加了各自的特有特性,而且公共特点如果有变化,我可以直接修改父类,子类直接继承就好,不必男女子类都去修改,便于维护,逻辑清楚简单。
接口:定义了人类的行为,对行为的抽象
public class Man extends Human implements Behavior{
@Override
public void speak() {
super.speak();
System.out.println("男人的嘴,骗人的鬼");
}
@Override
public void writeWord() {
super.writeWord();
System.out.println("书法大家。。。");
}
@Override
public void barbecue() {
System.out.println("吃大羊腰子");
}
@Override
public void daMaJiang(){
System.out.println("三缺一啊");
};
//特性方法
public void daLie(){
System.out.println("996赚钱养家");
}
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void daDouDou() {
}
}
public class Woman extends Human implements Behavior{
@Override
public void speak() {
super.speak();
System.out.println("女人的嘴,樱桃小口");
}
@Override
public void writeWord() {
super.writeWord();
System.out.println("字迹娟秀");
}
@Override
public void barbecue() {
System.out.println("吃鸡脖子");
}
@Override
public void daMaJiang(){
System.out.println("三缺一啊");
};
//特有方法
public void guangJie(){
System.out.println("外出购物,貌美如花");
}
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void daDouDou() {
}
}
抽象类展示人类区别其他生物本身的特点,接口展示人类行为的共同点;
抽象类和接口的产生,目的都是为了让子类去实现,实现代码的复用,体现了继承的特点;
对比:
对比普通类
- 从编码角度上来讲:
- 抽象类在定义上,含有abstract关键字
- 抽象类不能被直接实例化
- 其他都一样
- 从使用角度上来讲(目的是方便子类继承父类):
- 方法不能用static,final,private关键字,方法不能被子类,但可以使用
- 抽象方法含有抽象类,也可以不含有,如果子类不能实现父类抽象方法,那么子类一定要是抽象类
- 可以有构造方法,但是不能被继承。可以被子类super()方法调用。
接口:
- 声明方法,但是不用有方法体。
- 若接口中方法或变量没有写public,static,final / public,abstract ,会自动补齐 。
- 接口中的成员都是共有的。
- 一个类可以实现多个接口,一个接口不能继承其它的类,但是可以继承别的接口,而且可以多继承。
- 接口不能被实例化
- 在java开发中,我们经常把常用的变量,定义在接口中,作为全局变量使用,访问形式:接口名.变量名。
- 一个重要的原则:当一个类实现了一个接口,要求该类把这个接口的所有方法全部实现