首页 > 编程 > Java > 正文

Java小专题之抽象类和接口

2019-11-06 06:32:58
字体:
来源:转载
供稿:网友

一.抽象类


1. 抽象类的来源

java是面向对象的语言。在面向对象的概念中,一切事物都是对象,所有的对象都是用类来描述的。事物有个性和共性。描述事物抽取出来的共性的类就是抽象类

事物(对象) 事物的个性 事物的共性
类(属性+方法) 一般类 抽象类
举例 苹果 水果

2.抽象类的特征

抽象类不能实例化。也就是不能创建对象,应该由继承抽象类的子类来进行实例化。抽象类就是为了继承而存在的,天生就是为了当爹。基于这个原因,abstract不能和final并列修饰一个类。 final修饰的类不能被继承。子类无法继承抽象类进行实例化。抽象类的抽象方法必须由继承它的子类重写。如果继承它的子类没有重写抽象类的抽象方法,那么这个子类也一定是抽象类,因为它含有抽象方法。基于这个原因,抽象方法必须是public和PRotected修饰的,缺省访问权限修饰符情况下, 默认为public。因为abstract不能和private,static,final或native并列修饰抽象方法。原因是 private修饰的方法不能被子类继承。子类不能重写这个方法。static修饰的方法叫类方法(静态方法)。子类不必重写这个方法。final修饰的方法可以被继承不能被重写。子类不能重写这个方法。含有抽象方法的类必然是抽象类。抽象类可以没有抽象方法。子类的抽象方法不能和父类的抽象方法同名。抽象类可以有成员变量, 一般方法, 构造方法,与普通类一样。

3.抽象类的示例代码

public abstract Person{ //属性 String name; //构造方法 public Person(){ this.name=name; } //一般方法 public void displayName(){ System.out.println("名字是:"+name); } //抽象方法 public abstract void eat(); }

二.接口

1.接口的来源

接口是比抽象类还要抽象。接口是抽象类的延伸。Java为了保证数据安全,一个类不能继承多个类。但是Java使用接口弥补了不能多继承的缺陷。一个类可以实现多个接口,这叫“多实现”。接口和继承共同使用,既能保证数据安全,又可以实现多继承。接口与接口之间是可以多继承的。//接口继承(inheritance)interface A{ void method1(); void method2();}interface B{ void method3;}interface C extends A,B{ void method4();}

2.接口的特征

接口不能实例化。不能使用new操作符实例化一个接口,但是可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(Object instanceof Interface){}。 实现接口的非抽象类必须要实现接口中的所有方法。实现接口的抽象类不必实现接口中的所有方法。接口中的变量。接口中的变量会被隐式地指定为public static final修饰,使用其他修饰符修饰编译会报错。一般情况下不在接口中定义变量,而是不可变的常量。接口中的方法。接口中的方法会被隐式地指定为public abstract修饰,使用其他修饰符修饰编译会报错。接口中不存在具体实现的方法,接口中的方法都是抽象方法。

3.接口的示例代码

public interface Demo{ public static final A; public abstract void method1(); public abstract void method2();}

三.抽象类和接口的深度剖析

在Java语言中, 抽象类和接口是支持抽象定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。抽象类和接口之间在对于抽象定义的支持方面具有很大的相似性,甚至可以相互替换。

1.语法层次的不同 参考一,二部分。


2.抽象层次的区别 抽象类是对一类事物的抽象。接口是对行为的抽象。 抽象类是对整个类整体的属性,行为进行抽象。 接口是对类局部行为进行抽象。 举例说明: 飞机和鸟是不同的事物,它们拥有共同的行为,会飞。 可以将飞机设计一个类,鸟设计一个类,因为两者都是事物。 但是飞行是个行为特性,不能设计一个类,应该设计成一个接口。


3.描述层次的区别 我们日常生活中可以看到各种”接口”,例如电源插座。制造电源插座的厂商和制造电器的厂两者之间约定了一个生产规则,约定了一个”接口”之后,不同的电器就都能使用电源插座。 由此可知,接口的本质是协议,是对事物之间规则的描述,不是对事物的描述。 在Java中: 1.抽象类也是类,类是对现实事物的描述。 2.接口不是类,接口是用来建立类与类之间的协议。接口是对事物之间规则,行为的描述。


4.设计层次的不同 1.抽象类的设计理念是“is-a”,接口的设计理念是“like-a”,是问题领域不同。 2.抽象类的设计目的是为了提高代码的复用性。是模板式设计。接口的设计目的是为了实现”设计与实现的分离”,降低程序中的耦合性。是辐射式设计。 3.在“缺省适配模式”中,声明类型的工作由Java接口承担。但是同时给出一个Java抽象类,且实现了这个接口。而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。也就是说,在层次结构中,Java接口在最上面,然后紧跟着抽象类,然后是普通类。 4.在面向对象程序设计中,对于接口,有一个核心原则就是Interface Segregation Principle(接口隔离原则): 1)使用多个专门的接口比使用单一的总接口要好。2) 一个类对另外一个类的依赖性应当是建立在最小的接口上的。3)一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。


简化总结

抽象类 接口
不是类
对事物描述 对事物之间规则描述
对类整体抽象 对类局部行为抽象
模板式设计 辐射式设计
is-a理念 like-a理念
目的是提高复用性 目的是降低耦合性
为继承而生 为多态而生

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表