抽象类和接口以及它们之间的区别

一、抽象类和抽象方法

abstract修饰符修饰的方法称为抽象方法,修饰的类称为抽象类。

1、抽象类和抽象方法的关系

抽象类中可以没有抽象方法,但是有抽象方法的类一定要申明为抽象类。

2、语法

public abstract class Action{
    public abstract void doSomething();
}

对于一个普通方法public void doSomething(){...}来说,

public void doSomething()这一部分是方法的申明

{...}这部分是方法的实现,如果大括号中什么都不写,就叫方法的空实现

对于一个抽象方法,abstract修饰符合{...}不能同时出现,会编译报错

3、特点及作用

抽象类,不能使用new关键字来创建对象,它是用来让子类继承的

抽象方法,只有方法的申明,没有具体的方法实现,他是用来让子类实现的

注:子类继承抽象类后,需要实现抽象类中没有实现的抽象方法,否则这个子类也要声明为抽象类。

例如:

public abstract class Action{
    public abstract void doSomething();
}

public static void main(String[] args){
    //编译报错,抽象类不能new对象
    Action a = new Action();
}
 
//子类继承抽象类
public class Eat extends Action{
    
    //实现父类中没有实现的抽象方法
    public void doSomething(){
    //code
    }
}
 
public static void main(String[] args){
    Action a = new Eat();
    a.doSomething();
}

注:子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

    思考:抽象类有没有构造方法?

答:抽象类也是类,抽象类的构造方法和普通类的构造方法一样,都是用来初始化类,只是抽象类

的构造方法不能直接调用,因为抽象类不能实现实例。但是如果一个普通类继承了抽象类,便可以在构造

函数中调用抽象类的构造函数。

二、接口

  1、申明

public interface Action{

}

 

  2、接口和抽象类的区别

A) 抽象类也是类,除了可以写抽象方法以及不能直接new实例对象外,其他方面和正常类没什么区别。

B) 接口是另一种类型,和类有本质上的区别,所以不要用类的标准衡量接口。

C) 申明类的关键字是class,申明接口的关键字十interface

D) 抽象类是用来被继承的,java中的类是单继承,继承的关键字是extends

E) 接口是用来被实现的,java中的接口可以被多实现,实现的关键字是implements

  3、接口中的变量都是静态常量(public static final修饰)

接口中可以不写任何属性,但是如果写属性了,该属性必须是public static final修饰的静态常量。

当然, 在调用给的时候可以直接使用接口名访问其属性,因为是public static修饰的。例如:

public interface Action{
    public static final String NAME = “tom”;
    //默认就是public static final修饰的
    int AGE = 20;
}
 
public static void main(String[] args){
    System.out.println(Action.NAME);
    System.out.println(Action.AGE);
}

4、接口中的方法都是抽象方法

接口中可以不写任何方法,但是如果写方法了,该方法必须是抽象方法。

例如:

public interface Action{
    public abstract void run();
    //默认就是public abstract修饰的
    void test();
    public void go();
}

  5、一个类可以实现多个接口

public class Student implements A,B,C,D{
   //Student需要实现接口A B C D中所有的抽象方法
   //否则Student类就要声明为抽象类
}
public static void main(String[] args){
   A s1 = new Student();
   B s2 = new Student();
    C s3 = new Student();
    D s4 = new Student();
}

注:
     s1只能调用接口A中声明的方法以及Object中的方法
     s2只能调用接口B中声明的方法以及Object中的方法
     s3只能调用接口C中声明的方法以及Object中的方法
     s4只能调用接口D中声明的方法以及Object中的方法
    但是如果在申明s1、s2、s3、s4的时候全部申明为Student类型,那么他们可以互相调用各自的方法

注:必要时可以类型强制转换
     例如:
       接口A 中有test()
       接口B 中有run()

A s1 = new Student();

B s2 = new Student();

s1.test();

s2.run();
            
       if(s1 instanceof B){
          ((B)s1).run();
        }

  6、一个接口可以继承多个父接口

 public interface A{
    public void testA();
  }
 public interface B{
    public void testB();
 }
        
 //接口C把接口A B中的方法都继承过来了
 public interface C extends A,B{
    public void testC();
 }
        
 //Student相当于实现了A B C三个接口,需要实现所有的抽象方法
 //Student的对象也就同时属于A类型 B类型 C类型
 public class Student implements C{
    public viod testA(){}
    public viod testB(){}
    public viod testC(){}
  }
  
 public static void main(String[] args){
    C o = new Student();
    System.out.println(o instanceof A);//true
    System.out.println(o instanceof B);//true
    System.out.println(o instanceof C);//true
    System.out.println(o instanceof Student);//true
    System.out.println(o instanceof Object);//true
    System.out.println(o instanceof Teacher);//false
    //编译报错
    System.out.println(o instanceof String);
 }

