zoukankan      html  css  js  c++  java
  • 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修饰符

  • 相关阅读:
    一个APP爆炸的时代,假设没有wifi
    POJ2393 Yogurt factory 【贪心】
    Levenberg–Marquardt algorithm
    keepalived+nginx安装配置
    測试赛D
    脚本中$
    vm+ubuntu联网
    操作系统从硬件到应用程序之间的关系
    【转】linux驱动开发
    Qt如何重写虚函数
  • 原文地址:https://www.cnblogs.com/hyjj/p/5459207.html
Copyright © 2011-2022 走看看