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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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. }
复制代码

请前辈们从静态的用法和原理方面解释一下,为什么静态函数中不能构造非静态类对象

点评

什么意思?  发表于 2015-4-23 17:11

11 个回复

倒序浏览
上面的类需要用static修饰 否则编译过不了
回复 使用道具 举报
  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. }
复制代码


回复 使用道具 举报 1 0
静态只能用调用静态,这是因为静态在对象调用前加载进内存,而非静态在创建对象是调用。
回复 使用道具 举报 1 0
假如静态中包含非静态,那么在调用静态时这些属于对象的非静态方法到底应不应该调用呢?静态用于存储共享数据!PS:个人学艺不精,多多包涵,希望对你有所帮助!
回复 使用道具 举报 1 0
因为静态方法是属于类的,可以通过类名直接访问,数据存放在堆内存里面。而非静态方法只能通过创建对象访问,这样会有冲突

我也是新手,也不知道答得准不准确:lol
回复 使用道具 举报 1 0
Zack 中级黑马 2015-4-23 21:17:53
7#
回复 使用道具 举报
因为静态的是最先加载的,在对象没有实例化之前就会先加载到内存中,但是你这个语句需要加载静态方法的时候就要实例化对象,这样静态方法没加载完就要去创建对象,这是不可以的。因为类要比对象先加载到内存当中,所以这要考虑到内存中的加载先后顺序问题,不能乱了顺序。------水货的我是这样猜想的。。。
回复 使用道具 举报
静态只能调用静态,但非静态可以调静态。有一个先来后到的顺序
回复 使用道具 举报
Zack 中级黑马 2015-4-24 09:31:25
10#
chniccs 发表于 2015-4-23 21:36
因为静态的是最先加载的,在对象没有实例化之前就会先加载到内存中,但是你这个语句需要加载静态方法的时候 ...

多谢指导~
回复 使用道具 举报

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