zoukankan      html  css  js  c++  java
  • 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类

    1.java变量类型

    java变量类型分:基本数据类型变量和Object数据类型变量,变量也是占用者内存的 例如:

    int i = 3; i这个变量保存的就是整形3, 占32位

    Object a = new Object(); a这个变量保存着一个指向堆中对象的引用(指针), a占用的内存是一个int型32位

    我们都知道JVM内存分很多快,不同变量保存在内存中的位置也不同:

    静态变量:保存在方法区

    成员变量:保存在堆的对象中

    局部变量:保存在栈中

    2.类加载与静态变量初始化

    类加载分:加载 - 验证 - 准备 - 解析 - 初始化, 其中涉及到静态变量初始化的有准备和初始化阶段

    准备:位静态变量分配内存,并初始化,对final static变化和static初始化又不同

    对static变量, 只是赋其变量类型的默认值, 如:Object类型变量就是null, int类型变量就是0, boolean类型变量就是false

    而对final static类型变量则是直接进行初始化, 创建引用的实例并给变量赋值.

    这样做的原因是因为:final变量是不可变的, 如果像非final静态变量那样, 在准备阶段只是给他赋default值, 她将一直是null/0/false, 这显然是不可行的.

    3.初始化的时机和步骤

    步骤:

      1>如果类还没加载和连接, 那么先加载和连接

          2>如果父类还没有初始化, 先初始化父类

      3>执行静态代码块中代码

    时机:

      1>new 实例时

      2>子类初始化

      3>访问静态变量或调用静态方法(非final static)

      4>class.forname("xx")加载类

      5>作为启动类时

    被动引用不会引发类初始化:

      1>通过子类访问父类静态方法和变量, 不会造成子类的初始化

      2>实例化类对象的数组不会造成类初始化, A[] as = new A[2] A不会初始化

      3>引用常量不会造成类初始化, final static String CONSTACT常量在准备阶段已经初始化了, 进入了常量池后A.CONSTACT实际上直接指向常量池, 而不是方法区的class

      4>使用静态内部类不会造成外部类的初始化

    4.String不可变

    1>String内部实际上是用一个private final char[] value;保存内容的, 一但String实例被创建value这个final变量的引用就不能被修改,

    2>同时String没有提供获得这个char[]的方法, 所以也不能通过获得数组引用来修改数组内容(不用反射的话)

    而StringBuilder内部是一个普通的char[] 自然可以随意改变.

    5.泛型使用

    1>普通类泛型声明:
    public Bean<T> {

    }
    静态方法泛型声明:
    public static <T> T get(){

    }
    2>编译时泛型擦除: T只在编译期有警告,在JVM中都是Object
    T obj = (T) t; 实际上是 Object obj = (Object) t;
    3>通配符与继承:
    泛型没有继承关系B<Object>不是B<String>的父类
    B<?> 匹配所有类
    B<? extends Number> 匹配所有Number的子类
    B<? super Number> 匹配所有Number的父类
    4>*只有泛型集合,没有泛型数组(T[] ts 这种是不存在的)

    6.内部类

    内部类是一个编译时概念,一但编译成功就会成功两个完全不同的类out.class out$in.class
    1.成员内部类:
    成员内部类不能有static方法和变量
    成员内部类要先创建外部类对象才能创建对象
    Out out = new Out();
    Out.In in = out.new In();
    2.局部内部类
    和成员内部类相似,只是作用域在方法内,不能被外部引用,但能访问方法final参数
    3.静态内部类
    使用和普通类一样,只是代码写在了外部类里边,对静态内部类的操作不会造成外部类的初始化
    Out.In in = new Out.In();

  • 相关阅读:
    关于自发电的一些想法
    折腾了一个晚上的业余时间,终于把一块廉价的tftlcd连到了我的树莓派上
    关于飞行器从外太空返回地球时候的减速器的思考与假象
    echart漏斗图背景多出一个方框的问题解决,浪费了两个小时的教训
    linux加密文件系统 fsck 无法修复一例
    天津
    [转]Bitmap图片缩放
    python spark 配置
    screen
    tar 命令
  • 原文地址:https://www.cnblogs.com/bianzy/p/6518858.html
Copyright © 2011-2022 走看看