1.接口
-
基本介绍:在Java中,接口是一种抽象类型,它定义了一组方法的规范,但没有具体的实现。接口可以看作是一种约定,它规定了实现该接口的类必须提供指定的方法。
-
语法:
interface 接口名{ //属性,如int n1 = 1; 其等价于public static final int n1 =1;从这也可以看出,接口类中只有常量而没有变量 //方法(在JDK1.8中包括抽象方法,默认实现方法,静态方法。而在JDK1.7中只有抽象方法) }
-
注意事项和细节
(1)接口不能被实例化。因为说到底,接口是一种特殊的抽象类,因此不能被实例化。
(2)除了默认的方法和静态的方法,其他的都是抽象方法。抽象方法默认public,并且abstract也不用写,也是默认的。如void eat();等价于public abstract void eat();
(3)一个普通类实现接口,就必须实现该接口的所有抽象方法。当然也可以将这个不同类声明抽象方法,那就可以不用实现该接口的抽象方法了。
(4)一个类可以同时实现多个接口,但是只能继承一个类,这里和继承有很大的区别。
(5)接口类中的属性访问形式只能通过接口名.属性名。因为接口类不能实例化。
(6)一个接口不能继承其他的普通类类,但是继承多个接口。
(7)接口的修饰符只能是public或默认的,这点和类一样。
代码:
//接口USB
public interface USB {
int n1 =1;//等价于public static final int n1 = 1;
void work();
default void work1(){
System.out.println("我是work1");
}
static void worker(){
System.out.println("我是work2");
}
}
//Phone实现了接口
public class Phone implements USB{
@Override
public void work() {
System.out.println("我是手机");
}
}
//Ipad类实现了接口
public class Ipad implements USB{
@Override
public void work() {
System.out.println("我是平板");
}
}
//Computer类
public class Computer {
public void work(USB usb){
usb.work();
}
}
//子类OldPhone继承了父类Phone
public class OldPhone extends Phone{
}
//测试类
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
Phone phone = new Phone();
Ipad ipad = new Ipad();
computer.work(phone);//多态参数
computer.work(ipad);//多态参数
USB[] usbs = new USB[2];
usbs[0] = phone;//多态数组
usbs[1] = ipad;//多态数组
usbs[0].work();
usbs[1].work();
OldPhone oldPhone = new OldPhone();
oldPhone.work1();//多态的传递,Phone implements USB,OldPhone extends Phone,此时OldPhone也能调用USB中的方法
}
}
2.接口VS继承
继承和接口是面向对象编程中的两种重要的机制,它们有以下区别和联系:
区别:
(1)继承是一种类与类之间的关系,子类继承父类的属性和方法,可以直接使用父类的成员。而接口是一种类与接口之间的关系,类实现接口后,需要实现接口中定义的所有方法。
(2)一个类只能继承一个父类,但可以实现多个接口。
(3)继承是一种"is-a"的关系,子类是父类的一种特殊类型。而接口是一种"has-a"的关系,类实现接口表示类具有某种能力或特征。
联系:
(1)继承和接口都可以实现代码的重用和扩展。
(2)继承和接口都可以用于实现多态性,通过父类或接口类型的引用来引用子类或实现类的对象。
(3)继承和接口都可以用于定义规范和约束,使得代码更加规范和可维护。
小结:当子类继承了父类,就自动的拥有父类的功能。如果子类需要扩展功能,可以通过实现接口的方式扩展。可以理解为实现接口是对Java单继承机制的一种补充。
代码:
//接口Fish
public interface Fish {
void swimming();
}
//接口Kangaroo
public interface Kangaroo {
void jump();
}
```java
//父类Monkey
public class Monkey {
private String name;
public Monkey() {
}
public Monkey(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void climb(){
System.out.println("天生会爬树");
}
}
//子类SmallMonkey
public class SmallMonkey extends Monkey implements Fish ,Kangaroo{
@Override
public void swimming() {
System.out.println("学会了游泳");
}
@Override
public void jump() {
System.out.println("学会了跳");
}
}
//测试类
public class Test {
public static void main(String[] args) {
SmallMonkey smallMonkey = new SmallMonkey();
smallMonkey.climb();
smallMonkey.swimming();
smallMonkey.jump();
}
}
3.接口VS抽象
区别:
构造器:
接口:不能有构造器,因为接口不能被实例化。
抽象类:可以有构造器,用于子类的初始化。
继承:
接口:支持多继承,一个类可以实现多个接口。
抽象类:只支持单继承,一个类只能继承一个抽象类。
字段:
接口:只能定义常量字段。
抽象类:可以定义各种类型的字段,包括实例变量。
用法:
接口:适合描述类之间的共享协议、规范和契约,以及实现多继承。
抽象类:适合用于具有共同基础行为的类,并且可以包含一些通用的方法实现。
联系:
(1)都是用来实现代码的重用和封装,提供一种抽象的方式来定义类的行为。
(2)都不能被实例化,只能被子类实现或继承。
(3)都可以被用作其他类的类型。
何时使用接口类:
(1)当需要定义一组与具体实现无关的方法,以便不同类来实现相同的行为时。
(2)当类需要遵循多个协议或规范时,可以实现多个接口。
(3)当需要为现有的类添加新的方法而不影响已有实现时,可以使用默认方法。
(4)当希望实现多重继承时,可以使用接口。
何时使用抽象类:
(1)当需要创建一个基础类,它可以包含一些默认的实现,同时又要求子类提供特定的实现。
(2)当需要在多个类之间共享代码和行为时,可以将通用方法实现放在抽象类中。
(3)当希望限制继承的数量(单继承)时,可以使用抽象类。
总的来说,选择使用接口还是抽象类取决于您的设计需求。如果您需要定义一组共享的方法规范并允许多个实现,那么接口是一个不错的选择。如果您需要提供默认的实现,并在基础类中包含共享代码,那么抽象类可能更适合。在一些情况下,您甚至可以将接口和抽象类结合使用,以实现更复杂的设计。