黑马程序员技术交流社区

标题: 类中为什么不能直接定义语句? [打印本页]

作者: 张晓辉    时间: 2013-9-6 18:29
标题: 类中为什么不能直接定义语句?
本帖最后由 张晓辉 于 2013-9-6 19:01 编辑
  1. class zifuchuanlianxi
  2. {
  3. public static void main(String[] args)
  4. {
  5. stringa b=new stringa(" ab fg ");
  6. b.gets();

  7. }
  8. }
  9. class stringa
  10. {
  11. private String str;
  12. stringa(String str)
  13. {
  14. this.str=str;
  15. }
  16. int start=0,end=str.length()-1;
  17. while (start<=end&&str.charAt(start)==' ')
  18. {
  19. start++;
  20. }
  21. while (start<=end&&str.charAt(end)==' ')
  22. {
  23. end--;
  24. }
  25. public void gets()
  26. {
  27. String s=str.substring(start,end+1);
  28. System.out.println(s);
  29. }
  30. }
复制代码
2
  1. class zifuchuanlianxi
  2. {
  3. public static void main(String[] args)
  4. {
  5. stringa b=new stringa(" ab fg ");
  6. b.gets();

  7. }
  8. }
  9. class stringa
  10. {
  11. private String str;
  12. stringa(String str)
  13. {
  14. this.str=str;
  15. }

  16. public void gets()
  17. {
  18. int start=0,end=str.length()-1;
  19. while (start<=end&&str.charAt(start)==' ')
  20. {
  21. start++;
  22. }
  23. while (start<=end&&str.charAt(end)==' ')
  24. {
  25. end--;
  26. }
  27. String s=str.substring(start,end+1);
  28. System.out.println(s);
  29. }
  30. }
复制代码
这是一个把输入字符串两端空格去掉的程序,图1编译不通过,图2编译通过,区别就是图1while循环语句直接放在了类中,图2放在方法中,后来想了想类中可以定义变量,常量,方法,貌似不能定义语句;为啥不能定义语句,但是我创建对象,数据初始化,并进行了初始运算,好像没什么不对啊。。。



作者: 李锡碧    时间: 2013-9-6 18:43
  1. while (start <= end && str.charAt(start) == ' ') {
  2.                 start++;
  3.         }
  4.         while (start <= end && str.charAt(end) == ' ') {
  5.                 end--;
  6.         }
复制代码
要放在方法里的
作者: 张晓辉    时间: 2013-9-6 18:51
刚才给毕老师打电话了,毕老师回复“上帝就是这么定义的”,好吧,学生领教了。
作者: 王广亚    时间: 2013-9-6 18:51
类中是不可以直接一些语句的,要想初始化对象你可以放在构造方法,和构造代码快中啊。要想在类加载时就初始化一些数据的话还可以放到静态代码块中。
作者: 张晓辉    时间: 2013-9-6 18:59
王广亚 发表于 2013-9-6 18:51
类中是不可以直接一些语句的,要想初始化对象你可以放在构造方法,和构造代码快中啊。要想在类加载时就初始 ...

不错,构造方法中可以,静态方法中貌似不能,静态比属性先初始化,数据没进来,怎么处理,不过答案可鉴,感谢。

作者: 王广亚    时间: 2013-9-6 19:13
本帖最后由 王广亚 于 2013-9-6 19:16 编辑
张晓辉 发表于 2013-9-6 18:59
不错,构造方法中可以,静态方法中貌似不能,静态比属性先初始化,数据没进来,怎么处理,不过答案可鉴, ...

首先要明确,静态只能访问静态,所以要想在静态代码快中给成员赋值,那么这个成员也必须是静态的。
你看看下面这个例子能不能初始化。
  1. public class zifuchuanlianxi
  2. {public static int a;

  3.         static{
  4.                 a=12;
  5.         }
  6.         public static void main(String[] args)
  7.         {
  8.                 System.out.print(a);
  9.         
  10.         }
  11. }//还有就是我说的是静态代码块,你说的是静态方法,静态方法也是需要调用才能运行的
复制代码

作者: yanglfree    时间: 2013-9-6 20:15
构造函数,构造代码块,方法都可以用语句,没必要直接给语句啊,再说了类就是描述事物用的,属性和方法就可以了,要语句干吗?
作者: 张晓辉    时间: 2013-9-6 20:15
请问下 静态属性跟静态代码块  哪个先初始化?如上例中的public static int a;跟static{};
作者: 毋须繁华    时间: 2013-9-6 21:24
张晓辉 发表于 2013-9-6 20:15
请问下 静态属性跟静态代码块  哪个先初始化?如上例中的public static int a;跟static{}; ...

Java程序运行内存顺序(非完整版)
加载静态变量结构
加载静态方法
加载静态代码块并对静态变量进行初始化
加载实例变量结构
加载实例方法
加载构造方法
加载实例代码块
类加载发生在访问类的静态成员或创建对象时一个类只能被加载一次,加载完毕后将不释放
只学到这里,还有一些别的,暂时没学到- - 不过貌似可以回到你的问题了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2