Java基础知识系列之-抽象abstract
1.何为抽象
抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。
比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为苹果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。
2.知识点
2.1抽象类和普通类的区别是抽象类有一个抽象方法,如下代码可解疑惑
1 abstract class A{ // 是定义了一个抽象类
2 public static final String FLAG = "CHINA" ; // 全局常量
3 private String name = "张三" ; // 定义一个普通的属性
4 public void setName(String name){
5 this.name = name ;
6 }
7 public String getName(){
8 return this.name ;
9 }
10 public abstract void print() ; // 定义抽象方法
11 //构造方法
12 public A(){
13
14 }
15 };
2.2抽象类不能直接被实现,即new
2.3抽象类必须被子类实现
2.4抽象类不能使用用final进行声明
2.5抽象类中可以存在构造方法,以及super关键字的使用,如下代码可解疑惑
1 package com.hhb.q; 2 abstract class Person{ 3 private String name ; // 定义name属性 4 private int age ; // 定义age属性 5 public Person(String name,int age){ 6 this.name = name ; 7 this.age = age ; 8 } 9 public void setName(String name){ 10 this.name = name ; 11 } 12 public void setAge(int age){ 13 this.age = age ; 14 } 15 public String getName(){ 16 return this.name ; 17 } 18 public int getAge(){ 19 return this.age ; 20 } 21 public abstract String getInfo() ; // 抽象方法 22 }; 23 class Student extends Person{ 24 private String school ; 25 public Student(String name,int age,String school){ 26 super(name,age) ; // 指定要调用抽象类中有两个参数的构造方法 27 this.school = school ; 28 } 29 public void setSchool(String school){ 30 this.school = school ; 31 } 32 public String getSchool(){ 33 return this.school ; 34 } 35 public String getInfo(){ 36 return "姓名:" + super.getName() + 37 ";年龄:" + super.getAge() + 38 ";学校:" + this.getSchool() ; 39 } 40 }; 41 public class AbstractDemo04{ 42 public static void main(String args[]){ 43 Student stu = new Student("张三",30,"清华大学") ; 44 System.out.println(stu.getInfo()) ; 45 } 46 };
3.抽象类与接口的区别
- 一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。(使用抽象类,那么继承这个抽象类的子类类型就比较单一,因为子类只能单继承抽象类;而子类能够同时实现多个接口,因为类型就比较多。接口和抽象类都可以定义对象,但是只能用他们的具体实现类来进行实例化。)
- 从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
- 结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。(A extends AbstractB implements interfaceC,那么A即可以选择实现(@Override)接口interfaceC中的方法,也可以选择不实现;A即可以选择实现(@Override)抽象类AbstractB中的方法,也可以选择不实现)
- Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以(就是interface中只能定义方法,而不能有方法的实 现,而在abstract class中则可以既有方法的具体实现,又有没有具体实现的抽象方法),这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象 类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个 新方法,所有实现这个接口 的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
人在山中,才知道,白云也可以抓上一把,苍翠竟有清甜的味道。
人在山中,才知道,高度永远是一个变量,而快乐则是附于中跋涉过程的函数。
人在山中,才知道,庄严是望远时的一种心境,高处才能指点江山。