抽象、接口

抽象类

概念:在一个类中存在一个功能,仅仅方法声明,没有方法体(抽象方法),需要将该类定义抽象类。

举例:动物 -----> 本身不是具体的(抽象的动物类)

​ 动物的吃或者睡应该定义为抽象功能 ----> 必须强制子类必须重写抽象功能!(具体的动物:猫,狗等等)

特点

  • ​ 1)如果一个类中有抽象方法,那么该类一定是抽象类;

    ​ 如果一个类是抽象类,那么该类中不一定存在抽象方法;

  • ​ 2)抽象类不能实例化(不能创建对象)

  • ​ 3)抽象类不能实例化,如何实例化呢?

    ​ 抽象类需要通过子类进行实例化,父类引用指向子类对象(父类是抽象类):抽象类多态!

    ​ 抽象的父类是通过子类进行实例化,那么如果子类也是一个抽象类,子类也就不能实例化。

  • ​ 4)抽象方法的格式:没有方法体的方法

    ​ 权限修饰符 abstract 返回值类型 方法名(形式参数)

    ​ abstract:表示抽象

    ​ 可以修饰类,可以修饰方法

抽象类 必须强制子类完成的事情!(将抽象类中所有的抽象方法重写)

//定义一个Animal类
/*
class Animal{//这个必须使用抽象来定义
	
	//具体的动物才具体的吃的功能,将吃的功能抽象(没有方法体)
	public abstract void eat() ;
	
}
*/
//抽象的父类
abstract class Animal{//这个必须使用抽象来定义
	
	//具体的动物才具体的吃的功能,将吃的功能抽象(没有方法体)
	public abstract void eat() ;
	public abstract void sleep();
	
}
//创建具体的子类
//abstract class Cat extends Animal{//本身就一个子类,还抽象类,没有意义!(不能实例化)
class Cat extends Animal{//必须强制类重写父类的抽象方法
	
	public void catchMouse() {
		System.out.println("猫抓老鼠");
	}

	@Override //检查当前这个方法是否是重写父类的功能
	public void eat() {
		System.out.println("猫吃鱼");
	}

	@Override
	public void sleep() {
		System.out.println("猫趴着睡觉");
	}
}

//测试类
public class AbstractDemo {
	public static void main(String[] args) {
		//创建Animal类对象
		//Animal a = new Animal() ; //抽象类不能实例化
		
		//抽象类多态:父类引用指向子类对象
		Animal a = new Cat() ;//向上转型
		a.eat();
		a.sleep();
		//a.catchMouse();
		//向下转型
		Cat c = (Cat)a ;
		c.catchMouse();
	}
}

抽象类的成员特点:

1)成员变量

​ 即可定义一个常量,也可以定义为变量

2)成员方法:

​ 既可以定义抽象方法,也可以定义非抽象方法

3)构造方法:

​ 存在构造方法,既可以有参构造也可以是无参构造方法(作用:对数据进行初始化)

抽象类成员方法特点:

  • 成员方法如果是抽象方法,必须强制类完成的事情

  • 成员方法如果是非抽象方法,子类继承父类–来提高代码的复用性!

如果一个类中没有抽象方法,那么这个类可不可以定义为抽象类呢?有什么意义?

  • 1)可以定义.
  • 2)意义就是不能直接创建对象!
    • 该抽象类中的一些功能的返回值可能就是该类本身!
    • 例如(日历类:Calendar它就是抽象类,里面的功能
    • getInstance()非抽象方法,返回值就是该类本身)

abstract关键字不能和哪些关键字共用 (定义成员方法的时候)

  • 和final关键字冲突
  • 和private关键字冲突
  • 和static关键字冲突
  • 能够和public或者protected权限修饰符使用!

接口

**接口:**体现的是事物的一种扩展性功能.(本身不具备的,经过一些学习才能具备的功能!)

​ 举例:猫和狗本身不具备的跳高的功能,经过特殊的训练—>具备这个功能!

