Java中内部类的编写

来源:互联网 发布:stc90c52rc单片机容量 编辑:程序博客网 时间:2024/05/21 17:33

Java中内部类的编写

内部类的相关知识点:

1)  在一个类中定义另外一个类,这个类就叫做内部类或内置类 (inner class)

2)  内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类(outer class)来控制内部类的可见性。内部类可以访问外部类的任何类型的方法和成员变量。

3)  当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成员。

下面为内部类的简单实现:

class Outer{

       private int index=100;

       void print()     {

              Inner i=new Inner();

              i.print();

       }

       class Inner{

              void print(){

                     System.out.println(index);

              }

       }

}

class Test{

       public static void main(String[] args){

              Outer o=new Outer();

              o.print();

        Outer.Inner inner=outer.getinner();

              inner.print();

       }

}

 

 

1)  在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明final

2)  内部类可以声明为privateprotected;还可以声明为abstractfinal

3)  内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法;

4)  static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。

我们为什么使用内部类

1、在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。

2、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。

3、内部类的更多用法:见下面代码

下面为通过内部类来实现接口的简单代码:

interface Animal

{

       void eat();

       void sleep();

}

class Zoo

{

       private class Tiger implements Animal//通过内部类Tiger来实现Animal接口,并且声明为private.从而可以隐藏接口内部的具体实现

       {

               public void eat()

               {

                     System.out.println("tiger eat");

               }

               public void sleep()

               {

                    System.out.println("tiger sleep");

              }

       }

        Tiger gettiger()

        {

               return new Tiger();

       }

}

class Test

{

       public static void main(String []args)

       {

              Zoo zoo =new Zoo();

              Animal an=zoo.gettiger();

              an.eat();

              an.sleep();

       }

}

下面通过内部类来解决同时实现继承和接口,但是要继承的类中的方法名和接口中的方法名是一样的,此时可以通过内部类来实现接口中的方法,达到区分同名方法的目的:

interface Machine

{

       void run();

}

class Person

{

       void run()

       {

              System.out.println("people are running");

       }

}

class Robet extends Person//实现继承

{

       private class MachineStart implements Machine//

       {

              public void run()

              {

                     System.out.println("machine started");

              }

       }

      

       MachineStart getmachine()

       {

              return new MachineStart();

       }

      

}

class Test

{

       public static void main(String []args)

       {

              Robet robet=new Robet();

              Machine machine=robet.getmachine();

              machine.run();

              robet.run();

       }

}