• java内部类的浅谈(错误之处还请见谅!)


    在java中,内部类是指在一个外部类的内部再定义一个类(即类中的类)。类名不需要和文件夹相同。

      内部类分为: a:成员内部类,b:局部内部类,c:静态内部类,d:匿名内部类 。

      a:成员内部类:成员内部类是最普通的内部类,它的定义为位于另一个类的内部。就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问

    class Outter {
        private int age = 20;
          
        class Inner {
            private int age = 21;
            public void print() {
                int age = 22;
                System.out.println("局部变量:" + age);
                System.out.println("内部类变量:" + this.age);
                System.out.println("外部类变量:" + Outter.this.age);
            }
        }
    }
      
    public class test1 {
        public static void main(String[] args) {
            Outter out = new Outter();
            Outter.Inner in = out.new Inner();
            in.print();
        }
    }
    输出的结果:
    局部变量:22
    内部类变量:21
    外部类变量:20

    可以看出:成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。我是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的

    b:局部内部类

    局部内部类是定义在一个方法里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内。

    class Outter {
        private int age = 12;
        public void Print(final int x) {   
            class Inner {
                public void inPrint() {
                    System.out.println(x);
                    System.out.println(age);
                }
            }
            new Inner().inPrint();
        }   
    
    }
      
    public class test1 {
        public static void main(String[] args) {
            Outter out = new Outter();
            out.Print(10);
        }
    }

    输出的结果:
    10
    12

    以上的代码中我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义。换句话说,在方法中定义的内部类只能访问方法中final类型的局部变量,这是因为在方法中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于局部变量被设置为final,所以不能再内部类中改变局部变量的值。

    c:静态内部类

    静态内部类就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,即不需要创建外部类,也不需要创建内部类。

    d:匿名内部类 。

    匿名内部类其实是局部内部类的一种,就是内部类的简化写法。前提条件是  存在一个类或者接口(匿名内部类必须和某个类或者接口发生关系);本质是一个继承了该类或者实现了该接口的子类匿名对象。

    匿名内部类是不能有访问修饰符和static修饰符的。

    匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限。

  • 相关阅读:
    bootstrap按钮
    bootstrap输入框组
    bootstrap单选
    bootstrap复选框
    bootstrap输入框
    bootstrap浮动
    HO引擎近况20201017
    C#.NET项目中引用EXCEL报错的问题
    MATLAB实例:读取Fashion MNIST数据,保存为.mat文件,并展示部分样例
    MATLAB实例:BP神经网络用于回归任务
  • 原文地址:https://www.cnblogs.com/wty1994/p/9351141.html
Copyright © 2020-2023  润新知