• 内部类


    概述: 就是把一个类定义在另一个类中,那么这个类我们就将其称之为内部类


    按照位置进行分类

    * 成员内部类 就是把这个类定义在了成员位置(类中方法外的位置)

    *private: 提高数据的安全性

    *static : 访问其他的类访问

    *非静态的成员内部类被其他类创建对象的格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象 ;

    *静态的成员内部类被其他类创建对象的格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名() ;

    * 局部内部类 就是把这个类定义在局部位置(方法定义中的位置)


    特点

    为什么局部内部类在访问局部变量的时候,要求这个局部变量要被final修饰?

    因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用,但是jdk1.8取消了这个事情,所以我认为这是个bug


    内部类的特点

    * 内部类可以直接访问外部类的成员,包含私有的

    * 外部类要访问内部类的成员,需要创建对象


    public class aa {
    
      public static void main(String[] args) {
    
          // 外部类名.内部类名 对象名 = 外部类名.内部类对象;
    
        Outer.Inner oi = new Outer.Inner();
    
        oi.method();
    
        Outer.Inner2.print();
    
      }
    
    }
    
    //静态的内部类
    
    class Outer {
    
      static class Inner {
    
      public void method() {
    
        System.out.println("method");
    
      }
    
    }
    
     
    
    static class Inner2 {
    
      public static void print() {
    
        System.out.println("print");
    
      }
    
      }
    
    }
    

    public class aa {
    
    public static void main(String[] args) {
    
      Outer.Inner oi = new Outer().new Inner();
    
      oi.show();
    
    }
    
    }
    
    //成员内部类
    
    // 要求:使用已知的变量,在控制台输出30,20,10。
    
     
    
    // 内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this
    
     
    
    class Outer {
    
    public int num = 10;
    
     
    
    class Inner {
    
      public int num = 20;
    
     
    
      public void show() {
    
        int num = 30;
    
        System.out.println(num);
    
        System.out.println(this.num);
    
        System.out.println(Outer.this.num);
    
      }
    
      }
    
    }
    

    public class aa {
    
    public static void main(String[] args) {
    
        // Outer.Inner oi = new Outer().new Inner();
      
        // oi.method();
    
        Outer o = new Outer();
    
        o.print();
    
      }
    
    }
    
    class Outer {
    
      private int num = 10;
    
     
    
      private class Inner {
    
        public void method() {
    
          System.out.println(num);
    
        }
    
      }
    
        public void print() {
    
          Inner i = new Inner();
    
          i.method();
    
        }
    
    }
    

    public class aa {
    
      public static void main(String[] args) {
    
        Outer o = new Outer();
    
        o.method();
    
      }
    
    }
    
     
    
    // 局部内部类
    
    class Outer {
    
      public void method() {
    
        final int num = 10;
    
        class Inner {
    
          public void print() {
      
            System.out.println(num);
    
          }
    
        }
        Inner i = new Inner();
    
        i.print();
    
       }
    
    /*
    
    * public void run() { Inner i = new Inner(); //局部内部类,只能在其所在的方法中访问
    
    * i.print(); }
    
    */
    
    }
    
  • 相关阅读:
    UVA-1623 Enter The Dragon (贪心)
    UVA-1619 Feel Good (单调队列)
    UVA-11536 Smallest Sub-Array
    UVA-1617 Laptop (贪心)
    UVA-10570 Meeting with Aliens (枚举+贪心)
    UVA-1153 Keep the Customer Satisfied (贪心)
    UVA-1614 Hell on the Markets(贪心+推理) (有待补充)
    UVA-1613 K-Graph Oddity (着色问题)
    UVA-1612 Guess (贪心)
    todo:open和fopen的区别
  • 原文地址:https://www.cnblogs.com/loaderman/p/6403742.html
Copyright © 2020-2023  润新知