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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李新辉 中级黑马   /  2013-10-21 15:04  /  2429 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题一:


class StaticCode{




        static

        {





                  System.out.print("a");

        }



}
class StaticCodeDemo
{
        public static void main(String[] args)
        {
                new Demo();
                new Demo();
        }
}

静态代码块随着类的加载,只加载一次
那么第一个对象建立了,静态代码块对其进行了初始化
那么第二个对象是根本就没建立呢?
还是建立了对象,而静态代码块没有对其进行初始化呢?




问题二:
int i;
i++;能独成为语句



int num=60;
num>>>1;为什么不能单独成为语句呢?

评分

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

查看全部评分

14 个回复

倒序浏览
手敲进去的。发表后发现这么乱   郁闷……
回复 使用道具 举报
静态代码块是给类初始化的啊  随着类加载而加载   只加载一次, 第二个对象当然有建立了

你要明白:我们使用一个类,必须把它加载到内存,形成字节码文件。你加载了类,静态代码快就运行了,跟创没创对象没关系的,
构造代码块才是给类所有对象初始化的。
不明白什么叫能不能单独成语句,
回复 使用道具 举报
murder_fol 发表于 2013-10-21 15:33
静态代码块是给类初始化的啊  随着类加载而加载   只加载一次, 第二个对象当然有建立了

你要明白:我们使 ...


int i;
i++;
可以编译通过



int num=60;
num>>>1;
编译不通过

提示如下
                错误: 不是语句
                num>>>2;
                   ^
1 个错误
回复 使用道具 举报
在程序运行的到需要某个类的时候,JVM将其加载进方法区,而被static修饰的变量方法或者这个代码块都是在方法区
在类加载的时候,会随着类加载而执行,而不是随着对象的创建而执行(对象创建在堆内存,同时包含了其独有的变量方法等)
你也知道,static所修饰的内容是这个类的对象共享的,因此只要有一次就行了

要是你的静态代码块不用static修饰,称之为代码块,由于不是静态的,因此对象创建的时候才执行,这个时候每创建一个对象,代码块都会执行一次
如果你怀疑对象是否创建成功,你可以多创建几个对象给每个对象的属性设置一些不同的值,用对象 名.方法 去调用其方法打印这些值,就可判断是不是同一个对象
或者用equals方法区比较

第二个问题,具体的不太清楚,但是
i++相当于i = i + 1
num >>>= 1相当于num = num >>> 1


评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报
.....   要定义有一个变量:
int  a = num>>>1;就行了  不是单独运算符吧,有返回值, java语法就这样规定的 啊

之前我还没发现
回复 使用道具 举报
風諾 发表于 2013-10-21 15:47
在程序运行的到需要某个类的时候,JVM将其加载进方法区,而被static修饰的变量方法或者这个代码块都是在方 ...

明白了,原来少了一个赋值动作
所以不能成为语句……
回复 使用道具 举报
風諾 发表于 2013-10-21 15:47
在程序运行的到需要某个类的时候,JVM将其加载进方法区,而被static修饰的变量方法或者这个代码块都是在方 ...

明白了,原来少了一个赋值动作
所以不能成为语句
回复 使用道具 举报
正如
  1. class  Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int a=0;
  6.                 int b =0;
  7.         a+b;
  8.         }
  9. }
  10. 也不行
复制代码
回复 使用道具 举报

明白了已经
i++隐含一个赋值动作
>>没有赋值动作

怎样把帖子改为已解决呢?
回复 使用道具 举报
  1. package com.itheima;

  2. class StaticCode {
  3.         static String country;
  4.        
  5.         static {
  6.                 country="China";
  7.                 System.out.println("static code isloading...");
  8.         }
  9. }

  10. class StaticCodeDemo {
  11.         static{
  12.                 System.out.println("StaticCodeDemo is loading.....");
  13.         }
  14.        
  15.         public static void main(String[] args){
  16.                 System.out.println("begin excute main method....");
  17.                 new StaticCode();
  18.                 new StaticCode();

  19.                 /*
  20.                  1、 类StaticCode中的静态代码块自动执行,尽管产生了StaticCode类的两个实例对象,但静态代码块只执行了一次。
  21.                 这个例子也说明:一个程序中用到了其他的类时才会去加载那个类。因此可以得出,类在第一次被使用的时候才被装载,
  22.                 而不是在程序启动时就装载所有可能用到的类。
  23.                 2、当类被装载是,静态代码块被执行,且只执行一次,静态代码块经常用在类属性的初始化
  24.                
  25.                 */
  26.                
  27.         int i=0;
  28.         i++;        //相当于i=i+1;
  29.        
  30.         int num=60;
  31.         //num>>>1;        这个式子是一个表达式,内部没有做类似于num=num>>>1这样的动作.类似于i+1;

  32.         }
  33. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0

O(∩_∩)O谢谢了……
说的很透彻
回复 使用道具 举报
你发帖子的时候,把代码粘贴的这个按钮里就好看了,别人也方便阅读

1.JPG (27.42 KB, 下载次数: 15)

1.JPG
回复 使用道具 举报
wenbaoxing 发表于 2013-10-21 16:22
你发帖子的时候,把代码粘贴的这个按钮里就好看了,别人也方便阅读

O(∩_∩)O谢谢……
学习了……
回复 使用道具 举报
两句 new Demo();都会建立对象的。而第一次加载类的时候,静态代码块已经执行。即输出 a。当第二次的时候也就不会在打印啦。
但是主要作用还是进行初始化。所以你这样写没有意义。
回复 使用道具 举报
回天之力 发表于 2013-10-21 23:21
两句 new Demo();都会建立对象的。而第一次加载类的时候,静态代码块已经执行。即输出 a。当第二次的时 ...

我知道没有意义
这样写是为了大家能很容易的看清楚我要问的问题……
已经解决了
>>>只是一个位运算符没有赋值动作所以不嫩作为语句存在
>>>=这个符号是可以的
谢谢……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马