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

接口

接口概念的引入

在购买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";这就是是静态内部类。既然是静态的,包含它的类要引用它时,就可以不必创建对象,直接引用。静态内部类中只能访问外部类的静态成员。构造静态内部类对象,不再需要构造外部类对象。


匿名内部类

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


常见问题

接口与继承有什么区别
答:接口在本质就是一个特殊的类。在语法上跟继承有着很大的差别。
属性:接口中的所有属性都是公开静态常量,继承则无所谓。
方法:接口中所有方法都是公开抽象方法,继承中所有的方法不一定都是抽象的。
接口方法:接口没有构造器,继承有构造器

一个类能实现多个接口,只能继承一个父类。


你可能感兴趣的:(java,接口)