一、前言
上文中提到Java的数据结构,本文来说一下Java中的数据类型中的引用类型中的接口
在Java中,数据类型分为两种:基本类型(Primitive Types)和引用类型(Reference Types)
1.基本类型分类
1.1整型:byte(8位)、short(16位)、int(32位)、long(64位)
1.2浮点型:float(32位)、double(64位)
1.3字符型:char(16位)
1.4布尔型:boolean
基本类型直接存储值,它们在内存中占有固定大小的空间,因此可以直接操作。
2.引用类型分类
2.1类(Class)
2.2接口(Interface)
2.3数组(Array)
引用类型的变量并不直接存储值,而是存储了一个对内存中实际对象的引用。通过这个引用,我们可以访问和操作实际的对象。引用类型的默认值是null,表示不指向任何对象。
3.void无类型
除了基本类型和引用类型之外,Java还有一种特殊的类型:void,表示无类型,通常用在不返回任何值的方法中。
二、接口(interface)
1.定义
在Java等面向对象的编程语言中,接口(Interface)是一种引用类型,它是方法和常量的集合。接口是完全抽象的,它不包含实现(方法体),只包含方法的声明和常量。
它提供了一种机制,可以用来定义一组合同或约定,供类去实现。
接口通常被用来描述一个对象可以做什么,而不是它是什么,准确的来说描述的对象的行为
2.接口中内容
2.1默认的公开(public)、静态(static)、最终(final)的常量
2.2默认的公开(public)、抽象(abstract)的方法
2.3jdk8的默认方法
2.3.1解决接口的修改与现有的实现不兼容的问题。在Java 8之前,如果一个接口需要添加新的方法,就会破坏实现该接口的所有类,因为这些类都需要实现接口中的所有方法。但是有了默认方法,新添加的方法可以有一个默认的实现,这样所有的旧类都可以不用改变,还可以继续使用这个接口。
2.3.2通过默认方法,Java 8 允许我们在接口中写具体的方法实现,这样我们就能创建可复用的方法,可以在我们自己的代码中,或者在多个接口之间进行复用。但是虽然默认方法让接口拥有了类似类的功能,但是接口仍然不能有状态(即,不能有字段),所有的方法仍然是公开的,并且不能是静态的(除了静态方法)。
2.4静态方法
2.4.1接口的静态方法属于接口,不需要实现接口的类的实例,直接用接口名就可调用
2.4.2接口包含静态方法。实现类不能重写接口的静态方法
2.4.3用于为接口提供一些辅助或者工具方法,这些方法与接口的实例无关
3.接口作用
3.1定义规范:接口定义了一组方法的规范,表示某个类应该具备的功能。通过接口,可以约定类应该实现哪些方法以及这些方法的参数和返回类型。接口定义了类之间的契约,确保了代码的一致性和可维护性。
3.2实现多态:接口使得多态性成为可能。如果一个类实现了某个接口,它可以被当做该接口类型的对象使用。这意味着可以通过接口类型引用指向实现类的对象,从而提高代码的灵活性和可扩展性。
3.3分离接口和实现:接口将方法的定义与实现分离开来。接口中只定义方法的签名而不包含方法体,具体的实现由实现接口的类去完成。这种分离可以使得代码更清晰、可读性更好,并且方便进行模块化开发。
3.4实现多继承:Java中的类只支持单继承,但是一个类可以实现多个接口。这使得接口成为一种在类之间共享功能的方式,通过实现多个接口,可以获得不同接口定义的多个功能。
3.5定义常量:接口可以定义常量,这些常量在实现类中可以直接使用。接口中的常量默认为 public static final,可以通过接口名直接访问。
总的来说,接口在Java中的作用是定义一组规范,实现多态性,分离接口和实现,实现多继承以及定义常量。它是一种重要的编程工具,用于提高代码的可复用性、可扩展性和可维护性。
4.接口特征
4.1接口不能直接创建实例, 但是一个父类(或接口)类型的引用可以指向一个子类(或实现类)的对象
例如:一个接口 public interface Shape { void draw(); }
一个实现类
public class Circle implements Shape {
public void draw() {
System.out.println("Draw a circle");
}
}
接口类型的变量shape
可以指向任何实现了Shape
接口的类的实例,这是Java中多态性的一种表现
public class Test { public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
}
三、实现类
1.定义
在Java中,实现类(Implementation Class)是指实现了某个接口(Interface)的类。接口定义了一组需要被实现的方法,而实现类就是提供这些方法具体实现的类。
2.内容
2.1实现类可以定义自己的属性(fields)。这些属性可以是任何类型,包括基本类型(如int, double等)和引用类型(如String, List等)。这些属性可以被类的方法使用,也可以被类的实例(对象)使用。
2.2实现类可以定义自己的方法(methods)。这些方法可以是公有的(public),也可以是私有的(private),或者是受保护的(protected)。这些方法可以被类的实例(对象)调用,也可以被类自己的其他方法调用。
2.3实现类可以有自己的构造方法(constructors)。构造方法是一种特殊的方法,用于创建和初始化类的新对象。构造方法的名称必须与类名相同,且没有返回类型。
2.4实现类可以有静态属性(static fields)和静态方法(static methods)。静态属性和静态方法属于类,而不属于类的任何对象。也就是说,不需要创建类的对象就可以访问它的静态属性和静态方法。
2.5实现类可以有内部类(inner classes)。内部类是定义在另一个类里面的类。内部类可以访问其外部类的所有成员,包括私有的成员。
2.6实现类还可以实现其他的接口,或者继承其他的类。
2.6.1一个类实现多个接口:public class MyClass implements Interface1, Interface2
2.6.2一个类继承一个类并且实现多个接口:
public class MyClass extends SuperClass implements Interface1, Interface2
2.6.3一个类只能继承一个类但是可以实现多个接口(单继承)
3.作用
3.1实现接口:在Java中,类可以实现一个或多个接口,这意味着这个类必须提供接口中所有声明的方法的具体实现。这是一种确保类遵循特定行为的方式。
3.2多态:通过实现接口,我们可以实现多态,这是一种允许我们引用一个接口类型的对象,而实际上这个对象是实现了这个接口的一个类的实例。
3.3模块化:接口和实现类的概念使我们可以更好地模块化我们的代码。我们可以定义接口,并允许其他开发者提供自己的实现类,这样可以使我们的代码更加灵活和可插拔。
四、接口和实现类的关系
实现类 实现 接口1,接口2
五、特殊情况下实现类不用实现接口所有方法
1.实现类被声明为抽象类可以不实现接口中的所有方法。
2.接口中的静态方法和默认方法可以不被实现类实现
熟悉基本概念
1.引用:对象在内存中的地址
Dog myDog = new Dog();
代码含义:创建一个新的Dog对象,并将这个新创建的Dog对象的引用赋值给变量myDog。
-
Dog
:这是一个类名,表示我们要创建的对象的类型是Dog。 -
myDog
:这是我们定义的变量名,它将用来存储Dog对象的引用。 -
=
:这是赋值操作符,它将右侧创建的新对象的引用赋值给左侧的变量。 -
new
:这是一个关键字,用于创建新的对象。 -
Dog()
:这是Dog类的构造方法,用于创建一个新的Dog对象。
6.创建一个对象时,例如new Dog()
,这个操作会在内存中创建一个新的Dog对象,并返回这个对象在内存中的地址,我们把这个地址称为引用。
总结:在内存中创建对象---不返回对象而是返回对象在内存中的地址(这个地址就叫引用)---我们可以在变量名中存储对象的引用(也就是对象在在内存中的地址)
2.interface是一种规范
2.1在Java中,接口(Interface)被视为一种规范或者协议,它定义了一组方法,这些方法应该由实现(implements)该接口的类来提供具体实现。
2.2当我们说接口是一种规范,意思是它规定了一种标准,要求实现该接口的类必须遵守。这种标准主要体现在两个方面:
2.1.1方法声明:接口中声明的所有方法,实现该接口的类都必须提供这些方法的具体实现。这些方法的名称、参数列表和返回类型都必须与接口中声明的完全相同。
2.2.2行为规范:虽然接口本身并不提供方法的具体实现,但是通过接口中方法的命名和注释,我们可以明确知道这些方法的预期行为。实现接口的类在提供方法实现时,需要确保方法的行为符合接口的规定。
例如,如果有一个接口叫做“飞行器”,它声明了一个方法叫做“飞行”,那么所有实现“飞行器”接口的类都应该有一个“飞行”的方法,并且这个方法应该描述该对象如何飞行。
这种规范性使得我们可以编写出更加通用、可复用的代码,因为我们可以针对接口编程,而不是针对具体的实现类编程。这样,只要一个类实现了某个接口,我们就可以安全地使用该接口中定义的所有方法,而不用关心具体的实现细节。
3.interface是一种引用类型(变量引用对象)
接口是一种引用类型,因为它定义了一种引用行为的规范,而不是具体的数据值。接口本身并不能实例化,也就是说,不能创建一个接口的对象。但是,你可以声明一个接口类型的变量,然后让这个变量引用一个实现了该接口的类的对象。
例如,如果你有一个接口叫做Animal,和一个实现了Animal接口的类叫做Dog,可以这样声明和使用它们:
Animal myAnimal = new Dog();
在这个例子中,myAnimal是一个接口类型的变量,它引用了一个Dog对象。这个Dog对象实现了Animal接口,所以它可以被赋值给一个Animal类型的变量。
所以,接口是一种引用类型,因为它定义了一种行为规范,而不是具体的数据值。