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接口的缺点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值