抽象接口

本文深入解析Java抽象类与接口的概念、用法及区别,包括抽象类的特性、抽象方法、接口的定义、实现机制及两者在软件设计中的应用。通过实例说明,帮助读者理解并掌握面向对象编程中的关键概念。

一、.什么是上转型对象及其基本特征?
上转型对象—子类对象赋值给父类变量。
例如:

package com.szx.lx1;

public class Person {
	public void testPerson() {
		System.out.println("父类Person 的实例方法");
	}
}

package com.szx.lx1;

public class Student extends Person {	
	public void testStudent() {
		System.out.println("子类Student的实例方法");
	}


}
package com.szx.lx1;

public class Test1 {

	public static void main(String[] args) {
		//上转型对象--子类对象赋值给父类变量
		//Person上转型对象表示将子类对象向上转型成父类对象
		Person person = new Student(); //person上转型对象
		//上转型对象可以调用被子类继承的变量和方法,不能调用子类自己创建的变量和方法
		person.testPerson();
		//Person.testStudent();
		//上转型对象不能调用子类自己创建的变量和方法,那么如果一定要强制使用子类自己创建的变量和方法,此时我们需要将上转型对象强制类型转换成子类对象。
		Student stu=(Student)person;
		stu.testStudent();
	}

}

在这里插入图片描述

上转型对象的可以调用被子类继承的变量和方法,不能调用子类自己创建的变量和方法。
上转型对象不能调用子类自己创建的变量和方法,那么如果一定要强制使用子类自己创建的变量和方法,此时我们需要将上转型对象强制类型转换成子类对象。
二、什么是抽象类?
类–用来描述具有共同性质的一组事物的自定义复合数据类型
通过class关键字创建一个java类。
通过abstract 修饰的java类就是抽象类。

格式: 访问修饰符  abstract  class  类名{}

例如:

public  abstract  class Hello{ }

三、为什么要使用抽象类?
抽象类的出现体现出java的重构.[重复的动作提取出来]
抽象类是提供可以由子类共享的一般形式,由子类根据自己的实际情况去处理这个一般形式。
例如:坐车收费,出租车有收费功能【1元/公里】,公交车有收费功能【全程1元】
抽象类的子类往往都是同一种事物。
四、抽象类中可以有哪些元素?
抽象类中的元素实例变量、类变量、构造方法、实例方法、类方法、【抽象方法】。
抽象方法–abstract修饰,没有方法体的方法。
抽象方法就是抽象类提供给子类的一般形式。
抽象类中可以有抽象方法,也可以一个抽象方法都没有。普通的java类中是不能有抽象方法的。

例如:

package com.lx.cxl;

public abstract  class MyAbstractClass {
	public  int  id=1001; //实例变量
	public static String  name="zhangsan"; //类变量
	
	public MyAbstractClass() {
		System.out.println("构造方法");
	}
	
	public  void  testMethod() {
		System.out.println("实例方法");
	}
	
	public static void  staticMethod() {
		System.out.println("类方法");
	}
	//abstract修饰,没有方法体的方法就是抽象方法
	//抽象方法就是抽象类提供给子类的一般形式
	//抽象类中可以有抽象方法,也可以一个抽象方法都没有
	public abstract  void  abstractMethod();
	
}

五、抽象类的具体用法
1.抽象类不能new
2.普通的java类继承了抽象类,就需要重写抽象类中的抽象方法,否则将这个普通的java类改成抽象类。
3.抽象类可以继承其他的抽象类,可以不用重写抽象方法。
4.利用上转型对象创建出抽象类对象
5.抽象类对象可以访问抽象类中的实例变量、类变量、构造方法、实例方法、类方法、【抽象方法】。
6.抽象类对象访问抽象方法时候实际上访问的是子类重写以后的抽象方法。
7.当某一个普通的java类中的方法参数是抽象类类型的时候,可以传递上转型对象,也可以是抽象类的子类对象。
例如:

package com.lx.cxl;

public abstract  class MyAbstractClass {
	public  int  id=1001; //实例变量
	public static String  name="zhangsan"; //类变量
	
	public MyAbstractClass() {
		System.out.println("构造方法");
	}
	
	public  void  testMethod() {
		System.out.println("实例方法");
	}
	
