Java学习-接口
版权声明:本文为博主原创文章,转载请注明出处。
https://mp.youkuaiyun.com/mdeditor/84779687
1、为什么使用接口?
Java语言不支持多重继承,即一个子类只能有一个父类,若子类需要继承多个父类,这时需要使用接口。
2、接口的定义:
定义分为接口声明和接口体。接口体包含常量定义和方法定义两部分,方法体中只进行方法的声明,不提供方法的实现,因此方法的定义没有方法体,且用分号结尾。形式如下:
[修饰符].interface 接口名 [extends 父接口名列表]{
[public] [static][final] 常量名;
[public] [abstract] 方法;
}
- 修饰符:可选参数,若为public,则表示任意类均可以使用这个接口;省略的话,则使用默认(即只有与该接口定义在同一个包中的类才可以访问这个接口)。
- 接口名:必选参数,首字母大写。
- extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当有多个父类接口时,用逗号分隔。
【例】
package p1;
public interface CalInterface {
//定义用于表示圆周率的常量
final float PI=3.14159f;
//定义一个用于计算面积的方法getArea()
float getArea(float r);
//定义一个用于计算周长的方法getCircumference()
float getCircumference(float r);
}
说明:(1)接口继承时将继承父接口中的常量和抽象方法。
(2)成员变量的声明形式:
[public] [static][final] 成员变量名=常量;即接口中的成员变量都是public权限的static常量。
(3)成员方法的声明:
[public] [abstract] 返回值类型 成员方法名(参数表);
(4)java类文件名与类名相同,接口文件名与接口名也相同。
3、接口的实现:
(1)[修饰符] class <类名> [extends 父类名] [implements 接口列表]{}
说明:
- 修饰符:可选参数,可选值为public、abstract、final;
- 类名首字母大写;
- 在类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的定义完全相同,且必须实现接口中的所有方法。
(2)接口特点:
- 类只能单继承,接口可以多继承;
- 接口可以没有父接口(最高层),类的最高层是Object类。
- 接口中的方法只能被声明为public或abstract,不声明,则默认为public abstract; 接口中的成员变量只能使用public、static、final声明,否则使用默认:public static final。
- 在接口中只定义方法名、返回值、参数表,而不定义方法体。
【例】
package p1;
public class Cire implements CalInterface {
public float getArea(float r)
{
//计算圆面积并赋值给变量area
float area=PI*r*r;
//返回圆面积
return area;
}
public float getCircumference(float r) {
//计算圆的周长并赋值给变量circumference
float circumference=2*PI*r;
//返回圆周长
return circumference;
}
public static void main(String[] args) {
Cire cire=new Cire();
float f=cire.getArea(2.0f);
System.out.println(Float.toString(f));
}
}
----------------------
运行结果:12.56636
4、接口使用例子:
package ch9;
//定义接口
interface Fight
{
void fight();
}
//小胖和小瘦实现这个接口
class Xiaopang implements Fight
{
//定义方法体
public void fight()
{
System.out.println("小胖学习很努力");
}
}
class Xiaoshou implements Fight
{
//定义方法体
public void fight()
{
System.out.println("小瘦总是很努力的学习");
}
}
public class InterfaceTest
{
public static void main(String args[])
{
//实例化对象
Fight aFight=new Xiaopang();
Fight bFight=new Xiaoshou();
aFight.fight();
bFight.fight();
}
}
----------------------
运行结果:12.56636
5、扩展接口与接口的多继承:
接口的方法是抽象的。
(1)方法重名:若重名的两个方法有不同的参数个数或者类型,则接口继承这两个方法,即方法被重载;若两个方法方法返回值不同,会产生无法实现的错误。
package ch9;
//新建一个类,命名为Father.java
public class Father {
private String houseName="FatherHouse";
public String getHouseName()
{
return houseName;
}
}
------------------------
package ch9;
//新建一个接口,命名为Family.java
public interface Family {
public String getHouseName();
}
------------------------------
package ch9;
//新建一个类,命名为Son.java,继承Father类,实现Family接口
public class Son extends Father implements Family
{
public String getHouseName(String s)
{
//重写接口中的方法
class MyHouse implements Family
{
private String houseName;
private MyHouse(String house)
{
houseName=house;
}
public String getHouseName(){
return houseName;
}
}
//返回类中的方法的值
return new MyHouse(s).getHouseName();
}
public static void main(String[] args) {
Son son=new Son();
//得到家的房子
System.out.println(son.getHouseName("FamilyHouse"));
//得到父亲的房子
System.out.println(son.getHouseName());
}
}
-------------------------------
输出结果:
FamilyHouse
FatherHouse
(2)常量重名:重名的变量都保留,使用原来的接口名字作为前缀。
package ch9;
//定义接口1
interface Inter1
{
public static final int A=0;
}
//定义接口2
interface Inter2
{
public static final int A=1;
public static final int B=2;
}
//定义类实现接口1和接口2
class Demo implements Inter1,Inter2
{
}
public class Chongming
{
public static void main(String[] args)
{
System.out.println(Demo.B);
System.out.println(Inter1.A);
System.out.println(Inter2.A);
System.out.println(Demo.B);
}
}
-----------------------------
输出结果为:
2
0
1
2
思维导图形式:
参考自:
《Java编程基础及应用》 强彦 赵涓涓