接口如何表示:interface

接口中的注意事项:

  • 1)接口中只能定义抽象方法

  • 2)接口不能实例化

  • 3)接口如何实例化呢?

    通过接口的子实现类来进行实例化!

    **格式:**接口名 对象名 =new 子实现类名(); 接口多态!

    接口和子实现类之间的关系:实现关系(implements)

    一般开发定义接口的子实现类的时候 , 类名: 接口名 + Impl

  • 4)接口的子实现类

    4.1)子实现类不是具体类(抽象类)---->抽象类不能实例化—存在具体的子类

    4.2)子实现类研究的都是具体类! 因为具体的子实现类可以实例化(创建对象!)

package com.qianfeng_interface_03;

//定义一个接口:动物跳高接口
interface AnimalJump{ //体现的一种扩展功能(额外的功能,本身事物不具备的功能)
	
	/*public abstract void jump() {//Abstract methods do not specify a body :抽象方法中不能有方法体
		System.out.println("可以跳高了" ) ;
	}*/
	
	public abstract void jump() ;
}
//定义一个接口的子实现类
class CatJumpImpl implements AnimalJump{

	@Override
	public void jump() {
		System.out.println("猫可以跳高了...");
	}
	
}

//测试类
public class InterfaceDemo {

	public static void main(String[] args) {
		//创建对象
		//AnimalJump aj = new AnimalJump() ; //接口不能实例化
//		格式:接口名  对象名  =new 子实现类名();    接口多态!
		AnimalJump aj = new CatJumpImpl() ; 
		aj.jump();
	}
}

接口中 成员特点:

  • 成员方法:

    只能是抽象方法,存在默认的修饰符,public abstract

  • 成员变量:

    只能是常量.存在默认的修饰符:public static final

  • 构造方法:

    不存在构造方法!

类与类之间 (继承关系:extends ) :

​ 只支持单继承,不支持多继承,但是可以多层继承!

类与接口之间的关系 (实现关系)implements :

​ 一个类继承另一个类的同时,可以实现多个接口!

格式:类名 implements 接口名1,接口名2{

​ 重写每一个接口中的抽象方法

​ }

接口与接口 (比如:集合框架 Collection—>List Set)

是继承关系,extends

​ (提高代码的复用性! 父接口中有的功能,子接口也具备该功能)

​ 既可以单继承,也可以多继承!