	public static void  staticMethod() {
		System.out.println("类方法");
	}
	//abstract修饰,没有方法体的方法就是抽象方法
	//抽象方法就是抽象类提供给子类的一般形式
	//抽象类中可以有抽象方法,也可以一个抽象方法都没有
	public abstract  void  abstractMethod();
	
}

package com.lx.cxl;

public class SunClass extends MyAbstractClass {
	//子类重写抽象类的抽象方法
	//去掉abstract,加上方法体
	public void abstractMethod() {
		System.out.println("子类重写抽象类的抽象方法");
	}
}

package com.lx.cxl;

public class Test1 {
public static void main(String[] args) {
		//抽象类的具体用法
		//1.抽象类不能new
		//MyAbstractClass mac=new MyAbstractClass();
		//2.利用上转型对象创建出抽象类对象
		MyAbstractClass mac=new SunClass();
		System.out.println("id=="+mac.id);
		System.out.println("name=="+MyAbstractClass.name);
		System.out.println("name=="+mac.name);
		mac.testMethod();
		mac.staticMethod();
		//子类重写以后的抽象方发
		mac.abstractMethod();	
		MyClass  mc=new MyClass();
		//当某一个普通的java类中的方法参数是抽象类类型的时候,可以传递上转型对象,也可以是抽象类的子类对象
		mc.testMyClass(mac);
		//抽象类的子类对象
		SunClass  sun=new SunClass();
		mc.testMyClass(sun);
	}
}

在这里插入图片描述

5.17.什么是接口?
通过interface关键字修饰的java元素就是接口。

package com.wangxing.test1;
//接口
public interface MyInterface {

}

5.18.为什么要使用接口?
接口的出现体现出java的扩展.[为了以后程序扩展方便]
接口是提供可以由子类共享的一般形式,由子类根据自己的实际情况去处理这个一般形式。
例如:收费,出租车有收费功能【1元/公里】,飞机有收费功能【全程1000元】
接口的子类往往都是不同种类事物。
接口主要是提供功能,提供功能不去实现该功能,由不同的不同种类事物去实现。
为了克服java的单继承问题,可以使用接口,可以被使用多个。
5.19.接口中可以有哪些元素?
接口中可以有类变量、类方法、抽象方法。
1.接口中变量一定是 public static修饰的类变量。
2.接口中的类方法一定是public修饰的,public可以被省略
3.接口中的抽象方法一定是public abstract修饰的,public abstract可以省略
例如:
package com.wangxing.test1;
//接口
public interface MyInterface {
//接口中的变量一定是 public static修饰的类变量
// public static是可以省略
public int id=1001; //类变量
int age=23;
public static String name=“lisi”; //类变量
//接口中没有构造方法
//public MyInterface() {}
//接口中没有实例方法
//public void testMethod() {}
//接口中的类方法一定是public修饰的,public可以被省略
public static void staticMethod() {}
//接口中的抽象方法一定是public abstract修饰的
//public abstract可以省略
public abstract void abstractMethod1();
abstract void abstractMethod2();
void abstractMethod3();
}
5.20.接口的具体用法
1.接口不能new
2.类可以通过implements关键字去实现一个/多个接口
实现一个public class MyClass implements MyInterface{}
实现多个接口 public class MyClass implements MyInterface1,MyInterface2,…,MyInterface_n{}
3.普通的类去实现一个/多个接口,就需要将每一个接口中的抽象方法重写,否则就需要将这个普通的类改成抽象类.
4.抽象类去实现一个/多个接口,不需要重写接口中的抽象方法。
5.接口可以继承接口,并且可以继承父接口中的所有元素.

package com.jiekou_1;
//接口可以继承接口,并且可以继承父接口中的所有元素
public interface DemoInterface extends MyInterface{

}

6.利用接口回调对象创建出接口对象
7.当某一个普通的java类中的方法参数是接口类型的时候,可以传递接口回调对象,也可以是接口的子类对象。
例如:

package com.jiekou_1;

public interface MyInterface {
	//接口中的变量一定是public static 修饰的类变量
	//public static是可以省略
	public int id=1001; //类变量
	int age=23;
	public static String name="lisi"; //类变量
	//接口中没有构造方法
	//public MyInterface(){}
	//接口中没有实例方法
	//public void testMethod(){}
	//接口中的类方法一定是public修饰的,public可以被省略
	public static void staticMethod() {
		System.out.println("接口中的类方法");
		
	}
	//接口中的抽象方法一定是public abstract修饰的
	//public abstract 可以省略
	public abstract void abstractMethod1();
	abstract void abstractMethod2();
	void abstractMethod3();
}

