Java基础——抽象类和接口的关系

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都能用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就应该被定义为抽象类。

抽象类

概述

比如,我们要描述“动物”,它具有年龄、体积,会叫,能跑。但是又缺乏足够的特性(相较于阿猫,阿狗,它们都是动物,却有自己的特性),我们没有唯一的一种能够代表动物的东西(当然,这是相对于猫、狗来说的,在生物学上,动物还是有办法来定义的),这时我们可以用抽象类来描述它。当我们用某个类来具体描述“猫”时,这个类就可以继承“动物”这个抽象类,然后加以具体描述。抽象类的子类在类中必须实现抽象类中的抽象方法,比如说动物类中的跑和叫,在子类中(猫类,狗类)必须实现其是如何跑,怎么叫。抽象方法没有方法体,且用abstract修饰。

下面我们来系统的介绍一下抽象类:

特点

a.      抽象方法和抽象类用关键字abstract表示。

b.      抽象类不能被实例化

c.      有抽象方法的类一定是抽象类(或者接口);抽象类中不一定有抽象方法。

d.      如果一个类继承抽象类,那么这个类要么本身也是抽象类,要么这个类重写父类的所有抽象方法。

用途

强制要求子类必须完成某些功能。

成员特点

A.     成员变量 -- 可以有成员变量,也可以有常量

B.     构造方法 -- 有构造方法,用于子类访问父类之前,对父类数据进行初始化。

C.     成员方法 -- 可以有抽象方法,也可以有关非抽象方法。

i.           抽象方法是为了要求子类做某些事情。

ii.           非抽象方法时为了提高代码复用性,被子类继承。

注意:

不能与final、private、static 共存。

抽象类(abstract class)的定义方式如下:

public abstract class AbstractClass             //里面至少有一个抽象方法
{
   public int a;  //普通数据成员
   public abstract void method1();  //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
   public abstract void method2();
   public void method3();      //非抽象方法
         publicvoid method3(){
       ……      //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
   }
}

接口

定义

是一种特殊的抽象类。比抽象类更抽象,因为它里面的方法都是抽象的。

格式

Class 类名  implements 接口名

{

}

特点

A.       接口不能实例化。

B.       接口中的方法:

a)        要么被子类重写

b)        要么子类也是抽象类。

成员特点

成员变量 -- 接口中只有常量。

因为接口的成员变量有默认修饰符。推荐:永远自己给出修饰符,public static  final

构造方法 -- 接口中没有构造方法。

任何类如果没有继承父类,那么这个类就继承Object类

成员方法 -- 接口中的方法都是抽象的。

因为接口中的 成员方法有默认修饰符。推荐:永远自己给出修饰符,public abstract

思想特点:

1.        对外暴露的规则。

2.        程序的功能扩展

3.        降低耦合性

4.        用来多实现。

接口(interface)的定义方式如下:

interface Interface
{
   public static final int i;  //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final 修饰,会隐式的声明为static和final,但是建议永远自己给出修饰符public static  final
  public abstract void method1();  //接口中的方法一定是抽象方法,所以可以不用abstract修饰,但是建议永远自己给出修饰符public abstract
   public void method2();  //接口中不能赋予方法的默认行为,即不能有方法的具体实现。(注意,此处及省略了abstract.)
}
class zi implements Interface
{
         publicvoid method1()
         {
                   ……                   //把接口中的抽象方法重写
         }
         public void method2()
         {
                  ……                   //注意,是把抽象方法全部重写(接口里的方法全部是抽象方法)
          }
}

//另一种情况,子类也是抽象类,此时可以不重写接口中的方法
/*
abstract  class zi  implements Interface
{
         public abstract void method1();                //没有重写

         public  void method2()                               //重写了method2()
         {
                   System.out.println("重写了method2()");
         }
}
*/

抽象类与接口的对比


抽象类


接口


成员特点


成员变量


变量或常量


常量

默认修饰符 public static final


构造方法




成员方法


抽象方法或非抽象方法


抽象方法

默认修饰符public abstract


设计理念


理念


被继承,定义的是整个继承体系的共性内容


被实现,定义的是整个体系的扩展内容


体现


is a


like a


关系特点


类与类


继承关系,只能单继承,可以多层继承


类与接口


实现关系,可以单实现,也可以多实现。还可以继承一个类的同时,实现多个接口。


接口与接口


继承关系,可以单继承,也可以多 继承。

补充:

进一步理解,关于java中引入抽象类、接口的目的,度娘上有高手的答复如下:

