• 技术文章 >java >java基础

    java类的两种引用方法

    小妮浅浅小妮浅浅2021-05-25 14:18:26原创168

    1、类的主动引用,一定会发生类的初始化

    当虚拟机启动,先初始化main方法所在的类

    实例化一个类的对象

    调用类的静态成员(除了final常量)和静态方法

    使用java.lang.reflect包的方法对类进行反射调用

    当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类

    2、类的被动引用,不会发生类的初始化

    当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化

    通过数组定义类引用,不会触发此类的初始化

    引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)

    3、实例

    package com.volcano.reflection;
    //什么时候会发生类的初始化,除了第一个注释一直开着,其他都要独立打开测试,否则不准确
    public class TestReflection3 {
        static {
            //1.虚拟机启动就会最先初始化main方法所在的类 会
            System.out.println("main方法被加载");
        }
        public static void main(String[] args) throws ClassNotFoundException {
            //2.实例化一个对象 会
            //new Father();
            //3.调用类的静态成员(除了final常量)和静态方法 会
            //System.out.println(Son.a);
            //4.使用java.lang.reflect包的方法对类进行反射调用 会
            //Class cls = Class.forName("com.volcano.reflection.Father");
            //5.当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 会
            //new Son();
     
            //6.当访问一个静态域时,只有真正声明这个域的类才会被初始化 不会
            //System.out.println(Father.a);//两个都是只加载Father
            //System.out.println(Son.a);//因为a是Father的静态成员
            //7.通过数组定义类引用,不会触发此类的初始化 不会
            //Father[] fathers = new Father[10];
            //8.引用常量不会触发此类的初始化 不会
            //System.out.println(Father.B);
     
        }
    }
    class Father{
        static {
            System.out.println("Father被加载");
        }
        static int a=100;
        static final int B = 300;
    }
    class Son extends Father{
        static {
            System.out.println("Son被加载");
        }
        static int c=200;
     
    }

    以上就是java类的两种引用方法,希望对大家有所帮助。更多Java学习指路:Java基础

    专题推荐:java类
    上一篇:java类加载器的分类 下一篇:java反射中有哪些API

    相关文章推荐

    • python怎么调用java类• java类实现日期的时间差• java类成员中的访问级别有哪些• 如何获取java类中的字段修饰符?• java类加载器如何理解?• java类变量是什么?• java类中的两种成员访问• java类加载器的常用方法• java类加载的过程• java类加载器的分类
    品易云

    全部评论我要评论

  • 取消发布评论发送
  • 

    Python学习网