package com.jiekou_1;
//类可以通过implements关键字去实现一个/多个接口
//普通的类去实现一个/多个接口,就需要将每一个接口中的抽象方法重写,否则就需要将这个普通的类改成抽象类
public class MyClass implements MyInterface {

	@Override
	public void abstractMethod1() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void abstractMethod2() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void abstractMethod3() {
		// TODO Auto-generated method stub
		
	}

}

package com.jiekou_1;

public class DoClass {
	public void test(MyInterface inter) {
		
	}
}

package com.jiekou_1;

public class Test1 {

	public static void main(String[] args) {
		//1.接口不能new
		//new MyInterface();
		MyInterface inter1=new MyClass();
		System.out.println(inter1.name);
		MyInterface.staticMethod();
		inter1.abstractMethod1();
		DoClass dc = new DoClass();
		dc.test(inter1);
		MyClass mc = new MyClass();
		dc.test(mc);
	}

}

在这里插入图片描述

5.21.抽象类与接口的区别

在这里插入图片描述

5.22.什么是接口回调对象及其基本特征?
接口回调对象与上转型对象很相似
上转型对象–子类对象赋值给父类变量。
接口回调对象—实现了该接口的子类对象赋值给接口变量。
接口回调对象可以调用被子类重写的抽象方法,但是不能调用子类自己的定义的变量和方法,如果一定要调用子类自己的定义的变量和方法,那么就需要将接口回调对象强制类型转换成子类对象
例如:

package com.jkhd_1;

public interface TestInterface {
	void testMethod();
}

package com.jkhd_1;

public class SunClass implements TestInterface {
	public void sunMethod() {
		System.out.println("SunClass类的实例方法");
		
	}
	public void testMethod() {
		System.out.println("子类重写接口的抽象方法");
	}
}

package com.jkhd_1;

public class Test1 {

	public static void main(String[] args) {
		//接口回调对象--实现了该接口的子类对象赋值给接口变量
		TestInterface inter1 =new SunClass();
		//接口回调对象可以调用被子类重写的抽象方法,但是不能调用子类自己的定义的变量和方法
		inter1.testMethod();
		//inter1.sunMethod();
		//如果一定要调用子类自己的定义的变量和方法,那么就需要将接口回调对象强制类型转换成子类对象
		SunClass sc=(SunClass)inter1;
		sc.sunMethod();
	}

}

在这里插入图片描述

5.23.static \ this \ super \ final 关键字的用法
static–静态的【提前分配内存】
修饰的变量就是静态成员变量【类变量】,可以用类名访问,也可以用对象访问
修饰的方法就是静态方法【类方法】,可以用类名访问,也可以用对象访问
this—本类对象【出现在哪一个类中就表示哪一个类的对象】
本类中调用本类的实例变量\类变量\实例方法\类方法,可以省略
this是不能出现在静态方法中
super–子类中表示父类对象
子类中访问父类构造方法“super([参数])”。
子类中访问父类的实例方法/实例变量”super.实例变量/实例方法”。
final—最终的
final修饰的变量不能被重新赋值。
fianl修饰的静态成员变量叫静态常量。【静态常量全字母大写】
例如: public final static String TEXT=“java”;
final修饰的方法不能被重写。
final修饰的类不能被继承,没有子类。

例如:

package com.final_1;
//final修饰的类不能被继承,没有子类。
//public final class TestClass {
public class TestClass {
	public final String name = "zhangsan";
	//fian修饰的静态成员变量叫静态常量【静态常量全字母大写】
	public final static String TEXT ="java";
	public final void info() {
		System.out.println("父类TestClass类的实例方法");
	}
}
package com.final_1;

public class MyClass extends TestClass{
	//final修饰的方法不能被重写
		/*
		public  void info() {
			System.out.println("子类重写父类的方法");
		}
		*/
}

package com.final_1;

public class Test1 {

	public static void main(String[] args) {
		TestClass tc = new TestClass();
		System.out.println("name=="+tc.name);
		//fina修饰的变量不能被重新赋值
		//tc.name = "lisi";
		System.out.println("name=="+tc.name);
		tc.info();
		MyClass mc =new MyClass();
		mc.info();

	}

}

在这里插入图片描述

<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、付费专栏及课程。

余额充值