前排提醒:本篇文章较长,请耐心观看;富含的知识点、干货较多,如果看的比较迷糊,可分两次观看或重复观看。
看到这个标题有人可能会问了,抽象类是什么?接口又是什么?抽象类和我们前面所学的类与对象类似吗?具体又有什么区别?别着急,现在开始逐项讲解。
(1)抽象类
有几个需要注意的点:
1.抽象类和普通类区别在于:抽象类中可以包含抽象方法;没有抽象方法的不一定不是抽象类,但是有抽象方法的一定是抽象类。
2.抽象类一般是由 修饰符+abstract+方法 来表示的,这种被 abstract 修饰的方法我们称之为抽象方法,抽象方法中可以不用去实现(可以没有方法体)。为什么呢?见下面的3。
3.如果一个普通类继承了这个抽象类,那么此时这个普通类必须重写这个抽象类当中的抽象方法,否则会直接报错。
4.抽象类不能被实例化。但可以通过匿名对象来类似使用实例化的功能;如下图:
5.如下图
6. 抽象类也是类,内部可以包含普通方法(需要有实现)和属性(成员变量),甚至构造方法。
7.抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也得是抽象类,必须要使用 abstract 修饰。
(2)接口
在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。
电脑的USB口上,可以插:U盘、鼠标、键盘等所有符合USB协议的设备。
电源插座插孔上,可以插:电脑、电视机、电饭煲等所有符合规范的设备。
通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,它是一种引用数据类型。
接口的语法规则,请看下图:
编译时的注意事项:
注意:
1.子类和父类之间是 extends 继承关系,类与接口之间是 implements 实现关系。
2.接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是 .class
3.如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类.
4.jdk8中:接口中还可以包含default方法。
不知道大家发现了吗,接口和抽象类之间有些特点是相同的,这里我建议大家最好可以自己总结以下它们的异同点,并自己写下来。下面是我给出的参考答案:
抽象类和接口的核心区别如下:
1. 定义与关键字
抽象类:使用 abstract class 定义,包含抽象方法(无实现)和具体方法(有实现),也可以没有抽象方法。
接口:使用 interface 定义(Java 8+后可包含默认方法和静态方法),早期只能有抽象方法和常量,不能有具体实现。
2. 继承与实现
抽象类:子类通过 extends 继承,一个类只能继承一个抽象类(单继承)。
接口:类通过 implements 实现,一个类可以实现多个接口(多实现)。
3. 成员变量
抽象类:可以有各种类型的成员变量(私有、保护、公有等),变量可以被继承和修改。
接口:成员变量默认是 public static final (常量),必须初始化,且不能被修改。
4. 构造方法
抽象类:可以有构造方法,用于子类初始化时调用。
接口:不能有构造方法,因为接口不能被实例化。
5. 设计目的
抽象类:侧重代码复用,定义类的共同属性和部分实现,体现“is-a”关系(如“狗是动物”)。
接口:侧重行为规范,定义类应实现的方法,体现“has-a”关系(如“狗会跑”)
2.1 多接口实现
Java中类和类虽然只能是单继承。但是对于接口,我们是可以实现多继承的:即一个类可以实现多个接口。至于为什么我们后面会讲到。
public Cat(String name) {
super(name);
} //这段代码是创建子类时对父类里的进行初始化
这段代码class Frog extends Animal implements lRunning, lSwimming 有几个注意事项:
1.接口的实现必须放在继承父类的后面,否则编译器会报错。
2.可以同时实现多个接口,只需在接口与接口之间加上逗号即可。
这就是能实现多接口的原因:继承的表达含义是 is-a 的语义,而接口表达的含义是具有 has-a 的特性。只关注某个类或某个对象能不能够实现这个特性,限制条件变少了。
接口可以继承一个接口,达到复用的效果,需要使用 extends 关键字来实现。但是这里有人可能会问了,extends 不是用于类与类之间的吗?其实不然,extends 的本来意思是扩充,而且我们也并没有说过他只能用于类与类之间,所以要改变一下观点;接口之间的继承也是用 extends 。
(3)Object 类
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。且默认会继承Object类。即所有类的对象都可以使用Obiect的引用进行接收。
Object 类是 Java 中所有类的根类,位于 java.lang 包中,它相当于是你所编译的父类的父类,且在它之上不能再有父类,它即是最高的。以下简单介绍 Object 的这三种方法:
(1)equals:具体示例语法(tmp.name.equals(this.name))如下图:
这里注意 Dog tmp = (Dog)obj;是需要将 Object 的obj 强转成Dog 类型的。然后不能直接用一个对象来 equals 另一个对象,不然的话编译器只是取这两个对象的地址来进行比较,肯定输出的就会是 false,所以我们要把对象里面的属性逐个进行比较,这样才是正确的。
(2)toString:
(3)hashcode
现在还是用(1)图中的代码,但是加上下面两串 hashcode 代码:
得出的结果是:
所以,hashcode 默认输出的是一个整型值。
本篇文章到此结束,但是其实还没完,下篇文章要讲内部块,如下图:
本篇文章的截图和课件均摘自 比特科技 。希望能对你有帮助。
评论前必须登录!
注册