A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zhang_qian 中级黑马   /  2012-5-14 12:54  /  2469 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java 中静态内部类字段什么时候初始化?是在外部类加载的时候就初始化吗?高手帮忙讲解一下,谢谢

7 个回复

倒序浏览
內部類也是類么,應為是靜態,所以應該是在首次用到時初始化一次(僅供參考,個人見解)
回复 使用道具 举报
不是,首先,静态内部类中并不是所有字段都是静态的,也有非静态的,如果字段是静态的,就会在外部类加载的时候分配空间进行初始化,如果不是静态字段就在创建对象的时候分配空间进行初始化。你可以理解成和普通类的字段一样,只不过他是随着外部类的加载而加载的,因为这个内部类是静态的,外部类一加载内部类就加载了。
回复 使用道具 举报
嗯  我认为是在调用的时候初始化  而不是在一开始初始化  因为我下面的这个代码中直接访问报错了
  1. public class InerClassDemo {
  2.         public static void main(String[] args){
  3.                 //new Inner().x;  报错了  不能直接访问这个x
  4.                 new Inner();
  5.                 new Inner().show();
  6.                 new OutClassDemo.InnerClass();
  7.         }
  8.        
  9.         static class Inner{
  10.                 static{
  11.                         System.out.println("内部类静态代码块" +Inner.x);//输出内部类静态代码块0
  12.                 }
  13.                 static int x = 12;
  14.                 static void show(){
  15.                         System.out.println(x);
  16.                 }
  17.                 static{
  18.                         System.out.println("内部类静态代码块"+Inner.x);//输出内部类静态代码块12
  19.                 }
  20.         }
  21. }

  22. class OutClassDemo{
  23.         static class InnerClass{
  24.                 static{
  25.                         System.out.println("外部类中的内部类静态代码块"+InnerClass.x);//输出外部类中的内部类静态代码块0
  26.                 }
  27.                 static int x = 20;
  28.                 static{
  29.                         System.out.println("外部类中的内部类静态代码块"+InnerClass.x);//输出外部类中的内部类静态代码块20
  30.                 }
  31.         }
  32. }
复制代码
回复 使用道具 举报
错了错了,静态内部类中的字段无论是静态的还是非静态的,都是实例化的时候才会初始化,在这一点上他和普通的类是不一样的
回复 使用道具 举报
之前是在一java编程思想书上看到的,但是实际测试结果是后一种,以实际测试结果为准
回复 使用道具 举报
It's_Zero 发表于 2012-5-14 13:33
嗯  我认为是在调用的时候初始化  而不是在一开始初始化  因为我下面的这个代码中直接访问报错了 ...

谢谢帮助,我再好好看看
回复 使用道具 举报
java 中静态内部类字段什么时候初始化?这句中的静态内部类字段是指静态内部类本身还是静态内部类的字段呢?如果指的是静态内部类本身,那么并不是在外部类加载的时候就初始化的,他们是独立的。如果指是静态内部类的字段的话,又分为两种情况,一种是静态的字段,静态的字段是在内部类加载的时候初始化的,另一种是非静态字段,非静态字段是在创建内部类实例的时候才会被初始化。也就是说内部类的加载与外部类是相互独立的,没有依赖性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马