java接口深入理解,深入理解Java接口的作用

文章导读

【在定义类、接口时,都需要指定访问修饰符,以此来限定类及接口的可访问范围。本文给出了类及接口主要修饰符的名称及限定作用,同时也给出了Java接口的定义与实现。】

本文分成二个小节用来理解Java类接口的作用。第一小节介绍Java类及接口的修饰符,在讨论接口时会用到;第二小节以PCI插槽接口的实现为案例,加深理解Java接口的作用。

第一小节 认识Java类及接口的修饰符

1、访问修饰符

在定义类、及类的属性和方法时,都需要指定访问修饰符,以此来限定类、属性、方法的可访问范围。Java中访问修饰符有以下几个关键字。

(1)privte:私有。只有在类和接口的主体中才可访问。该关键字只能修饰属性和方法,不能修饰类和接口。

(2)protected:受保护。该类及其子类的成员均可以访问,同一个包中的类也可以访问。该关键字只能修饰属性和方法,不能修饰类和接口。

(3)public:公共。该类或非该类均可访问。

(4)默认:不使用修饰符。只有相同包中的类可以访问。

例如,下面代码定义了两个类,一个类是Book类,一个类是Manager类。用Manager类访问Book类的私有变量是不能访问的。public class Book

{

private    String  bookName;

protected  String  bookAuthor;

public  String  bookBrief;

Book()

{

this.bookName = "跟我学Java编程";

this.bookAuthor = "践行者";

this.bookBrief = "让读者掌握Java编程技术的同时,能够提升系统分析与设计的能力";

}

}

public class Manager

{

public static void main(String[] args) {

// TODO Auto-generated method stub

Book book = new Book();

//下面语句编译报错,不能访问Book类的私有成员

System.out.println(book.bookName);

//输出书的作者

System.out.println(book.bookAuthor);

//输出书的简介

System.out.println(book.bookBrief);

}

}

2、static修饰符

前面说到访问类成员和方法时,需要先把类实例化为对象才能访问类的成员和方法。然而在实际编程时,有时候需要类在没有实例化的前提下访问类的成员和方法。

例如,下面的代码给出了一个加法类,该类包含了三个重载方法,用于计算不同数据类型的求和。代码如下:public class Addition {

public double  add(int a,int b)

{

double sum;

sum = (double)a + (double)b;

return sum;

}

public double  add(double a,double b)

{

double sum;

sum = a + b;

return sum;

}

public double  add(float a,float b)

{

double sum;

sum = (float)a + (float)b;

return sum;

}

}

public class Management

{

public static void main(String[] args) {

// TODO Auto-generated method stub

Addition  addition = new Addition();

double d1 = addition.add(20, 30);

double d2 = addition.add(189.2, 20.6);

double d3 = addition.add(15.2f, 11.2f);

}

}

代码中的Addition类属于工具类,该类可以被其它类调用计算两数和。在Management类的main方法里,声明了Addition类变量,并实例化Addition,然后再调用Addition对象的add方法。Addition类既然是工具类,必然经常被其它类调用,如果每次调用前都需要实例化对象,那就有点麻烦了。通过static修饰符就可以避免出现这样的问题。

static修饰符可以修饰类、类属性和方法。使用该关键字修饰的内容属于静态内容,可以直接使用而不必实例化后再使用。用static修饰符修饰的类方法称为静态方法,用static修饰符修饰的类属性称为静态属性。

被static修饰符修饰的类方法或类属性访问语法为:

类名.方法名

类名.属性名

修改上面的Addition类,其方法均用static修饰符修饰。代码如下:public class Addition {

public static double  add(int a,int b)

{

double sum;

sum = (double)a + (double)b;

return sum;

}

public static double  add(double a,double b)

{

double sum;

sum = a + b;

return sum;

}

public static  double  add(float a,float b)

{

double sum;

sum = (float)a + (float)b;

return sum;

}

}

public class Management {

public static void main(String[] args) {

// TODO Auto-generated method stub

double d1 = Addition.add(20, 30);

double d2 = Addition.add(189.2, 20.6);

double d3 = Addition.add(15.2f, 11.2f);

}

}

Addition类的方法被修饰为静态方法后,就可以在Management类中直接用Addition类调用add方法,而无需实例化对象了。

3、final修饰符

final修饰符的作用类似于前面讲的常量,常量是指程序运行过程中,有些值需要保持不变。例如:在基于数学运算的程序中,圆周率是固定不变的值。类似圆周率等在程序运行过程中固定不变的值可以定义为常量,便于使用。

final修饰符可以修饰类,被修饰的类不能派生子类。

final修饰符可以修饰类方法,被修饰的类方法不能被子类重写。

final修饰符可以修饰类属性和变量,被修饰的类属性和变量不能被修改且必须被初始化。