<think> 首先,用户的问题是基于之前的系统级指令和用户可见层的指示。系统级指令要求:所有行内数学表达式使用$...$格式,独立公式用$$...$$,LaTeX语法正确,中文回答,生成相关问题,回答中引用的段落末尾添加引用标识。 用户的问题是关于Java抽象接口的:用户说“我想了解Java抽象接口的相关知识 请问Java抽象接口的概念、特点和使用方法”。但用户使用了“抽象接口”这个词。在Java中,通常没有“抽象接口”这个术语;接口本身就是抽象的。用户可能指的是“抽象类”和“接口”,因为在引用中提到了这些。 引用[1]说:“接口是特殊的抽象类”,引用[2]讨论了接口的特点,引用[3]讨论了抽象类接口。 所以,我需要澄清:用户问的是“Java抽象接口”,但在Java中,接口已经是抽象的,所以我认为用户可能误用了术语,或者指的是接口抽象特性。我应该基于引用来解释接口的概念、特点和使用方法,并提及抽象类作为对比。 我的回答必须结构化,帮助用户逐步解决问题。结构应该清晰:先概念,再特点,最后使用方法。 回答必须是中文。 引用标识:当引用参考内容时,在段落末尾添加引用标识如[^1]。参考内容是引用[1],[2],[3],所以我需要适当地引用它们。 生成相关问题:在回答结束时,生成相关问题。 关键点: - **概念**:解释接口是什么。接口是一个完全抽象的类,只包含抽象方法和常量(public static final变量)。 - **特点**: - 接口中的方法默认为public abstract,不需要显式声明。 - 变量默认为public static final。 - 支持多继承:一个类可以实现多个接口,一个接口可以继承多个接口。 - 不能被实例化;只能被类实现。 - **使用方法**: - 定义接口:使用`interface`关键字。 - 实现接口:类使用`implements`关键字来实现接口,并提供所有抽象方法的实现。 - 接口继承:接口可以使用`extends`继承其他接口。 与抽象类的对比:用户提到了“抽象接口”,但实际是接口。我可以简要对比抽象类接口以澄清。 抽象类的概念: - 抽象类使用`abstract`关键字声明。 - 可以包含抽象方法(没有实现的方法)和具体方法。 - 不能被实例化;必须被子类继承。 - 支持单继承(Java中类不能多继承)。 接口的特点: - 完全抽象;只有方法签名和常量。 - 支持多继承(一个类实现多个接口)。 来自参考的内容: - 引用[1]:接口是特殊的抽象类,支持多继承,方法是public abstract省略,变量是public static final省略。 - 引用[2]:接口特点:变量public static final,方法public abstract,支持多继承。 - 引用[3]:抽象类接口的区别;抽象类用于校验,接口定义契约。 在回答中,我应该自然地引用这些。例如,解释特点时,引用参考。 结构回答: 1. **概念**:什么是Java接口(用户说“抽象接口”,但我应该纠正为接口)。 2. **特点**:列出接口的主要特性。 3. **使用方法**:如何定义、实现和使用接口。 4. **与抽象类的对比**:简要对比以澄清。 5. **相关问题**:结束时生成相关问题。 确保回答真实可靠:基于Java知识,参考提供的引用。 生成相关问题: - 类似示例:关于快速排序的性能、优化、应用。 - 所以,对于Java接口,问题如: 1. 接口在实际开发中的应用场景? 2. 如何设计一个良好的接口? 3. 接口在多重继承中的优势? LaTeX:用户问题中没有数学表达式,所以可能不需要。但如果提到概念,如抽象类,使用行内格式如$abstract class$(如果需要)。但在Java中,通常是代码块而不是数学。系统指令说“所有行内数学表达式”,但这里是编程概念。可能不需要LaTeX,除非有数学公式。但在回答中,主要是文本描述。 代码块:类似快速排序示例,我应该包括Java代码示例来展示接口的定义和实现。 例如: ```java interface Animal { void makeSound(); // 抽象方法 } class Dog implements Animal { public void makeSound() { System.out.println("Bark"); } } ``` 回答结构: - 开头:直接回答问题。 - 主体:分部分解释概念、特点、使用方法。 - 结束时:生成相关问题。 引用标识:当使用引用内容时添加。 例如:接口是特殊的抽象类...[^1]。 最终输出格式: - 回答问题。 - §§相关问题§§ 1. ... 2. ... </think> ### Java 接口的概念、特点与使用方法 Java 中的“接口”(Interface)是一种引用数据类型,设计用于定义对象行为的契约。尽管用户提问中使用了“抽象接口”一词,但在 Java 官方术语中,接口本质上就是抽象的——它强制实现类提供具体方法的实现,但不能被直接实例化(类似于抽象类)。以下基于您的引用内容,逐步解释接口的概念、特点和使用方法。我将结合 Java 语法示例来确保清晰性。 #### 1. **接口的概念(什么是接口?)** - 接口是一个完全抽象的类,仅声明方法签名和常量(变量),不提供任何方法实现。这使得接口成为定义“行为规范”的工具,强制实现类遵守特定规则。 - 接口不能被实例化;只能通过类来实现(使用 `implements` 关键字)。例如: ```java // 定义一个接口 interface Vehicle { void start(); // 抽象方法声明 void stop(); // 抽象方法声明 } ``` - 与抽象类的区别:抽象类可以有部分实现的具体方法(如带方法体的普通方法),而接口只能有抽象方法(Java 8 前)或默认实现(Java 8 起)。接口是“更纯粹”的抽象形式,用于解决多重继承限制[^1][^3]。 #### 2. **接口的特点(接口的核心特性)** 接口的设计强调简洁性和一致性,主要特点包括: - **方法隐式抽象**:接口中的所有方法都是 `public abstract`(公共抽象),无需显式写出关键字。例如,声明 `void move();` 等同于 `public abstract void move();`[^1][^2]。 ```java interface Printable { void print(); // 编译器自动添加 public abstract } ``` - **变量隐式常量**:所有变量默认为 `public static final`(公共静态常量),必须初始化且不可修改。例如: ```java interface Constants { int MAX_VALUE = 100; // 等同于 public static final int MAX_VALUE = 100; } ``` - **支持多继承**:Java 类仅能单继承(`extends` 一个父类),但接口支持多重实现(`implements` 多个接口)。此外,接口还可以继承多个接口(`extends` 多个父接口)。 ```java interface Flyable { void fly(); } interface Swimmable { void swim(); } // 接口继承多个接口 interface Amphibious extends Flyable, Swimmable {} ``` 这种特性使接口能灵活扩展功能,间接解决类无法多重继承的问题[^1][^2]。 - **访问修饰符限制**:所有元素(方法和变量)必须是 `public`,不能是 `private` 或 `protected`。省略修饰符时,编译器自动添加 `public`[^1][^2]。 #### 3. **接口的使用方法(如何定义、实现和应用接口)** 接口的使用分三步:定义、实现和调用。以下是详细步骤: - **定义接口**:使用 `interface` 关键字声明,仅包含抽象方法和常量。 ```java // 定义接口 interface PaymentGateway { void processPayment(double amount); // 抽象方法 String getCurrency(); // 抽象方法 double MAX_AMOUNT = 10000.0; // 常量 } ``` - **实现接口**:类通过 `implements` 实现接口,必须提供所有抽象方法的具体实现。如果未实现全部方法,该类必须声明为 `abstract`。 ```java // 实现接口 class PayPal implements PaymentGateway { public void processPayment(double amount) { System.out.println("Processing PayPal payment: ¥" + amount); } public String getCurrency() { return "CNY"; } } ``` 一个类可同时实现多个接口: ```java class AdvancedPayment implements PaymentGateway, Refundable { // 实现 PaymentGateway 和 Refundable 的所有方法 } ``` - **应用场景**:接口常用于: - **解耦与多态**:定义通用行为,允许多个类以不同方式实现。例如,在 GUI 开发中定义 `Clickable` 接口用于按钮和菜单。 - **插件式架构**:在框架中定义扩展点(如 Spring 的 `ApplicationListener`),便于动态添加功能[^3]。 - **API 设计**:强制类遵守规范(如 Java Collections 框架中的 `List` 接口)。 示例:使用接口实现多态。 ```java PaymentGateway gateway = new PayPal(); gateway.processPayment(500.0); // 输出:Processing PayPal payment: ¥500.0 ``` #### 4. **接口抽象类的简要对比** 接口常用于定义“行为契约”,而抽象类更适用于“部分实现”的场景: - **相似点**:两者都无法直接实例化,都需要子类/实现类提供实现[^1]。 - **关键区别**: | 特性 | 接口 (Interface) | 抽象类 (Abstract Class) | |--------------------|---------------------------------------|--------------------------------------| | 方法实现 | 无(Java 8 前)或默认方法(default) | 可有抽象方法和具体方法 | | 变量类型 | 仅常量 (`public static final`) | 常量或普通实例变量 | | 继承关系 | 支持多继承(多个接口) | 单继承(仅一个父类) | | 使用场景 | 定义行为规范、多态支持 | 复用通用代码、提供基础实现 | 在实际应用中,优先选择接口以保持灵活性,除非需要共享代码逻辑时才用抽象类[^3]。 接口是 Java 面向对象设计的核心工具,通过强制实现类遵守契约,提升代码的可扩展性和维护性。始终记住:接口定义“what to do”,实现类定义“how to do”。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值