1, 抽象类.
java 常规类中, 有些方法并不是固定的, 而是在不同的情况下有不同的实现的, 比如一个人, 在公司要工作, 在学校要学习, 在食堂要吃饭, 但是这个人还有相同的地方, 比如不论在哪里都要呼吸, 看, 挺, 所有可以把变化的和不变化的分离开.
正常情况下的类如下:
- package org;
- public class Person {
- public Person action(){
- System.out.println("在公司工作");
- return this;
- }
- public Person look(){
- System.out.println("我就看看!");
- return this;
- };
- public Person breath(){
- System.out.println("我随时在呼吸!");
- return this;
- }
- public Person listen(){
- System.out.println("我很警惕, 随时耳听八方!");
- return this;
- }
- }
但是这里边的 action 方法可能随着环境的变化做出不一样的动作, 所有就可以给抽象出来, 变成一个抽象的父类
- package org;
- public abstract class Person {
- public abstract Person action();
- public Person look(){
- System.out.println("我就看看!");
- return this;
- };
- public Person breath(){
- System.out.println("我随时在呼吸!");
- return this;
- }
- public Person listen(){
- System.out.println("我很警惕, 随时耳听八方!");
- return this;
- }
- }
抽象类和接口类似, 都不能有实例. 例如:
- package org;
- public abstract class TestIfCanBeInstance {
- }
- class MyTest{
- public static void main(String[] args) {
- //new TestIfCanBeInstance();'TestIfCanBeInstance' is abstract; cannot be instantiated
- }
- }
类中的静态方法没有实现, 需要在其子类进行实现. 类中有抽象方法, 这个类也必须是抽象的.
抽象类的使用方法如下:
- class Test{
- public static void main(String[] args) {
- new Person(){
- @Override
- public Person action() {
- System.out.println("我在食堂要吃饭!!!");
- return this;
- }
- }.action().look().breath().listen();
- }
- }
可以看到, 抽象类隐藏了其他方法的实现, 也正好符合了 java 封装的特性.
2, 接口
接口就是一个完全抽象的类, 本身可以不提供任何实现 (当然 jdk8 以后出现的接口的默认实现), 接口规定了实现这个接口的类改有的模型, 接口最伟大的是实现了多继承.
接口的声明利用关键字 interface, 声明如下:
- package org;
- public interface Shape {
- void area();
- void lenght();
- }
接口的方法默认是 public static 的, 你并不需要将这个声明加上, 如果你想将方法声明为 private,Modifier 'private' not allowed here. 因为接口里的私有声明没有任何意义.
接口也可以像抽象类一样, 引用父类, 指向一个实现了这个父类的子类. 当我们操作的不是一个具体的方法, 而是父类, 实现的类之间的解耦和实现的封装化.
java 接口可以通过继承进行扩展.
接口中的域默认是 public static final 的, 原来会用接口存储一些我们用的变量, 后可以用更强大的枚举类代替.
接口的继承, 如果有两个接口的签名方法一样, 这对接口的使用没有什么影响. 但是如果两个方法名字相同, 但是返回值不一样, 这就会导致子类的模糊, 会发生编译器异常.
来源: http://www.bubuko.com/infodetail-2999234.html