注:
    System.out.println(o instanceof X);
    如果o是一个接口类型声明的变量,那么只要X不是一个final修饰的类,该代码就能通过编译,至于其结果是不是 true,就要看变量o指向的对象的实际类型,是不是X的子类或者实现类了。
    注:一个引用所指向的对象,是有可能实现任何一个接口的。(java中的多实现)

时间: 2024-08-15 01:58:47

抽象类和接口以及它们之间的区别的相关文章

Java中抽象类、接口、父类直接的区别与联系

1.抽象类与接口的区别: (1)抽象类是一个只有变量或方法申明的类,这些变量(属性)和方法都是抽象类型的.抽象类没有对方法的实现. (2)接口则是一个只有方法申明.没有方法的实现,接口的方法也同样是抽象方法,与抽象类不同的:接口只能定义static final成员变量. 2.抽象类与接口的共同点: 抽象类与接口的方法实现都是在继承的(子类)或者是实现接口的类中实现的. 2.抽象类与父类的区别: (1)抽象类与父类不同的地方在于:抽象类只能对属性或者方法的申明,不能对其实现.而继承这个类的子类一定

【转】C#中的两把双刃剑:抽象类和接口

转:http://www.cnblogs.com/djzxjblogs/p/7587735.html 第一次面试的时候, 面试官问我,抽象类和接口的区别. 本人也是,按照面试宝典上的回答,说了一大堆. 那个面试官又问:你说了一大堆, 有没有想过他们的本质区别. 当时我真的是没有想过,但回想平时用的抽象类和接口, 感觉是还是停留在表象,无奈就猜测回答:会不会是抽象类关注的是某类东西, 而接口关注的是行为特征方法等. 其实我当时真的不知道. 问题出现: 我们在使用C#的抽象类和接口的时候,往往会遇到

C#中的两把双刃剑:抽象类和接口

问题出现: 我们在使用C#的抽象类和接口的时候,往往会遇到以下类似的问题,大致归纳如下: (1)抽象类和接口有什么本质的区别和联系? (2)什么时候选择使用抽象类,然啥时候使用接口最恰当呢? (3)在项目中怎样使用才能使得项目更具有可维护性.扩展性?怎样将它和Struct,类紧密的结合,达到最终的双刃剑作用? 解决方案: 这也是我在学习抽象类和接口的时候遇到的问题,从我归纳的这三个问题,不难看出这也许是我们大多数程序员遇到问题的三个阶段, 第一阶段(基础概念):就象问题1一样,这部分人首先需要扫

Java基础-继承、抽象类、接口

继承和接口是OOP程序设计语言中非常重要的两个概念,也是经常让程序员对其使用比较混淆的.什么时候用继承好一些,什么时候用接口好一些呢? 首先,从OOP程序设计语言的多态特性来说两者都是多态的一种体现.继承更侧重于给对象进行归类(继承体系)和接口则侧重于对功能方法进行归类. 每个类都属于特定的继承体系,所有的类向上转换最终只能转成一个基类.继承将"做什么"和"怎么做"耦合在一起,如果需要复用现有的方法必须将新增的类添加到现有的继承体系中(或者采用包装类). 接口则可以

接口和抽象类之间的区别

抽象类和接口这是大多数Java APIs的基础元素.在这篇文章中,我将尝试触及两个最重要的概念. 本文是理解Java中的抽象的延续.我建议您首先阅读抽象的概念,因为它是抽象类和接口背后的主要力量. 本文中的内容: 理解抽象类 理解接口 识别明显的差异 探索抽象类vs接口的用法 理解抽象类 简单地说,抽象类是用abstract关键字声明的类.它可能包含或不包含任何抽象方法.JVM将抽象类标识为不完全的类,没有定义它完整的行为.声明类抽象导致一件事:您不能创建这个类的实例,就是这样. 那么,为什么还

抽象类和接口的区别

含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的.abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法.如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型. 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须

Java抽象类与接口的区别

很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. 抽象类 抽象类是用来捕捉子类的通用特性的 .它不能被实例化,只能被用作子类的超类.抽象类是被用来创建继承层级里子类的模板.以JDK中的GenericServlet为例: public abstract class GenericServlet implements Servlet, ServletC

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

[转]抽象类与接口的区别及应用

抽象类与接口的区别及应用 (本文由张洋提供) 抽象类(Abstract Class)与接口(Interface)是面向对象程序设计中两个重要的概念.由于两者在自身特性及应用方法上存在诸多相似性,如都不能实例化.都可以 被继承(严格来说对于接口应该叫做实现),这么一来,在许多人心中抽象类与接口的界限非常模糊,对何时该使用抽象类.何时该使用接口更是感到困惑. 本文的目的是通过对两者的讨论与比较,帮助读者认清抽象类与接口在思想本质及应用场合方面的区别,如能做到这一点,读者便可以得心应手地根据具体情况正