1、从类的层次结构上看,抽象类是在层次的顶端,但在实际的设计当中,一般来说抽象类应当是后面才会出现。为什么?实际上抽象类的获取有点像数学中的提取公因式:ax+bx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。因此在设计过程中如果你得到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。

2、interface从表面上看,和抽象类很相似,但用法完全不同。它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。一个典型的例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以不管你是学生,白领、蓝领还是老板,只要有驾照就是司机。

interface DriverLicence {
        Licence getLicence();
}

class StudentDriver extends Student implements DriverLicence
{
}
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements DriverLicence
{
}
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements DriverLicence
{
}
class BossDriver extends Boss implements DriverLicence
{
}
 

当我定义了“汽车”类后,我就可以指定“司机”了。

class Car {
       setDriver(DriverLicence driver);
}

这时候,Car的对象并不关心这个司机到底是干什么的,他们的唯一共同点是领取了驾照(都实现了DriverLicence接口)。这个应当是接口最强大的地方也是抽象类无法比拟的。

小结

抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体,因而实用性可能更高一点。两者的出现一方面是减少了代码量,提高了效率,另一方面照应前面提到的继承和多态,使得程序符合面向对象的思想特点,对修改关闭,对拓展开放。

时间: 2024-10-07 00:11:12

Java基础——抽象类和接口的关系的相关文章

详解java基础--抽象类、接口与多态

抽象类.接口.多态都是面向对象中很基础的东西,我相信看到能本篇博客的人本不会再纠结它的基本定义了,本篇文章将尽量的更加深层次的挖掘其内涵,希望能对大家有帮助. 一.抽象类 1.形式 1 abstract class Ceshi 2 { 3 abstract void show(); 4 } 5 class DemoA extends Ceshi 6 { 7 void show() 8 { 9 System.out.print("Hello world"); 10 } 11 } 2.特点

Java基础-抽象类和接口

抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来.     例如:狼和狗共性都是犬科,犬科就是抽象出来的概念. 抽象类: Java中可以定义没有方法体的方法,该方法的具体实现由子类完 成,该方法称为抽象方法,包含抽象方法的类就是抽象类. 抽象方法的由来: 多个对象都具备相同的功能,但是功能具体内容有所不

黑马程序员----java基础---抽象类和接口,附相关面试题

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一:抽象类(掌握) (1)把多个共性的东西提取到一个类中,这是继承的做法. 但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体. 也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样. 所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体. 而一个没有具体的方法体的方法是抽象的方法. 在一个类中如果有抽象方法,该类必须定义为抽象类. (2)抽象类的特点 A:

java基础-抽象类与接口(转)

抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类       我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类.比如new Animal(),我们都知道这个是产生一个动物Animal对象,但

黑马程序员-java基础-抽象类和接口

1,抽象类中可以有构造方法,主要是当实例化子类时,进行初始化. 2,抽象类中可以没有任何抽象方法 意义在于不让外界创建对象. 3,抽象类和关键字的共存问题 private abstratc method();  // 要重写,但又不支持重写 final abstract method();   //final 是让子类不重写 static abstract method(); // 方法属于类,必须实现 1,抽象类可以实现接口 其中的方法可以实现,也可以不实现. 2.成员特点 成员变量(接口中很

Java基础--抽象类与接口

抽象类: /** * 抽象类,对类的抽象描述,包括属性.方法的抽象描述 * @author 尘世间迷茫的小书童 * */ public abstract class Myabstract { /** * 抽象类属性想要被子类继承,修饰符不能为private */ public String name; public String sex; public int age; /** * 抽象类中的方法可以有选择的实现 */ public void testDo() { } public void t

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

java基础学习总结——接口

java基础学习总结——接口 一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如“金丝猴是一种动物”,金丝猴从动物这个类继承,同时“金丝猴是一种值钱的东西”,金丝猴从“值钱的东西”这个类继承,同时“金丝猴是一种应该受到保护的东西”,金丝猴从“应该受到保护的东西”这个类继承.这样金丝猴可以同时从 “动物类”.“值钱的东西类”.“应该受到保护的东西” 这三个类继承,但由于JAVA只支持单继承,因此金丝猴只能从这三个类中的一个来继承,不能同时继承这三个类.因此为了封装现实生活

java中抽象类与接口的区别

转自: http://blog.csdn.net/tp7309/article/details/10452445 二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下. 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然抽象方法是一定要有的. 抽象类是用于单一继承的,不能实例化.而继承类一定要实现抽象方法,因为抽象