zoukankan      html  css  js  c++  java
  • Java 类的加载过程(阿里面试题)

    问以下程序打印出什么内容:

      问题及解析如下:

    /**
     * 加载方法不等于执行方法,初始化变量则会赋值
     *             类加载顺序应为 加载静态方法-初始化静态变量-执行静态代码块
     *             实例化时 先加载非静态方法-实例化非静态变量-执行构造代码块-执行构造函数
     * @author panteng
     *
     */
    public class StaticTest {
        /**第一个加载*/
        public static int k = 0;
        /**第二个加载,因为是new一个实例,
         * 首先初始化j 打印出  1:j i=0 n=0
         * 执行构造块     打印出  2:构造快 i=1 n=1
         * 执行构造方法 打印出  3:t1 i=2 n=2
         * 实例化完成
         */
        public static StaticTest t1 = new StaticTest("t1");
        /**第三个加载 过程同上
         * 首先初始化j 打印出  4:j i=3 n=3
         * 执行构造块     打印出  5:构造快 i=4 n=4
         * 执行构造方法 打印出  6:t2 i=5 n=5
         */
        public static StaticTest t2 = new StaticTest("t2");
        /**第四个加载
         * 打印出  7:i i=6 n=6
         */
        public static int i = print("i");
        /**
         * 第五个加载
         */
        public static int n = 99;
        /**
         * 此变量在类加载的时候并不初始化,在实例化类的时候初始化
         */
        public int j = print("j");
         
        {
            print("构造快");
        }
        /**
         * 第六个加载 此时,n已经被初始化  所以打印出
         * 8:静态块 i=7 n=99
         */
        static{
            print("静态块");
        }
        //-----------以上属于类加载---------------------
        /**
         * 实例化过程:
         *         首先加载非静态方法集;
         *         初始化非静态变量:9:j i=8 n=100
         *         执行构造块:10:构造快 i=9 n=101
         *         执行构造方法:11:init i=10 n=102
         * 实例化完成
         */
        
        /**
         * 执行构造函数  实例化完成
         * @param str
         */
        public StaticTest(String str) {
            System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
            ++n;
            ++i;
        }
        /**
         * 这个应该是最先加载 但是,加载不等于执行
         * 因为如果不加载此函数,静态变量是无法初始化的
         * @param str
         * @return
         */
        public static int print(String str) {
            System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
            ++i;
            return ++n;
        }
        
        public static void main(String[] args) {
            /**首先加载类,然后实例化:
             * 类加载过程:
             *         首先加载所有的静态方法,但不执行;
             *         然后按照静态变量的顺序开始初始化
             *         静态变量初始化完毕后执行静态构造块(不执行构造块)
             *         此时类加载完毕
             * 实例化过程:
             *         加载非静态方法
             *         初始化非静态变量
             *         执行构造代码块
             *         执行构造函数
             *         此时实例化完毕
             */
            StaticTest t = new StaticTest("init");
        }
     
    }
     
  • 相关阅读:
    Android — Camera聚焦流程
    Camera.Parameters 参数
    Android 中的 Service 全面总结
    android中Camera setDisplayOrientation使用
    Android动画学习笔记-Android Animation
    mediaplayer与surfaceView,无法播放问题
    android错误之MediaPlayer用法的Media Player called in state *,androidmediaplayer
    转:Android应用开发性能优化完全分析
    Android开发者指南(9) —— ProGuard
    计算机科学图书待读
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/5869099.html
Copyright © 2011-2022 走看看