您的位置:首页 > 编程语言 > Java开发

java系统学习(八) --------接口与内部类

2015-09-02 14:50 645 查看

接口

接口概念的引入

在购买USB电脑鼠标的时候,不需要问电脑配件的商家,USB电脑鼠标是什么型号的?  原因就是USB接口是统一的、固定不变的一种型号,是一种规范。所有的商家都会按照这个规范,来制造USB接口的鼠标。这个规范说明制作该USB类型的鼠标应该做些什么,但并不说明如何做。

而Java程序设计中的接口,也是一种规范。这个接口定义了类应该做什么,而不关心怎么做。即接口中只有方法名,没有具体实现的方法体。

接口的概念

接口只是说明类应该做了什么,但并不指定应该如何去做。在实际开发过程中,通过类来实现接口。接口只有方法名没有方法体,实现接口就是让其既有方法名又有方法体。

下面就举个有关接口的模型:

      接口

      {

          应该做的事情一();

          应该做的事情二();

          应该做的事情三();

      }

    这个例子只是声明了要做什么事情,但没有说明如何做,需要一个类去实现它.将它的方法体进行具体实现。

接口的声明

接口的声明很简单,使用关键字"interface”来声明。接口的形式跟类很相似,但要记住接口是接口,类是类,两者不能混为一谈。接口是要求类如何做的一套规范。

//声明一个学校接口.来告诉程序需要做此什么
interface school
{
//接口中包括了很多方法.但是都没有实现,即都没有函数体
void setschoolname(Strinct schoolname);
void setclassname(String schoolclassname);
void setname(String name);
void setcode(Strina code);
void setsexv(String sexy);
void setbirthday(String birthday);
String getschoolname();
String getclassname();
String qetname();
String qetcode();
String qetsexy();
Strincx  getbirthday();
}


接口的实现

以下类对应实现了上面的shcool接口

