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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 emos-c 于 2013-6-17 18:43 编辑

毕老师讲解地内容:当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
  问题:下面代码中的dosome函数访问了其它类成员的特有属性,但是在这个程序中我用了static修饰它没有出现问题。
             那么这种情况是一定的吗?就是说,只要没有访问到 本类对象的 特有数据就一定可以定义成静态的吗?

  1. <P>abstract class Student
  2. {
  3. public abstract void study();
  4. }
  5. class BaseStudent extends Student
  6. {
  7. String name;
  8. public void study()
  9. {
  10.   System.out.println(name+"努力学习");
  11. }
  12. public void show()
  13. {
  14.   System.out.println(name+"准备考试");
  15. }
  16. }
  17. class XingWei
  18. {
  19. public static void doSome(Student stu)
  20. {
  21.   stu.study();
  22.   BaseStudent bs=(BaseStudent)stu;
  23.   bs.show();
  24. }
  25. }
  26. class  Test
  27. {
  28. public static void main(String[] args)
  29. {
  30.   BaseStudent bs=new BaseStudent();
  31.   bs.name="张三";
  32.   XingWei.doSome(bs);
  33.   //打印结果 张三努力学习  张三准备考试
  34. }
  35. }
  36. </P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

3 个回复

正序浏览
本帖最后由 苑永志 于 2013-6-15 16:53 编辑
emos-c 发表于 2013-6-15 16:45
“静态方法不会与类中的成员属性和成员方法直接发生数据的交互,“
这句话中的类包括其它类吗?上面这个 ...

静态方法不会与所在类中的成员属性和成员方法直接发生数据的交互。红字是意思的重点。dosome方法中的确使用了BaseStudent的特有属性“张三”,但是使用的是BaseStudent创建出来的对象的属性,这跟使用其他类的对象的属性和方法是一样的。而不是上面所说的在类中直接发生数据交互。就好比将dosome改成如下代码一样:
  • public static void doSome(Worker w)
  • {
  •   w.work();
  • }

回复 使用道具 举报
苑永志 发表于 2013-6-14 23:05
大致有两方面原因:
1. 可阅读性。当一个方法被声明为static时,用法很简单,直接通过“类名.方法”的方式 ...

“静态方法不会与类中的成员属性和成员方法直接发生数据的交互,“
这句话中的类包括其它类吗?上面这个代码中dosome方法不是调用了BaseStudent类中对象的特有属性“张三”了吗?代码不知道为什么有点乱,见谅
回复 使用道具 举报
大致有两方面原因:
1. 可阅读性。当一个方法被声明为static时,用法很简单,直接通过“类名.方法”的方式调用即可。并且,静态方法不会与类中的成员属性和成员方法直接发生数据的交互,这样使得static方法很容易阅读,并且调试起来也很简单。在实际应用中,static方法往往提供一些全局的实用的功能。
2.效率。调用static方法无需创建对象,类方法(static方法)会在类加载的时候就装入内存,且只保留一份副本,这样可以提高效率,节省资源。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

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