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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 西门夜说 中级黑马   /  2015-3-24 23:51  /  774 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class a
{       
        static int a = 5;
        int b = 3;
        static
        {
                a = 20;
                System.out.println(a);
        }
       
        public void set(int b)
        {
                this.b = b;
        }
}

class aj
{
        static
        {
                System.out.println("b");
        }
        public static void main(String[] args)
        {
                new a();
                new a();
                a a1 = new a();
                a a2 = new a();
                a1.set(30);
                System.out.println(a1.b);
                System.out.println(a2.b);
               
                a1.a=50;
                System.out.println(a1.a);
                System.out.println(a2.a);
        }
        static
        {
                System.out.println("c");
        }
}

评分

参与人数 3黑马币 +45 收起 理由
郝永亮 + 5 淡定
200米王朝 + 20 继续努力
张安哲 + 20 赞一个!

查看全部评分

15 个回复

倒序浏览
静态代码块优先执行 并且只执行一次
回复 使用道具 举报
静态内容随类加载而加载,静态代码块只执行一次,优于对象执行

评分

参与人数 1黑马币 +1 收起 理由
西门夜说 + 1 班里有漂亮妹子给我介绍介绍

查看全部评分

回复 使用道具 举报
首先要运行主函数,类aj加载进内存,此时虚拟机读类aj中的静态代码块,输出b,c ;接下来 用new a 加载了类a,然后类a中的静态代码块加载进内存 为类a 进行初始化,输出20,第二个 new a(); 因为已经在内存中加载过了,所以不再加载;此时static int a=5 int b=3;同理将堆内存中开辟的2个空间地址赋值给a1,a2使他们指向2个不同对象。接下来用a1.set(30)将 a1中b的值修改为30,打印a1.b=30,但是a2.b=3没有变。然后用a1.a=50将 数据区的a值修改为50,所以a1.a=a2.a=50 两次打印均为50. 最终打印结果为 b c 20 30 3 50 50 以上为分析过程。
手打不易,求分!!

评分

参与人数 1黑马币 +1 收起 理由
西门夜说 + 1

查看全部评分

回复 使用道具 举报
  1. //b  c 20   30  3  50  50
  2. class a
  3. {        
  4.         static int a = 5;
  5.         int b = 3;
  6.         static
  7.         {
  8.                 a = 20;
  9.                 System.out.println(a);
  10.         }
  11.         
  12.         public void set(int b)
  13.         {
  14.                 this.b = b;
  15.         }
  16. }

  17. class aj
  18. {
  19.         static
  20.         {
  21.                 System.out.println("b");
  22.         }
  23.         public static void main(String[] args)
  24.         {
  25.                 new a();
  26.                 new a();
  27.                 a a1 = new a();
  28.                 a a2 = new a();
  29.                 a1.set(30);
  30.                 System.out.println(a1.b);
  31.                 System.out.println(a2.b);
  32.                
  33.                 a1.a=50;
  34.                 System.out.println(a1.a);
  35.                 System.out.println(a2.a);
  36.         }
  37.         static
  38.         {
  39.                 System.out.println("c");
  40.         }
  41. }
  42. /*1.加载aj.class文件,dj类里的静态代码块随着类的加载而加载,打印 ‘b’,‘c’.
  43.   2.第一个:new a()创建匿名对象:类a被加载,静态的int a = 5,然后再是a被静
  44.   态代码块里的a=20赋值,此时 int a = 20,并且打印静态代码块里的a = 20。
  45.   3.第二个:new a()只是又创建了一个匿名对象。
  46.   4.a a1 = new a(); 创建对象a1   a1堆里 int b  = 3;
  47.   4.a a2 = new a(); 创建对象a2   a2堆里 int b = 3;
  48.   5.a1.set(30); a1调用set(int)方法 把30赋给本对象的int b,此时 a1堆里
  49.   的b =30;
  50.   6. System.out.println(a1.b); 打印 对象a1里的b为30.
  51.   7.System.out.println(a2.b);   打印对象a2里的b为3.
  52.   8.a1.a=50; a1给a赋值50.
  53.   9.System.out.println(a1.a); 打印a为50
  54.   10.System.out.println(a2.a);打印a为50;原因:因为a被static修饰所以被类的
  55.   所有实例共享。*/
复制代码
回复 使用道具 举报
rick1991chen 发表于 2015-4-12 20:40
首先要运行主函数,类aj加载进内存,此时虚拟机读类aj中的静态代码块,输出b,c ;接下来 用new a 加载了类a ...

“同理将堆内存中开辟的2个空间地址赋值给a1,a2使他们指向2个不同对象。”请问下 这句话的意思里,是否是a1,a2的地址值是不同的,但是地址里存的内容指向是相同的。是这样吗?
回复 使用道具 举报
Dylon 发表于 2015-4-12 21:28
“同理将堆内存中开辟的2个空间地址赋值给a1,a2使他们指向2个不同对象。”请问下 这句话的意思里,是否 ...

如果a1和a2地址里存的内容指向是相同的话,a1的b改变了,那a2的b也不是要跟着一起改变?所以应该是不同的吧。
回复 使用道具 举报
耳东君 发表于 2015-4-12 21:33
如果a1和a2地址里存的内容指向是相同的话,a1的b改变了,那a2的b也不是要跟着一起改变?所以应该是不同的 ...

a1 a2在堆内存是2个呀 ,b不改变 因为b不是全局变量呀
回复 使用道具 举报
Dylon 中级黑马 2015-4-12 21:44:45
9#
耳东君 发表于 2015-4-12 21:33
如果a1和a2地址里存的内容指向是相同的话,a1的b改变了,那a2的b也不是要跟着一起改变?所以应该是不同的 ...

我也认为应该是不同的,但是看楼上的解释,那个数据区把我弄糊涂了,你的意思是说a1.a=50;是由于a被static修饰,所以后面a2.a的值也是50,并不是数据区的关系?楼上的说法不完全正确?
回复 使用道具 举报
Dylon 中级黑马 2015-4-12 21:50:55
10#
rick1991chen 发表于 2015-4-12 21:36
a1 a2在堆内存是2个呀 ,b不改变 因为b不是全局变量呀

b的那个我明白,我把全局变量给忘记了!现在明白了!Thank you!
回复 使用道具 举报
学习学习
回复 使用道具 举报
rick1991chen 发表于 2015-4-12 20:40
首先要运行主函数,类aj加载进内存,此时虚拟机读类aj中的静态代码块,输出b,c ;接下来 用new a 加载了类a ...

看你长得丑不丑!丑的话就给你分
回复 使用道具 举报
回复 使用道具 举报
Dylon 发表于 2015-4-12 21:44
我也认为应该是不同的,但是看楼上的解释,那个数据区把我弄糊涂了,你的意思是说a1.a=50;是由于a被stat ...

小伙子静态还不清晰啊~~~
回复 使用道具 举报
西门夜说 发表于 2015-4-12 23:17
看你长得丑不丑!丑的话就给你分

我要分!!虽然我长得确实不帅:'(
回复 使用道具 举报

大哥~赏点分吧!~

评分

参与人数 1黑马币 +1 收起 理由
西门夜说 + 1

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马