抽象类和接口

本文详细介绍了Java中的抽象类和接口,包括抽象类的定义、特点、抽象方法的说明,以及接口的定义、使用、特性,并对比了两者之间的相似性和区别。抽象类不能被实例化,有抽象方法的类必须定义为抽象类;接口是隐式抽象的,接口中的方法默认为抽象的,接口可以被类实现,一个类可以实现多个接口。

抽象类

抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,

设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并

覆盖抽象方法,实现具体功能。

抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象

类。

● 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方

法和构造方法。

● 用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必

须定义成抽象类。

● 特点:

● 抽象类不能被实例化,但可以有构造方法,因为抽象类中含有无具体实现的方法,

所以不能用抽象类创建对象。

● 抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实

现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一

样。否则,该类也必须声明为抽象类。

/*定义一个人类,在人类中定义了一个抽象的方法*/
public abstract class Person {  
    public abstract void speak();
}
/*定义了一个中国人类继承人类,其中具体实现了speak()类 
注意:Chinese类也可以不实现具体的speak功能,但是这样Chinese类也必须定义为抽象类。
*/
public class Chinse extends Person{
​
    @Override  //重写了speak方法
    public void speak() {
        System.out.println("中国人说中国话");
    }
}

抽象方法

抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.

注意:抽象类中可以没有抽象方法,但是,有抽象方法的类一定是抽象类。

抽象方法必须用abstract关键字进行修饰

/*定义一个人类,在人类中定义了一个抽象的方法*/
public abstract class Person {  
    public abstract void speak();
}

接口

接口的定义和使用

接口的定义

jdk8之前 接口只能定义 静态常量 和 抽象方法

jdk8之后 接口增加了静态方法 默认方法.

使用 interface 关键字用来声明一个接口。

[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n]

{

// 声明常量 抽象方法 静态方法 默认方法

}

/*设计一个动物接口*/
public interface Animal{
//public static final   int num = 10;
       int num = 10; //接口中的成员变量默认是 静态常量
​
//public abstract   void eat();
       void eat();   //接口定义抽象方法
​
  //静态方法  直接通过接口名调用
  public  static void testStatic(){
      System.out.println("testStatic");
  }
​
  //默认 通过子类对象调用
  public default void testDefault(){
      System.out.println("testDefault");
  }
}

接口的使用

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

[访问修饰符] class 类名 implements 接口名1,接口名2……{ }

结合继承:

[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{ }

//public abstract class Dog  implements Animal{  
//接口实现和子类继承父类一样,实现类要么定义成抽象类,要么重写接口里面的所有抽象方法。
​
public  class Dog extends Object  implements Animal{
@Override
public void eat() {
    System.out.println("狗吃骨头");
     }
}   

接口的特性

• 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字

• 接口中方法可以是抽象的,静态的,默认的

• 接口中声明的属性默认为 public static final 的

• 接口不是被类继承了,而是要被类实现

• 接口不能实例化对象,无构造方法

• 一个类可以实现多个接口

• 与继承关系类似,接口与实现类之间存在多态性

• 一个接口能继承其它多个接口

• 当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须声明为抽象的类

接口和抽象类的相似性

1 接口和抽象类都不能实例化对象,它们都位于继承树的顶端,用于被其他类实现和继承。

2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

接口和抽象类的区别

  1. 声明时修饰符不同,接口用interface关键字修饰,抽象类修饰用abstract关键字进行修饰;

  2. 接口是被其他类实现了(关键字implements),抽象类作为一个类,被其他子类继承(extends)了。

  3. 接口里只能包含抽象方法,不能为普通方法提供方法体,实现方法;抽象类则完全可以包含普通方法。

  4. 接口中的成员变量只能是 public static final 类型的,并且必须初始化,否则通不过编译。(抽象类中的成员变量可以是各种类型的。

  5. 接口中没有构造方法(接口中只包含抽象方法,静态方法,默认方法),抽象类可以包含构造方法,抽象类里的构造方法并不是用于创建对象,而是让其子类调用这些构造方法来完成属于抽象类的初始化操作。

  6. 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。

  7. 而一个类却可以实现多个接口。却只能继承一个抽象类。

从本质上讲,接口是一种特殊的抽象类,这种抽象类中包含抽象方法。

接口存在的意义:java中一个类只能有一个父类,所以用接口可以实现多继承的逻辑 。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值