抽象类和接口,从接触定义到二者区别(适合初学者)

来源:互联网 发布:2017年各月m2数据 编辑:程序博客网 时间:2024/05/16 23:57

1.抽象类与抽象方法
abstract关键字定义的类就是抽象类;abstract关键字定义的方法就是抽象方法(没有方法体),抽象方法本身没有任何意义,除非被重写。
如果A类中含有抽象方法,且想让此抽象方法有意义,那么就必须在继承A类之后,重写A类的抽象方法,所以A类必须被继承,只有这样抽象方法才有意义。
什么类必须被继承呢?这就是抽象类!
结论:若一个类中有抽象方法,那么此类必须是抽象类
2.抽象类的定义与实现问题
定义:public abstract class A{}或者 abstract class A{}
抽象类不能直接创建对象,有两个方案可以去间接的创建对象。
第一种方案:用非抽象类B类去继承抽象类A,然后复写抽象类A中的所有抽象方法。(此时B类可以称为A类的实现类)
第二种方案:用匿名内部类的方式创建对象。
3.抽象方法的定义
抽象类必须在class前有abstract修饰,那么抽象方法怎么定义呢?
abstract void method_1();//即没有方法体,方法的返回值前必须有abstract
抽象类的方法修饰符:不能有private!
3.补脑:方法的修饰符
public 公有的
protected 包内、本类和子类,可以访问引用
default 包内和本类,可以访问引用
private本类访问,可以访问引用
4.抽象类中的方法,成员变量
抽象类中的方法可以有抽象方法,也可以有非抽象方法。这里,小妞要说,抽象类除了里面有抽象方法,并且不能直接实例化之外和非抽象类没有任何区别,所以成员变量的定义与非抽象类一样。
5.由抽象类引申到方法
抽象类:生物{ 抽象方法:吃、喝、工作}
生物的实现类:人extends 生物{复写所有抽象方法:吃、喝、工作}
写到这里,感觉这个程序的逻辑还是正确的吧!没关系,看下面:
生物的实现类:狗 extends 生物{复写所有抽象方法:吃、喝、工作}
现在是不是感觉很奇怪?狗竟然还工作?!世界都疯狂了,狗也迫于生活压力了?可怜的程序狗!
此时,会想,定义两个抽象类,
其中A类{抽象方法:吃、喝},B类{抽象方法:工作}
那么,人就要继承两个类A、B!这时又错了,Java不支持多继承!这时,接口就出现了。
A类{抽象方法:吃、喝},B接口{方法:工作}
此时,人继承A类,实现B接口就可以了,到这,接口终于出生了。
6.接口
用interface定义,可以看成是纯粹的抽象类,因为接口中所有的方法,都是抽象方法。
写成interface InterfaceA {}或者public interface InterfaceA {}
7. 接口中的方法的定义
方法默认都是public、abstract类型的。
不嫌累的话,当然可以手动添加。。。
还可以手动只添加public或者abstract,但是其他的方
修饰符均不能手动添加!
8.接口中的成员变量的定义
默认都是public、static、final类型的。
还可以手动添加public或者 static或者final或者三者的任意组合。
9. 接口的实现问题
接口不能直接创建对象,有两个方案可以去间接的创建对象。
第一种方案:用非抽象类B类去继承接口A,然后复写接口A中的所有抽象方法。(此时B类可以称为A接口的实现类)
第二种方案:用匿名内部类的方式创建对象。
总结:
接口与抽象类相同点:
1) 定义时public abstract class A{}或者 abstract class A{}
public interface InterfaceA {}或者interface InterfaceA {}
2) 实现都是两种方式
接口与抽象类不同点:
1) 常量定义时:
接口默认都是public、static、final类型的。
抽象类和非抽象类一样。
2) 方法定义时:
接口中方法默认都是public、abstract类型的。
抽象类中的抽象方法有abstract即可,另外不能使用private,其他权限修饰符均可根据需要使用;还可以实现一部分方法。
3) 一个类可以继承一个抽象类,却可以实现多个接口。
接口可以继承接口,并且可以继承不只一个接口,但是不能实现接口。
抽象类可以继承别的抽象类,那么可以不覆盖抽象方法。
以上是小妞的总结,几乎每一句话都是试验过的,虽说讲不清为啥这么写是对的,但是可以让初学者或者懒于总结的人得个省事,有错误的地方希望好心人的指正呀!小妞的第一篇博客。专属图片

1 0