一、接口类
(一)定义:接口类是一种抽象类型,定义一组方法或行为的规范,不提供具体的实现。要实现接口类必须提供这些方法的具体实现多用于实现多态和代码解耦。
(二)使用:(interface)
接口类的关键字:interface,他的定义是:public interface 接口名{接口的实现}


上面可知:Shape是一个接口类,里面有PI常量,诶?他不是被没被static final修饰吗?怎么是常量呢?待会来讲。好,初次之外还有计算面积的方法,但没有具体的实现,还有计算周长的方法也没有具体的实现,和一个形状的方法,但他有实现。发现了吗?有点类似于继承啊。我可以用接口类中的方法和常量,对的,那么有什么区别呢?我们先来看几个接口类的特点
接口类特征:
1.接口类中不能有普通的成员方法,但可以有default定义的方法,可以有具体的实现,就像上面,有shape方法,里面内容是打印“通用方法”,如下图,不能定义普通成员方法。

2.接口中的方法如果被static修饰,那么可以有具体的实现。

3.接口类不能通过new关键字实例化(非常重要)

4.通过关键字implements来实现接口public class 类名 implements 接口名{类的实现};具体看第二张图片,长方形类实现了shape的接口。
5.接口可以发生向上转型和动态绑定。和继承类似,接口中没有的方法不能使用,只能使用接口中有的方法。动态绑定就是接口调用实现类实现的方法。


6.当一个类实现接口后,必须加上public修饰。这是为什么呢?本节后面会讲。
7.接口中不能有构造方法和代码块。首先,我们知道接口不能被new,也就是不能被实例化,自然构造方法就没什么用,也就不能有构造方法,而且实例代码块也是在实例化的时候调用的,那么不能被实例化自然不能有实例代码块。静态代码块是类在加载的时候被加载的,而接口中的成员是static修饰的,不需要静态代码块。
8.接口中的成员变量默认是public staitc public 修饰的,成员方法默认是public abstract修饰的,这也就是为什么接口中的方法必须被重写的原因,那么成员变量默认被public static修饰,自然就是常量,也就是上面为什么PI是常量的原因。好,方法默认是public修饰,这就是为什么实现接口必须加上public修饰,前面章节讲到,重写权限必须大于等于被重写的方法。
(三)自定义类型比较器(Comparable<T>)

我们可以通过Comparable 接口来实现比较大小,但必须重写compareTo方法。进阶版如下:

二、抽象类(abstract)
抽象类非常简单
(一)定义:一个类中没有包含足够信息来描述一个具体的对象
(二)特征:
1.抽象类就是为了继承而生,它不能被实例化(只能被继承),也就是和接口一样,不能被new,它只要目的是为了继承。
2.被abstract修饰的方法叫抽象类,这个类可以没有具体的实现。

只有被abstract修饰的方法才能不被实现,上面的eat没被abstract修饰,所以他必须有实现方法,比如我们可以打印“吃粮食”;看下图就是抽象方法和普通方法的区别之一。

2.当一个类中含有抽象方法后,那么它必须被abstract修饰。
3.当一个普通类继承了抽象类后,普通类一定要重写抽象类中所有的抽象方法。

由于我没有重写Animal中的sound方法,他就闪红线了,而如果将sound方法补全就可以了。

4.如果一个类A不想被类B继承,就可以吧类B改成抽象类,但是,欠了的迟早要还,当我们有普通类继承抽象类B时,要重写抽象类A和抽象类B中所有的抽象方法。即抽象类A被抽象类B继承,普通类C继承抽象类B要重写A和B中所有的抽象方法。如果B中已经重写了A中部分抽象方法,那么那些抽象方法可以不被C重写。
(三)匿名对象
也就是没有名字的对象,每次要使用的时候需要重新实例化。


第一个吃粮食是实例化了dog,调用dog的eat打印的。
而第二次吃粮食是匿名对象,当运行完eat()后,就找不到对象了,下次实例化又是另一个对象。
那么,今天的抽象类和接口类到此为止,下一期预告:拷贝和内部类。点点关注不迷路!!!


被折叠的 条评论
为什么被折叠?



