初始Java20(接口)
学习内容:
接口
接口是Java语言中为解决无法实现多继承而提供的一个解决方案,接口中没有实际的方法实现,只定义了一些空壳。一个类可以通过实现接口来实现多重继承关系。
1、接口的概念
接口就是一种特殊的抽象类,接口中只提供了方法的原形,但没有具体的方法实现,子类必须提供父类中抽象方法的实现方式。
接口和抽象类一样,也可以定义抽象的方法,并且在接口中只能够包含抽象的方法和常量,不能有变量、初始化块和构造函数。
由此代码可以看出,接口中的方法都是抽象类,并没有方法具体的实现。接口中的方法必须由接口的实现类来实现
2、接口的声明
使用 interface 来定义一个接口。
接口定义同类的定义类似,也分为接口的声明和接口体,其中,接口体由常量定义和方法定义两部分组成
定义接口的基本格式如下:
注:与Java的类文件一样,接口文件的文件名必须与接口名相同
3、接口的使用
接口不能单独实例化,要想实例化接口,必须通过接口的实现类来完成。
接口的实现类,必须全部实现接口中的所有方法,接口就是标准,用来隔离具体实现的。
接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字 implements ,其基本格式为:
[修饰符] class < 类名 > [extends 父类名] [implements 接口列表]{ }
4、Java接口的特征归纳
(1)Java接口中的成员变量默认都是 public、static、final 类型的,而这三个类型其实都可以省略,接口中的成员变量为常量,并且建议全部使用大写,单词之间用“_”分隔
(2)Java中的方法默认都是public、abstract类型的,并且public和abstract可以省略。接口中的方法没有方法体,不能被实例化
(3)Java接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法
接口中的变量必须初始化,并且方法必须是抽象方法。否则会报错
(4)接口中没有构造方法,不能被实例化
因为接口是不能被实例化的,因此没有构造方法,如果有就会报错
(5)一个接口不能实现另一个接口,但它可以继承多个其他的接口
(6)Java接口必须通过类来实现它的实现类来实现抽象方法
(7)当类实现了某个Java接口时,他必须实现接口中的所有抽象方法,否则,这个类必须声明为抽象的
(8)不允许创建接口的实例,但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
(9)一个类只能继承一个直接的父类,但可以实现多个接口,间接地实现了多继承
5、接口的继承
Java中的类是属于单继承的,Java中的接口也可以实现继承,并且接口可以实现多继承
不允许类多重继承的主要原因:如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承哪一个呢?但接口不存在这样的问题,接口全都是抽象方法,继承谁都无所谓,所以接口可以继承多个接口
6、标记接口
标记接口是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型,供其他代码来测试。使用标记接口的唯一目的是可以用 instanceof 进行类型查询,例如:if(obj instanceof Cloneable){...}
在Java中常见的标记接口有 Serializable接口 和 Clone接口
(1)java.io.Serializable 接口
该接口仅仅表明,实现该接口的类,可以实现类的序列化和反序列化。标记接口仅仅是一个标记,此种接口并没有抽象方法
(2)java.lang.Cloneable 接口
该接口表明 Object.clone()方法可以合法地对该类实例进行按字段复制。实现此接口的类应该使用公共重写 Object.clone
7、综合实例
(1)定义一个接口叫Car,该接口中有3个方法,分别是 getName()--获得车的名字,getColor()--获得车的颜色,getPrice()--获得车的价格
package day01; public interface Car { public String getName(); public String getColor(); public double getPrice(); }
(2)然后写一个BMW类来实现这个接口
package day01; public class BMW implements Car{ @Override public String getColor() { String Color="红色"; return Color; } @Override public String getName() { String name="宝马"; return name; } @Override public double getPrice() { double price=800000; return price; } }
(3)最后写一个测试类CarTest
package day01; public class CarTest { public static void main(String[] args) { Car car=new BMW(); String name=car.getName(); String color=car.getColor(); double price=car.getPrice(); System.out.println("3年后我将送给女朋友一辆"+name+",颜色是"+color+",价格是"+price+"元"); } }
遇到的问题:
1.@overeide 是什么意思?
@Override简单理解就是这个句话下边的方法是继承父类的方法,对其覆盖。比如toString()方法的话,在方法前面加上@Override 系统可以帮你检查方法的正确性,@Override public String toString(){...}这是正确的一旦写错 写成这样@Override public String tostring(){...}编译器可以检测出这种写法是错误的 这样能保证你的确重写的方确而如果不加@Overridepublic String tostring(){...}这样编译器是不会报错的 它只会认为这是你自己新加的一个方法而已------------------------------------------------------------@Override的用法:Override:java.lang.Override是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override。下面的代码是一个使用@Override修饰一个企图重载父类的toString方法,而又存在拼写错误的sample:清单1:@Override public String toSting() { // 注意方法名拼写错了 return "[" + super.toString() + "]";}
2.不理解标记接口
https://www.cnblogs.com/yanggb/p/10664155.html
明天要学习的内容:
异常机制概述