黑马程序员技术交流社区

标题: 关于静态函数中构造非静态类对象 [打印本页]

作者: Zack    时间: 2015-4-23 15:59
标题: 关于静态函数中构造非静态类对象
本帖最后由 Zack 于 2015-4-23 18:14 编辑

  1. class Test
  2. {

  3.         /*static*/ class Inner //这里需要将Inner用static修饰
  4.         {
  5.                
  6.         }
  7.         
  8.         public static void main(String[] args)
  9.         {
  10.                 new Inner();//否则这里编译不能通过
  11.         }
  12. }
复制代码

请前辈们从静态的用法和原理方面解释一下,为什么静态函数中不能构造非静态类对象
作者: Zack    时间: 2015-4-23 18:13
上面的类需要用static修饰 否则编译过不了
作者: 哔哩哔哩    时间: 2015-4-23 19:35
  1. public class Test {
  2.         static class Inner1 {

  3.         }

  4.         class Inner2 {

  5.         }

  6.         public static void main(String[] args) {
  7.                 // Inner1是静态内部类,在静态方法中可以直接访问
  8.                 Inner1 inner1 = new Inner1();
  9.                 // Inner2是非静态内部类,需要先创建Test的对象,然后再用对象访问Inner2
  10.                 Test.Inner2 inner2 = new Test().new Inner2();
  11.         }

  12. }
复制代码



作者: tinyvampire    时间: 2015-4-23 19:58
静态只能用调用静态,这是因为静态在对象调用前加载进内存,而非静态在创建对象是调用。
作者: tinyvampire    时间: 2015-4-23 20:00
假如静态中包含非静态,那么在调用静态时这些属于对象的非静态方法到底应不应该调用呢?静态用于存储共享数据!PS:个人学艺不精,多多包涵,希望对你有所帮助!
作者: lqg5522    时间: 2015-4-23 20:07
因为静态方法是属于类的,可以通过类名直接访问,数据存放在堆内存里面。而非静态方法只能通过创建对象访问,这样会有冲突

我也是新手,也不知道答得准不准确:lol
作者: Zack    时间: 2015-4-23 21:17
哔哩哔哩 发表于 2015-4-23 19:35

多谢指教~
作者: chniccs    时间: 2015-4-23 21:36
因为静态的是最先加载的,在对象没有实例化之前就会先加载到内存中,但是你这个语句需要加载静态方法的时候就要实例化对象,这样静态方法没加载完就要去创建对象,这是不可以的。因为类要比对象先加载到内存当中,所以这要考虑到内存中的加载先后顺序问题,不能乱了顺序。------水货的我是这样猜想的。。。
作者: hejinze    时间: 2015-4-23 21:50
静态只能调用静态,但非静态可以调静态。有一个先来后到的顺序
作者: Zack    时间: 2015-4-24 09:31
chniccs 发表于 2015-4-23 21:36
因为静态的是最先加载的,在对象没有实例化之前就会先加载到内存中,但是你这个语句需要加载静态方法的时候 ...

多谢指导~
作者: chniccs    时间: 2015-4-24 22:37
Zack 发表于 2015-4-24 09:31
多谢指导~

不客气。




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