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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何明辉 中级黑马   /  2012-7-22 09:55  /  1674 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何明辉 于 2012-7-22 14:32 编辑

class Person
{
      String name="HeMingHui";
      class Heart-----------1
       {
             void show1()------2
               {
                    System.out.println("show1");
                    show2();
                }
             void run()
              {
                  System.out.println("run");
               }
         }
   void show2()-------3
    {
          System.out.println("show2");
           run();
     }
}
class PersonDemo
{
        public static void main(String[] args)
         {
              new Person.Heart().show1();------4
              new Person().new Heart().show1();----5
         }
}
上面程序程序不能编译,为了说面问题特写出来
(1)若1内部类加了static后,则3也访问必须也为static,为什么了,我认为是非静态访问静态可以前面可以不加static啊
(2)方法找中函数调用3中写run()去调用内部类中的方法不对吗,这里应该怎么写,想在3中调用run();
(3)若内部类前加了static,也可以写5来调用show1()啊,怎么不行,我认为是对象去调用啊,内部类虽为静态,但内容却在堆里面存放啊

评分

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

查看全部评分

3 个回复

倒序浏览
(1)若1内部类加了static后,则3也访问必须也为static,为什么了,我认为是非静态访问静态可以前面可以不加static啊
若1内部类静态后,那么它会在外部类一加载 的时候就加载,这时候方法还没有存在,你静态内部类的里面调用外部方法,那么就得在静态内部类存在的时候也存在 ,就得静态
(2)方法找中函数调用3中写run()去调用内部类中的方法不对吗,这里应该怎么写,想在3中调用run();
因为你的内部类不是静态的,要想调用 它内部的方法,就得new出一个它的对象,让对象 去调用,我把怎么写放在下面啊
(3)若内部类前加了static,也可以写5来调用show1()啊,怎么不行,我认为是对象去调用啊,内部类虽为静态,但内容却在堆里面存放啊
访问静态内部类的非静态成员的格式 是 new Outer.Inter().function()这是直接new出了一个内部类的对象来调用内部方法。new Person().new Heart().show1();这是先new一个外部类对象,调用内部类对象再调用 方法,对普通内部类来说,内部类的对象有一个隐式的引用指向创建它的外部类对象,但静态内部类没有,外部类一加载就有了静态内部类了,所以创建静态内部类对象不需要外部类对象,我感觉吧,静态对内部类的作用是整体的,它应该在静态区,没有在堆中。
  1. class Person
  2. {
  3.             String name="HeMingHui";
  4.             static class Heart
  5.            {
  6.                   void show1()
  7.                  {
  8.                           System.out.println("show1");
  9.                            show2();
  10.                  }
  11.                  void run()
  12.                {
  13.                      System.out.println("run");
  14.                 }
  15.          }
  16.         static void show2()
  17.        {
  18.                 System.out.println("show2");
  19.                 new Heart().run();
  20.        }
  21. }
  22. class PersonDemo1
  23. {
  24.              public static void main(String[] args)
  25.           {
  26.                           //new Person().new Heart().show1();
  27.                           new Person.Heart().show1();
  28.           }
  29. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
feigecal 发表于 2012-7-22 13:13
(1)若1内部类加了static后,则3也访问必须也为static,为什么了,我认为是非静态访问静态可以前面可以不加 ...

谢谢,早上还有点模糊,现在弄懂了
回复 使用道具 举报
研究一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马