抽象类和接口

本文详细介绍了Java中的抽象类和接口的概念及其使用。抽象类是无法实例化的类,包含抽象方法,用于定义子类的公共接口。接口则是一种包含抽象方法和常量的特殊抽象类,用于实现多重继承。类可以通过实现接口来定义其行为,接口中的方法必须在实现类中被覆盖。了解这两者可以帮助开发者更好地设计和组织代码。

目录

一.概述

二.抽象类

2.1 抽象类的定义

 三.接口

3.1 接口的定义

3.2 接口的实现


一.概述

       我们知道,所有的对象都是通过类来描述的,但是反过来却不是这样。并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

二.抽象类

2.1 抽象类的定义

       Java语言中,用 abstract 关键字来修饰一个类时,这个类叫做抽象类。抽象类只关心它的子类是否具有某种功能,并不关心该功能的具体实现。功能的具体行为由子类负责实现。一个抽象类中可以有一个或多个抽象方法。

抽象类的一般格式如下:

abstract class Animal {  //动物类
    //类实现
}

       一旦 Animal 类声明为抽象类,则它不能实例化,只能用作子类的父类而存在。

因此下面的语句会编译错误:

Animal animal = new Animal ();

       由此可见,当一个类的定义完全表示抽象的概念时,它不应该被实例化为一个对象,而应描述为一个抽象类。

抽象方法的一般格式如下:

abstract 返回值类型 抽象方法 ( 参数列表 );

       比如语句 public abstract void Method();

       抽象方法的一个主要目的就是为所有子类定义一个统一的接口。抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。

抽象类有以下定义规则:

       1.抽象类和抽象方法必须用 abstract 关键字来修饰;

       2.抽象类不能被实例化,不能用 new 关键字生成对象;

       3.抽象方法只需声明,不需要实现;

       4.含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有抽象方法后,才能被实例化,否则这个子类还是个抽象类。  

      

 三.接口

3.1 接口的定义

        Java 只支持单一继承,而接口时 Java 实现多重继承功能的一种手段,一种结构。接口只定义了与外界交流时输入,输出的格式,换句话说,通过在接口中定义一些方法(抽象方法),可以用接口大致规划出类的共同行为,而把具体的实现留给具体的类。

       接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口声明的一般格式如下:

public interface 接口名 {
   //常量
   //方法声明
}

       常量定义和部分定义的常量均具有 public ,static 和 final 属性;

       接口中只能进行方法的声明,不提供方法的实现,在接口中声明的方法具有 public 和 abstract 属性。

3.2 接口的实现

       接口可以由类来实现,类通过关键字 implements 声明自己使用一个或多个接口。所谓实现接口,就是实现接口中声明的方法。接口中的方法被默认是 public ,所以类在实现接口方法时,一定要用 public 来修饰。

如果某个接口方法没有被实现,实现类中必须将它声明为抽象的,该类当然也必须声明为抽象的。

### 抽象类接口的区别与相同点 #### 相同点 1. 抽象类接口都不能直接实例化对象,只能作为其他类的基类或实现类使用[^1]。 2. 抽象类接口都可以包含抽象方法,这些方法需要被子类或实现类覆写后才能使用[^4]。 3. 两者都位于继承结构的顶端,用于定义通用的行为或规范[^4]。 #### 区别 1. **继承关系** - 抽象类通过 `extends` 关键字进行继承,一个类只能继承一个抽象类。 - 接口通过 `implements` 关键字实现,一个类可以实现多个接口,这弥补了 Java 的单继承限制[^1]。 2. **实现细节** - 抽象类可以包含普通方法(即带有具体实现的方法)以及抽象方法,子类可以选择性地覆写这些方法。 - 接口在 JDK 8 之前只能包含抽象方法声明,在 JDK 8 及之后可以通过 `default` `static` 关键字提供默认实现或静态方法[^5]。 3. **成员变量** - 抽象类中可以有成员变量,并且其修饰符可以是任意类型(如 `private`、`protected` 等)。 - 接口中所有的变量默认是 `public static final` 类型,不能有普通的成员变量[^3]。 4. **多态性** - 由于 Java 的单继承限制,一个类只能继承一个抽象类,因此在设计灵活性上受到一定限制。 - 接口允许多个实现,一个类可以同时实现多个接口,从而提供更高的灵活性[^1]。 5. **设计目的** - 抽象类主要用于定义一种通用的类,其子类可以基于这个通用类进行扩展。 - 接口更多地用于定义一组规范,实现多种功能的类可以实现同一个接口。 6. **抽象类的特殊性** - 即使一个抽象类不包含任何抽象方法,也可以被定义为抽象类,目的是防止该类被直接实例化[^2]。 #### 示例代码 以下是一个简单的代码示例,展示抽象类接口的使用: ```java // 抽象类示例 abstract class Animal { // 普通方法 public void breathe() { System.out.println("Breathing..."); } // 抽象方法 public abstract void makeSound(); } // 接口示例 interface Swimmable { default void swim() { System.out.println("Swimming..."); } } // 子类实现 class Dog extends Animal implements Swimmable { @Override public void makeSound() { System.out.println("Barking..."); } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值