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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田富丰 中级黑马   /  2013-4-27 11:52  /  1782 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田富丰 于 2013-4-27 23:31 编辑
  1. //第一个java文件
  2. package c;
  3. public class PackageDemo3
  4.              {
  5.                      protected static void show1()
  6.                     {
  7.                                   System.out.println("hello PackageDemo3");
  8.                      }
  9. }
  10. //第二个java文件
  11. package b;
  12. public class PackageDemo2
  13. {
  14.                      public void show()//这里为什么不用静态修饰
  15.                     {
  16.                                   System.out.println("hello PackageDemo2");
  17.                     }

  18. }
  19. //第三个java文件
  20. package a;
  21. class PackageDemo extends c.PackageDemo3
  22. {
  23.                    public static void main(String[] args)
  24.                  {
  25.                         
  26.                             //c.PackageDemo3 p1 = new c.PackageDemo3();
  27.                            //p1.show1();
  28.                              b.PackageDemo2 p = new b.PackageDemo2();
  29.                              p.show();
  30.                   }
  31. }
复制代码

评分

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

查看全部评分

17 个回复

正序浏览

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
田富丰 发表于 2013-4-27 14:41
我是想问  为什么a包可以调用b包中的show方法!!
b包不也是没静态么!!? ...

兄弟,我真服了你了,看到这我才看明白你想问什么。
你是想问main()是一个静态的方法,为什么在它里面可以调用b包中非静态的show()函数呢,对吧?
是这样的:我们所说的静态方法不能调用非静态方法,是指不能“直接”调用。例如,你不能再main()中这样调用:PackageDemo2.show(),这是不允许的;但是,对于c包中的show1(),是可以这样调用的:PackageDemo3.shwo(),这是因为show1()是静态方法。
要想在mian()中调用b包中的show(),必须先创建PackageDemo2的对象,再通过创建的对象进行调用,就像你代码中所示的样子。

评分

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

查看全部评分

回复 使用道具 举报
吴林飞 发表于 2013-4-27 14:19
这个不是一样的道理么,b包中的show方法是非静态的么,你c包中的show方法也是非静态么,当然可以调用了。 ...

我是想问  为什么a包可以调用b包中的show方法!!
b包不也是没静态么!!?
回复 使用道具 举报
这个不是一样的道理么,b包中的show方法是非静态的么,你c包中的show方法也是非静态么,当然可以调用了。
回复 使用道具 举报
吴林飞 发表于 2013-4-27 13:55
我修改过的代码不是用对象调用的么?

不好意   没仔细看!!比我多了一个static
package b;
class PackageDemo2 extends c.PackageDemo3
{
        public void show()
        {
                System.out.println("PackageDemo2 run");
                show1();
        }
}
那你看看这个  为什么这个PackageDemo就能调用呢!!
回复 使用道具 举报
田富丰 发表于 2013-4-27 13:57
咱俩写的一样吧!!

仔细看看show方法吧,
回复 使用道具 举报
吴林飞 发表于 2013-4-27 13:55
我修改过的代码不是用对象调用的么?

咱俩写的一样吧!!
回复 使用道具 举报
田富丰 发表于 2013-4-27 13:48
我不能建立对象  再用名称调用么?

我修改过的代码不是用对象调用的么?
回复 使用道具 举报
吴林飞 发表于 2013-4-27 13:47
楼主有两个包分别是a和c,你想在a包中掉用c包中的show()方法,是这个意思吧,把show方法改成静态就行了,注 ...

我不能建立对象  再用名称调用么?
回复 使用道具 举报
本帖最后由 吴林飞 于 2013-4-27 13:59 编辑

  1. <P> package c;
  2. public class PackageDemo3
  3. {
  4. protected static  void show()
  5. {
  6.   System.out.println("hello PackageDemo3");
  7. }
  8. }
  9. package a;
  10. public class PackageDemo extends c.PackageDemo3
  11. {
  12. public static void main(String[] args)
  13. {
  14.   c.PackageDemo3 p1 = new c.PackageDemo3();
  15.   p1.show();
  16. }
  17. }
  18. </P>
复制代码
楼主有两个包分别是a和c,你想在a包中掉用c包中的show()方法,是这个意思吧,把show方法改成静态就行了,注意你的主函数是静态的,并不是protected修饰符的问题。
建议楼主提问的时候不要只给出一部分代码,很容易让人误解。

评分

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

查看全部评分

回复 使用道具 举报
袁梦希 发表于 2013-4-27 13:37
通过你的代码我发现了问题,你写了两个public访问修饰符,一个类文件,public 修饰类的class只有一个,并 ...

我的问题改了!!!麻烦你看下吧!!谢谢 !!!
回复 使用道具 举报
本帖最后由 袁梦希 于 2013-4-27 13:41 编辑
田富丰 发表于 2013-4-27 13:29
两次没描述清楚了!!我说的意思是  本来想把这个分成两个包!!
但是失败!!所以放在一个包中了 !!! ...


通过你的代码我发现了问题,你写了两个public访问修饰符,一个类文件,public 修饰类的class只有一个,并且类名必须和你新建的这个类文件名一样,所以一个类文件中可以有多个类,但由public修饰的类只能有一个.你把上面的public去掉试试!
回复 使用道具 举报
袁梦希 发表于 2013-4-27 13:14
楼主想要表达什么  没明白你的意思,因为你这是两个类,也不知道你有几个包。也不知道你说的“把PackageDem ...

两次没描述清楚了!!我说的意思是  本来想把这个分成两个包!!
但是失败!!所以放在一个包中了 !!!可是还是不行!!!

再不明白 !!你就帮我解释下这个代码吧!!谢谢!!1
回复 使用道具 举报
问题描述不明确,看半天没看懂楼主想要表述的意思。
回复 使用道具 举报
楼主想要表达什么  没明白你的意思,因为你这是两个类,也不知道你有几个包。也不知道你说的“把PackageDemo分成一个包”是什么意思
我只能帮你解答,同包内均和派生类中可用。
回复 使用道具 举报
hmr8 发表于 2013-4-27 11:59
包import进来了么?

这是在一个包中呀!!
回复 使用道具 举报
包import进来了么?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马