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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 移动小坦克 中级黑马   /  2013-3-4 23:29  /  2294 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Out
{
        static
        {
                System.out.println("out de jing tai dai ma kuai");
        }
        static class in  //如果内部类不是静态的那么,无法在内部类中定义一个静态代码快
        {
                static
                {
                        System.out.println("in de jing tai dai ma kuai");
                }
        }
}

-------------------------------------------------------------------------------
public class JingTaiDaiMaKuai {

        public static void main(String[] args) {
               
                new Out();
        }

}
打印结果为:out de jing tai dai ma kuai

问题一:为什么如果内部类不是静态的,内部类当中就无法定义一个静态代码快?
问题二:静态应该是随着类的加载而存在于方法区中,那么当new Out()时,加载了Out类,所以会执行一次静态代码快System.out.println("out de jing tai dai ma kuai");
              那么静态内部类为什么这个时候没有被加载,它竟然是静态的,就想当于外部类的一个静态成员啊,那当外部类被加载时,静态内部类不也应该被加载吗?
              那静态内部类的静态代码块也应该被执行啊?
              如果加载了内部类,那为什么内部类的静态代码块没有被执行?
问题三:内部类(没有静态)什么时候才会被加载进内存?



评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
问题一:  内部类内有静态成员,内部类必须静态的。因为内部类作为外部类的一个成员,内部类有静态的话,加载外部类时也是要把内部类里面的静态成员一块先放进一个静态区的,如果内部类不是静态成员,就无法将内部类的静态成员也放进去了。
问题二:加载类时它会对类中成员初始化,静态会放在方法区中,并没有说要加载静态成员。
问题三:要用到内部类这个类的时候。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
问题一  因为内部类是一种特殊的类,static表示了类的唯一性不能被继承,在加载的时候只有静态的内部类的静态代码才能被加载。

评分

参与人数 1黑马币 +6 收起 理由
黄玉昆 + 6 赞一个!

查看全部评分

回复 使用道具 举报
静态类是不能实例化的,即不能new 我们直接使用它的属性与方法,静态类最大的特点就是共享。 静态类中的所有成员必须是静态的。 静态类可以有静态构造函数,静态构造函数不可继承。 静态构造函数可以用于静态类,也可用于非静态类。 静态构造函数无访问修饰符、无参数,只有一个 static 标志。 静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。 非静态类实例化加载它,才能调用
问题一:在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员 变量是不允许的。在编译的时候就通不过。
问题二:静态内部类的访问为new Outer.Inner(),你以上代码就访问不到内部类
问题三:内部类随着外部类的加载而被加载进内存。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
崔芝鲁 发表于 2013-3-5 00:17
静态类是不能实例化的,即不能new 我们直接使用它的属性与方法,静态类最大的特点就是共享。 静态类中的所 ...

不叫静态构造函数吧,叫静态代码块,静态代码块是初始化类的,不是初始华对象的,只有在创建对象时才涉及到构造。”当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次“。这句话其实可以简写成,”当类被虚拟机加载进内存时“。
没有鸡蛋里挑骨头的意思,多多切磋,共同进步嘛。。。。。。
回复 使用道具 举报
李志卫 发表于 2013-3-4 23:57
问题一:  内部类内有静态成员,内部类必须静态的。因为内部类作为外部类的一个成员,内部类有静态的话,加 ...

加载类时会对类中成员初始化????
我知道静态代码块是用来初始化类的,但是如果没有静态代码块
你的意思是其实类内部有一个默认的静态代码块?该静态代码块内容为空?就像默认构造函数?
回复 使用道具 举报
韩松范 发表于 2013-3-5 01:28
加载类时会对类中成员初始化????
我知道静态代码块是用来初始化类的,但是如果没有静态代码块
你的意 ...

是静态成员,凡是静态成员都在类加载的时候默认和显式初始化一遍, 其他的非静态就在创建对象的时候处理。没有静态成员貌似类就没什么好初始化的了。
回复 使用道具 举报
李志卫 发表于 2013-3-5 02:00
是静态成员,凡是静态成员都在类加载的时候默认和显式初始化一遍, 其他的非静态就在创建对象的时候处理 ...

嗯,我也想,非静态成员不会被初始化,才追问的
回复 使用道具 举报
韩松范 发表于 2013-3-5 02:04
嗯,我也想,非静态成员不会被初始化,才追问的

对,但非静态成员在创建对象时,依然要默认和显式初始化一遍。
回复 使用道具 举报
韩松范 发表于 2013-3-5 01:10
不叫静态构造函数吧,叫静态代码块,静态代码块是初始化类的,不是初始华对象的,只有在创建对象时才涉及 ...

一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用
比如main方法就必须是静态的 这是程序入口
两者的区别就是:静态代码块是自动执行的;
静态方法是被调用的时候才执行的.
回复 使用道具 举报
同学;

问题一;
当内部类中定义了静态成员,该内部类必须是static的。
代码;
public class Outer {
       
        class Inner
        {
                static void function()                //function()编译报错,当内部类是非静态时,那么内部类里面的成员就不能用静态声明
                {
                        System.out.println("innner :");
                }
        }
注意:当内部类中定义了静态成员,该内部类必须是static的。
                  当外部类中的静态方法访问内部类时,内部类也必须是static的。

问题二;
静态内部类的静态代码块不会被执行的,,因为你写的是new Out();,,应该是Out.in ,,,,你的静态内部类相当于外部类的静态成员,所以访问类里面的静态成员时就是类名 . 静态成员,,,,当你写new Out()时是没有访问到内部类的,所以当然不会执行内部类里面的代码,,,
内部类是静态的所以外部类类名可以直接调用,,,Out.in就是内部类了

问题三:内部类是外部类的成员,他随着外部类的加载而被加载进内存。
回复 使用道具 举报
崔芝鲁 发表于 2013-3-5 00:17
静态类是不能实例化的,即不能new 我们直接使用它的属性与方法,静态类最大的特点就是共享。 静态类中的所 ...

静态内部类的访问为new Outer.Inner(),,,这句话中new Outer.Inner(),应该是Out.in,,,,,因为内部类是静态的所以可以 外部类类名,内部类名,,而不需要new一个外部类对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马