抽象类
抽象类概念
一般作为父类存在,是若干个子类中提取出来的相同内容。
抽象:不具体的、模糊的、不明确的,只是说明存在给行为,但未说具体怎样做,怎样执行。
例:狮子“嗷~~”的叫,小鸡“咯咯咯“的叫。叫这个行为就是一个抽象类。
public class liti {
public static void main(String[] args){
shizi c = new shizi();
c.jiao();
}
}
abstract class dongwujiao{
public abstract void jiao();
}
class shizi extends dongwujiao{
@Override
public void jiao(){
System.out.println("┗|`O′|┛ 嗷~~");
}
class maomi extends dongwujiao{
@Override
public void jiao() {
System.out.println("喵喵");
}
}
}
抽象函数
指不确定具体执行内容的函数,采用abstract关键字对函数进行标识。
注:具体执行内容由子类进行执行;
抽象类由于是不具体的,所以不能进行创建对象。
抽象类和一般类的区别
唯一的区别就是抽象类中包含了抽象函数而已,也不能创建对象,剩下的和一般类一样
对于抽象类而言,也可以由构造函数,成员变量,成员函数
抽象类的成员变量和成员函数,被当成父类留给子类使用。
与abstract关键字不能共存的关键字
final关键字
在抽象函数上不行,抽象函数就等着被子类重写,与final的含义冲突
在抽象类上不行,抽象类一般是作为父类存在,如果没有子类的话,该类的定义就没有意义
private关键字
在抽象函数上不行,抽象函数就等着被子类重写,但是private表示能被继承但无法访问
static关键字
在抽象函数上不行,静态函数可以直接被类调用,必须是具体的内容。静态优先对象加载进方法区,此时和子类无任何关系。
抽象类的子类分为两种
1.继承抽象类,但不重写抽象函数,继续声明为抽象类
2.继承抽象类,重写抽象函数。
抽象类特点
抽象类和抽象函数都需要被abstract关键字修饰,抽象函数一定在抽象类中
抽象类不能创建对象
子类只有重写了父类所有的抽象函数之后,才能创建对象,否则本身也是一个抽象类
接口
接口其实就是抽象类的另外一种表现形式
如果某一个抽象类中的所有方法都是抽象函数时,那么就可以用接口这个形式来表现
abstract class AbstractTest {
public abstract void showA();
public abstract void showB();
public abstract void showC();
public abstract void showD();
}
//AbstractTest另外一种表现形式:
interface AbstractTestInterFace {
public abstract void showA();
public abstract void showB();
public abstract void showC();
public abstract void showD();
}
接口特有属性
1.接口中定义的所有变量,都是public static final这三个关键字进行修饰的全局静态常量,但是public static final 这三个关键字可以在代码中省略,但并不代表没有。
2.接口中定义的所有函数,都是由public abstract 这两个关键字进行修饰的全局抽象函数,public abstract 这两个关键字也可以省略,但也并不代表没有。3.接口不能创建对象,接口虽然可以表示类,但接口并不是一个类,其没有与类相关的性质。
4.在Java中,类与类时单继承关系,接口之间是多继承关系。
interface InterFather { public void show(); } interface InterMother { public void show(); } interface InterSon extends InterFather, InterMother{ public void show(); } /* 你的爸爸希望你过的好 - 有没有具体说怎么过的好? 你的妈妈希望你过的好 - 有没有具体说怎么过的好? 你也希望你自己过的好 - 有没有具体说怎么过的好? 只有函数的声明,并没有函数的执行体,所以不会产生调用分歧问题 */
类与接口之间是多实现关系、
interface InterFather { public void show(); } interface InterMother { public void show(); } interface InterSon extends InterFather, InterMother{ public void show(); } class Me implements InterFather, InterMother, InterSon{ @Override public void show() { } }
接口与抽象类的区别
相同点:
都是位于继承的顶端,用于被其他子类实现或继承
都不能创建对象
都包含了抽象函数,其子类都必须重写这些抽象函数(如果不重写 就抽象类)
不同点:
抽象类为部分方法提供实现,避免子类重复实现这些方法(可以包含一般的成员函数用于继承)
接口只能包含抽象函数(JDK1.8及其以后 接口可以包含一般函数 静态函数 成员函数)