zoukankan      html  css  js  c++  java
  • 【Java基础】内部类

    非静态内部类不能拥有静态变量 为什么

    下面这段代码,如果Lazyholder没有static修饰,则编译不过

    class Singleton2 {
        private static class LazyHolder {
            private static Singleton2 singleton;
        }
        public Singleton2 getInstance() {
            return LazyHolder.singleton;
        }
    }

    "非静态内部类不能拥有静态变量" ,可以这样理解,因为JVM类加载的顺序为:

    java根据需要在运行时把字节码载入到内存,它分三个步骤:

    1、加载:类加载器查找到字节码(.class文件)并根据这些字节码创建一个Class对象;

    2、链接:验证类中的字节码,为静态域分配存储空间,需要的话同时解析这个类其它类的所有引用;

    3、初始化:当类的静态方法(构造器是特殊的静态方法)或者非常数静态域(即不是编译器常量)被首次引用时,执行静态初始化块和初始化静态数据。

    然后才能执行对象创建

    如果LazyHolder没有static,则本质上,它其实是Singleton2的非静态成员,则他必须在Singleton2对象创建之后才会进行加载,然而问题在于,另一方面根据JVM的加载顺序,static 的singleton变量又必须在LazyHolder对象存在之前完成加载,这就矛盾了。

    靠,上面的是昨天写的,今天突然看不懂了。我想了想,更简单的理解是:

          静态变量是要能够直接用类名.静态变量的方式来访问的,在上面这个例子中,实际上就是Singleton2.LazyHolder.singleton,是这样去访问,但是如果LazyHolder不是静态类,那问题就来了,你会发现singleton无法被访问了!因为Singleton.LazyHolder就已经不合法了,根本没法往下走。嗯,我觉得我自己的理解比网上查到的靠谱多了

    什么是匿名内部类

    实际上匿名内部类是对下面这种写法的简化

    public class InnerClassLearn {
        class MyThread extends Thread {
            private int i = 11;
            public int value() {return i;}
        }
        public Thread thread() {return new MyThread();}
    
        public static void main(String[] args) {
            Thread thread = new InnerClassLearn().thread();
        }
    }

    用匿名内部类的方式重写上面的代码:

    public class InnerClassLearn {
        
        public Thread thread() {
            return new Thread() {
                private int i = 11;
                public int value() {return i;}
            };
        }
        
        public static void main(String[] args) {
            Thread thread = new InnerClassLearn().thread();
        }
    }

    其中红色部分就是一个继承于 Thread类的匿名内部类

  • 相关阅读:
    第七周——Linux内核如何装载和启动一个可执行程序
    第十八章读书笔记
    第三章读书笔记
    第六周——分析Linux内核创建一个新进程的过程
    第五章读书笔记
    Linux内核分析——分析system_call中断处理过程
    第一二章读书笔记
    20145217《网络对抗》 Web安全基础实践
    20145217《网络对抗》web基础
    20145217《网络对抗》 MSF基础应用
  • 原文地址:https://www.cnblogs.com/heben/p/5750079.html
Copyright © 2011-2022 走看看