例如,下面的代码定义了Constant类,该类的属性pi被修饰为final,不能在程序中被修改。public class Constant{

//定义常量

final double pi = 3.14;

}

第二小节 理解Java的接口

接口的概念在现实生活中使用的很多。例如,计算机上提供的USB接口,专门供USB设备使用,如U盘、USB风扇、USB鼠标、USB键盘等。计算机通过统一的USB接口来提高通用性,使计算机不再需要同时具备U盘专用接口、鼠标专用接口、键盘专用接口等。再如,计算机的主板上提供的PCI插槽,也提供统一的设计规范,使得遵守这个规范的声卡、显卡、网卡都可以插在PCI插槽上,如下图所示:

7659cb5cfc2681008006c5215e961562.png

图1  PCI插槽提供的接口

上图中网卡、声卡、显卡内部结构都不相同,但可以把网卡、声卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插那个卡的。

从上面两个例子可以看出,接口是一套标准规范,满足标准规范的外部设备都可以通过接口接入到系统。计算机设计师在设计USB接口时,规范USB的接入装置、供电电压、传输速率等。这些规范仅是规定了必须满足的功能和要求,但是却没有规定如何进行实现。

接口的具体实现由这个接口的具体类来实现。例如,使用计算机的USB接口的是那些实现USB接口规范的产品,如U盘、USB鼠标等,这些具体产品会实现USB接口规范。

Java接口定义与实现

在Java中,使用interface关键字来定义接口。接口中的方法都只有声明,没有方法主体。例如://定义了一个PCI接口

public interface PCI {

//定义了一个开始方法

public void start();

//定义了一个结束的方法

public void stop();

}

Java接口中定义的方法都只有方法声明,没有具体的主体,也可以理解为接口中只能有抽象方法,具体的接口实现由子类完成,这样就可以让不同的子类遵守相同的规范,但又有自己的实现。

下面分别定义声卡和显卡,来实现接口PCI规定的功能。实现代码如下://声卡实现类

class SoundCard implements PCI

{

@Override

public void start() {

// TODO Auto-generated method stub

System.out.println("Du du...");

}

@Override

public void stop() {

// TODO Auto-generated method stub

System.out.println("Sound Stop!");

}

}

//网卡实现类

class NetworkCard implements PCI

{

@Override

public void start() {

// TODO Auto-generated method stub

System.out.println("Send...");

}

@Override

public void stop() {

// TODO Auto-generated method stub

System.out.println("Network stop!");

}

}

SoundCard类和NetworkCard类通过implements关键字来声明实现PCI接口,并分别实现了接口的start方法和stop方法。

Java接口中的常量

接口中还可以定义变量,只不过这些变量默认是用public static final修饰的,变量值也不能更改,这种变量也可以称为常量。

例如,定义MathConstant接口,接口中定义圆周率常量,代码如下:public interface MathConstant {

//定义数学上的圆周率

double PI = 3.1415926;

}

Java多重接口

在Java语言中,一个类是可以实现多个接口的,这个类必须实现接口中声明的所有方法。

下面给出了汽车类实现运行接口和车身颜色接口例子,代码如下://定义了运行接口

public interface Runner {

public void run();

}

//定义了车身颜色接口

public interface Constants {

public static final int  COLOR_RED = 1;

public static final int  COLOR_GREEN = 2;

public static final int  COLOR_BLUE = 3;

}

//实现两个接口,用逗号分割多个接口

class Car implements Runner,Constants

{

public void run()

{

System.out.println("车颜色是:" + COLOR_RED);

System.out.println("正在运行");

}

}

接口无法被实例化,仅可以被类实现。具体类通过定义由接口声明的所有方法,来实现接口。多个类可以实现同一个接口,这些类不需要有共同的类层次。重要的是,一个类可以实现多个接口。

文章小结

1、访问修饰符限定了类、属性、方法的可访问范围,起到保护和隔离数据的作用;static修饰符可以把类方法和类属性修饰为静态方法,这样做的好处是对于高频使用的类方法,如工具类方法,可以在没有实例化对象的前提下调用该方法和属性;final修饰符类似于常量定义,被final修饰符修饰的类成员变量或局部变量初始化后,不能被修改。

2、在实际编程中,通过使用接口,可以实现不同的类的对象在实现不同类型的功能时,对外部的方法声明是统一的,这样便于程序的调用和管理,利于程序项目的扩展。因此在面向对象的编程领域中,存在着另外一个方向——面向接口的编程,很多Java技术都是这样实现的。

思考与练习

1、应用eclipse开发工具建立Addition项目,实现文中的代码案例,体会静态修饰符的用法。

2、参照文中内容实现PCI插槽接口,并分别声明网卡、声卡及显卡类,实现PCI抽象接口。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值