抽象类和接口

本文详细解读了Java中的abstract关键字、抽象类、抽象方法,以及接口的概念、用法和区别。涉及抽象类的实例化、接口的常量与方法定义、匿名类和接口的应用,如代理模式和工厂模式。重点讲解了接口间的继承、实现类的选择和冲突解决策略。

abstract关键字和抽象类和抽象方法:

abstract关键字:只能修饰方法

1abstract修饰类:该类不能实例化。该类的作用是让子类继承,从而重写该类中的方法,从而实现多态。

2、abstract修饰方法:有抽象方法的类必为抽象类。该方法只有声明,没有参数和方法体。

 

▲abstract只能用来修饰方法,不能修饰变量、代码块、构造器;不能用来修饰private方法,static方法,final方法,final类。

 

抽象类中除了抽象方法其他可以包含和正常类一样的内容。

▲子类若全部重写抽象类中的抽象方法,该子类才不是抽象类,可以实例化。

▲子类若没有全部重写抽象类中的抽象方法,该子类还是抽象类。

 

类的匿名类和匿名对象:

非匿名类的对象:

 

匿名类的对象:

匿名类没有事先定义出来,它是在使用的时候才被定义的。

匿名类需要有继承关系。

 

 

接口:

接口的含义:有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征。

接口内部成员的定义:

1、接口内部只可以定义全局常量(都由public static final修饰,但可以省略 public static final ,只保留“类型 变量”),抽象方法(都由public  abstract修饰,但可以省略“ public abstract 或“abstract”,只保留“返回值 方法名(形参);”或“public 返回值 方法名(形参);”),静态方法default方法

2、接口中不能定义构造器,所以自身也不能实例化

▲接口interface和类class是并列关系或者可以理解为一种特殊的类。从本质上讲,接口是一种特殊的抽象类

▲开发中,让实现类去实现(而非继承)接口。若实现类全部重写接口中的抽象方法,该类才不是抽象类,可以实例化;若实现类没有全部重写接口中的抽象方法,该类还是抽象类。

▲java类可以实现多个接口,弥补了java的单继承性。

格式:class AA extends BB implements CC,DD,EE{

}

▲接口和接口之间可以继承,包括多继承

▲与继承关系类似,接口与实现类之间存在多态性。接口的主要用途就是被实现类实现。

▲接口实际上是一种规范。

 

▲接口中定义的静态方法有执行语句,只能自己调用,不能由实现类对象调用。这条也适用于非接口,普遍性。

▲接口中的default方法也有执行语句,可以被实现类实现,重写,调用。

 

▲若父类和接口中有同名属性,在子类(或实现类)中必须显式区分(super.属性或接口.属性)

类优先原则

定义:如果子类(或实现类)继承了父类且实现了接口,父类和接口中有同名同参数的默认方法,若子类中不重写该方法,则默认调用的是父类中的方法。(之所以规定是默认方法是因为如果是同名同参数抽象方法,因为子类或实现类必须要重写抽象方法,所以起作用的还是在子类或实现类中,没必要讨论)

   接口冲突:

定义:如果实现类实现了多个接口,接口和接口中有同名同参数的默认方法,若子类中不重写该方法,则报错。

如果子类中重写了父类或  接口中的某个默认方法,则:①若要在子类中调用父类该默认方法,用“super.方法名(形参)”。②若要在实现类中调用接口中的默认方法,可以通过“接口名.super.方法名(形参)”。

 

创建接口的非匿名实现类对象:

匿名实现类对象:

 

 

接口的应用:

1、代理模式

2、工厂模式

### 抽象类接口的区别与相同点 #### 相同点 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..."); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值