Java中的内部类

       谈起内部类,我相信大家很多人都对他并不陌生,但又有很多人并不习惯的去用它,应该也就渐渐把他忘却,今天我就详细讲解关于java中的内部类的概念,以及怎样去用内部类。

一.内部类

1.什么是java中的内部类

    内部类(Inne Class)就是定义在一个类里面的类.

  2.使用内部类的作用

    01.内部类提供了更好的封装,可以把内部类隐藏在外部类(包含内部类的类被称为外部类)之内,不允许同一个类中的其他类来访问该类。

  02.内部类的方法可以直接访问外部类的所有数据,也能访问外部类的私有字段。

  3.内部类的有几种

    成员内部类

    静态内部类

    方法内部类

    匿名内部类

二.如何使用内部类

//外部类Happy
public  class Happy {
          //内部类Lucky
      public class Lucky
      { 
             //内部类的say方法
          public void say()
          {
              System.out.println("我是内部类");
          }
      }
      //mian方法
      public static void main(String[] args) {
        //实例化外部类
          Happy happy=new Happy();
        //实例化内部类
          Lucky lucky=happy.new Lucky();
          //调用内部类的sayfangf
          lucky.say();
    }

输出结果:我是内部类

三.Java中的成员内部类

//外部类Test
public class Test {
   private int a=10;//外部类的私有属性
   //内部类happy
   public class Happy
   {
       int b=20;//内部类的成员属性
       public void test()
       {
           System.out.println("外部类的a:"+a);
           System.out.println("内部类的b:"+b);
       }
   }
   //main方法
   public static void main(String[] args) {
     //实例外部类对象
       Test test=new Test();
    //实例化内部类对象
       Happy happy=test.new Happy();
       happy.test();
}

image

注意点:

      01定义成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去new一个内部类对象,eg:内部类 对象名=外部类对象.new 内部类();

   02.外部类是不能调用内部类的成员和方法,可以先创建内部类对象在调用成员变量和方法。

   03.如果外部类和内部类具有相同的成员变量和方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量和方法可以通过this关键字实现。

    内部类默认调用自己的成员变量:
//外部类Test
public class Test {
   private int b=10;//外部类的私有属性
   //内部类happy
   public class Happy
   {
       int b=20;//内部类的成员属性
       public void test()
       {
           System.out.println("b:"+b);
       }
   }
   //main方法
   public static void main(String[] args) {
     //实例外部类对象
       Test test=new Test();
    //实例化内部类对象
       Happy happy=test.new Happy();
       happy.test();
}

输出结果:20

内部类通过this关键字调用外部类的成员变量:
//外部类Test
public class Test {
   private int b=10;//外部类的私有属性
   //内部类happy
   public class Happy
   {
       int b=20;//内部类的成员属性
       public void test()
       {
           System.out.println("b:"+Test.this.b);
       }
   }
   //main方法
   public static void main(String[] args) {
     //实例外部类对象
       Test test=new Test();
    //实例化内部类对象
       Happy happy=test.new Happy();
       happy.test();
}

输出结果:10

   04.还有一个值得关注的地方就是:此时编译后的文件会生成两个即两个.class文件

   image

其中,第二个是外部类的.class文件,第一个是内部类的.class文件,所有要注意的是成员内部类的.class文件是这样:外部类名$内部类名.class

  四.Java中的静态内部类

   所谓静态内部类,当然是是用static修饰的内部类。

//外部类
public class Test {

    static int result=2;//外部类静态属性
    //静态内部类Happy
  public static class Happy
  {
      int result=3;//内部类属性和外部类静态属性同名
      public void test()
      {
          System.out.println("访问外部类中的result:"+Test.result);
          System.out.println("访问内部类中的result:"+result);
      }
  }
  
  //main方法
  public static void main(String[] args) {
    //直接创建内部类对象
     Happy happy=new Happy();
             happy.test();
}
}

注意点:

  01.静态内部类不能直接访问外部类的非静态的成员,但可以通过new 外部类().成员的方法访问。

  02.如果外部类的静态成员和内部类的静态成员的名称相同的话,可以通过类名.静态成员访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可以通过成员名直接的调用静态成员。

  03.创建静态内部类的对象时,不需要外部类的对象,可以直接创建内部类 对象名=new 内部类();

五.java中的方法内部类

方法内部类是定义在外部类的方法中,方法内部类只在该方法的内部可见。

//外部类
public class Happy {
          //外部类的方法
    public void show()
    {
     final int a=1;//常量
     //方法内部类
       class Test
      {
          int c=3;
          //方法内部类中的方法
          public void print()
          {
              System.out.println("外部类方法中的a:"+a);
              System.out.println("内部类c:"+c);
          }
          
      }
       //创建方法内部类的对象
       Test test=new Test();
       test.print();
    }
    public static void main(String[] args) {
         Happy happy=new Happy();//实例化外部类
         happy.show();
    }
}

注意:

01方法内部类不能再外部类的而方法以外的地方使用。

02方法内部不能使用访问修饰符合static修饰符

posted @ 2016-05-04 17:32  hyjj  阅读(187)  评论(0编辑  收藏  举报