//创建一个类.让它实现学校这个接口
class student  implements school
{
//创建成员变量
private String schoolname;
private String classname;
private String studentname;
private String studentcode;
private String studentsexy;
private String studentbirthday;

//通过设置器来设置各个参数
public void setschoolname(String schoolname){
this.schoolname=schoolname;
}
public void setclassname(String classname){
this .classname=classname;
}
public void setname(String studentname){
this.studentname=studentname
}
public void  setcode(String studentcode){
this.studentcode = studentcode
}
public void setsexy(String studentsexy){
this .studentsexy=studentsexy;
}
public void setbirthday(String studentbirthday){
this .studentbirthday=studentbirthday;
}
//通过访问器来获得对象的参数
public String getschoolname(){
return schoolname;
}
public String getclassname(){
return classname;
}
public String getname(){
return studentname
}
public String getcode()(
return studentcode;
}
public String qetsexy(){
return studentsexy;
}
public String getbirthday(){
return studentbirthday;
}
//通过tostring方法来让对象以字符串形式输出
public String tostring(){
String infor="学校名称:"+schoolname+"班级名称:"+classname+"学生姓名:"+studentname+" 学号:"+studentcode+"+" 性别:"+studentsexy+" 出生年月:"+studentbirthday;return infor; }}


接口的多重实现

前面提到过接口能够补充继承的不足,现在讲解如何补充。继承必须是单继承的,即一个类继承另一个类后,那这个类就不能继承其他类。而接口则无所谓,一个类可以实现一个接口,也可以同时实现其他接口。

例如以下例子,student类同时实现school 和 school1 接口:

interface school
{
void setschoolname(Strinct schoolname);
void setclassname(String schoolclassname);
void setname(String name);
void setcode(Strina code);
void setsexv(String sexy);
void setbirthday(String birthday);
}

interface school1
{
String getschoolname();
String getclassname();
String qetname();
String qetcode();
String qetsexy();
Strincx  getbirthday();
}

class student  implements school,school1
{
//创建成员变量
private String schoolname;
private String classname;
private String studentname;
private String studentcode;
private String studentsexy;
private String studentbirthday;

//通过设置器来设置各个参数
public void setschoolname(String schoolname){
this.schoolname=schoolname;
}
public void setclassname(String classname){
this .classname=classname;
}
public void setname(String studentname){
this.studentname=studentname
}
public void  setcode(String studentcode){
this.studentcode = studentcode
}
public void setsexy(String studentsexy){
this .studentsexy=studentsexy;
}
public void setbirthday(String studentbirthday){
this .studentbirthday=studentbirthday;
}
//通过访问器来获得对象的参数
public String getschoolname(){
return schoolname;
}
public String getclassname(){
return classname;
}
public String getname(){
return studentname
}
public String getcode()(
return studentcode;
}
public String qetsexy(){
return studentsexy;
}
public String getbirthday(){
return studentbirthday;
}
//通过tostring方法来让对象以字符串形式输出
public String tostring(){
String infor="学校名称:"+schoolname+"班级名称:"+classname+"学生姓名:"+studentname+" 学号:"+studentcode+"+" 性别:"+studentsexy+" 出生年月:"+studentbirthday;
return infor;
}
}


接口的属性

接口不是一个类,正因为其不是一个类.所以不能使用关键字“new"生成一个接口的实例。虽然这样,还是可以声明一个接口变量,如:"school  sc"

如果要生成一个接口的实例,可以让接口变量指向一个已经实现了此接口的类的对象,如下面的例子:

school sc=new student();
另外,在接口中,不能声明实例字段及静态方法,但可以声明常量。其实接口不一定要有方法,也可以全部是常量。

接口的继承

接口从某些方面具有类的一些特性,如有方法、有属性,那么是否像类一样可以继承?回答是肯定的。接口的继承和类的继承一样,也是用关键字“extends”来实现的。

//创建一个接口
interface school
{
void setschoolname(String schoolname);
void setclassname(String schoolclassname);
String getschoolname();
String getclassname();
}
//设计schooll接口并继承接口school
interface schooll extends school{
void setname(String name);
void setcode(String code);
void setsexy(String sexy);
void setbirthday(String birthday);
void setfamilyaddress(String familyaddress);
String getname();
String getcode();
String getsexy();
String getbirthday();
String getfamilyaddress();
}


内部类

内部类就是在一个类的内部再创建一个类。

内部类的好处

内部类的对象能够访问创建它的对象的所有方法和属性,包括私有数据。

对于同一个包中的其他类来说,内部类是隐形的。

匿名内部类可以很方便地定义回调。

使用内部类可以很方便地编写事件驱动的程序。

使用内部类来访问对象

public class students{
//内部类的创建把内部类作为外部类的一个成员
private class course{
private String[] courses;
private int coursenum;
//内部类的构造器
public course(String[] course){
courses=course;
coursenum=course .length;
getinfo();//调用方法getinfo()
}
//获得课程数组中的课程
private void get(){
for(int i=0;i<coursenum; i++){
System.out.print(””+courses[i]);
}
}
//按字符串形式输出
void getinfo(){
System.out.println("学生姓名:"+students.this.name+"学生学号
+students.this.code+"一共选择了:"+
coursenum+"科.分别是:);
get();
}
}
}

public class students{
//在主运行方法中,通过学生类的方法来访问学生类的内部类courses
public static void maia(String[]args){
String[] courses={"语文","数学","英语","化学"};
students st=new students();
st.setname("王浩");
st.setcode("200123");
st.setsexy("男");
st.setaddress("北京海淀区");
System.out.println(st.tostring());
st.setstudentcourse(courses);//访问内部类
}
}


局部内部类

局部内部类是定义在外部类的方法中,与局部变量类似,在局部内部类前不加修饰符"public”和“private",其范围为定义它的代码块。局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部常量,但要求外部类的局部变量是“final”的。其实,以上做法相当于为内部类添加了一个属性,这个属性就是外部类的“final”局部变量。在类外不可直接访问局部内部类,以保证局部内部类对外是不可见的,只有在方法中才能调用其局部内部类。


静态内部类

当一个内部类不需要引用其外部类的方法和属性时,可以将这个类设置为“static";这就是是静态内部类。既然是静态的,包含它的类要引用它时,就可以不必创建对象,直接引用。静态内部类中只能访问外部类的静态成员。构造静态内部类对象,不再需要构造外部类对象。

匿名内部类

在编写程序代码时.不一定要给内部类取一个名字,可以直接以对象名来代替。在图形化编程的事件监控器代码中,会大量使用匿名内部类,这样可以大大的简化代码的编写,并增强了代码的可读性。

常见问题

接口与继承有什么区别

答:接口在本质就是一个特殊的类。在语法上跟继承有着很大的差别。

属性:接口中的所有属性都是公开静态常量,继承则无所谓。

方法:接口中所有方法都是公开抽象方法,继承中所有的方法不一定都是抽象的。

接口方法:接口没有构造器,继承有构造器

一个类能实现多个接口,只能继承一个父类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: