黑马程序员技术交流社区

标题: 静态类问题 [打印本页]

作者: hel    时间: 2013-11-1 14:05
标题: 静态类问题
为什么静态内部类实例方法不能访问外部类的实例属性呢?
作者: The_Wizard    时间: 2013-11-1 14:27
需要代码,你也没说这属性被哪些修饰符修饰了。
作者: 李新辉    时间: 2013-11-1 14:30
简单一句话,没头没尾
没法回答……
作者: 那得好好想想    时间: 2013-11-1 14:36
记住一句话,静态的只能访问静态的,非静态的什么都可以访问。静态内部类在类加载的时候就已经有了,外部类的成员变量成员方法,只要不是静态的,就必须等对象实例化后才有。系统不知道你什么时候去实例化,所以干脆静态的不能访问非静态的。你可以试试,如果外部类的方法或变量时静态的,那静态内部类是完全可以访问的。
作者: 一碗小米周    时间: 2013-11-1 14:57
无法再静态方法中引用非静态变量。
作者: ∏艾力克斯※    时间: 2013-11-1 16:22
个人认为是机制的问题:
静态类属于加载类就会加载到内存中,而实例却是必须显式new声明后才会出现加载到内存中,两者有一个时间差,一个显著明显的遗漏。
java应该是考虑了这点,所以不允许静态类、方法加载实例属性,无论逻辑上是否存在此问题。
作者: 魏-玉-彪    时间: 2013-11-1 16:55
为什么静态内部类实例方法不能访问外部类的实例属性呢?
      首先静态类不涉及到实例化的问题,当程序一开始加载时就已经存在了。
      静态方法访问实例属性,涉及到程序运行加载的问题,我们可以理解为 类文件就是一个模板模具 。当程序运行时,计算机首先把这个模具放到了方法区,(专门放类模板的地方),而静态就是在模板中已经有的东西,而实例是什么呢?实例是用模具复制出来的东西,程序刚加载时刚拿到模板,还没有运——没有实例产生,这时让模板访问还没创建出来的东西,当然是不行的。


作者: Cheers_for_CRAZ    时间: 2013-11-1 17:35
  1. public class TestInnerClass {
  2.         public int a=3;
  3.        
  4.         public TestInnerClass(){
  5.                 System.out.println("outer class"+a);
  6.         }
  7.         public static void main(String[] args) {
  8.                 TestInnerClass.Inner inner=new TestInnerClass.Inner();
  9.                 inner.run();
  10.         }
  11.        
  12.        
  13.         static class Inner{       
  14.                 public void run(){
  15.                         //a++;
  16.                         System.out.println("this is Inner class");
  17.                 }               
  18.         }
  19. }
复制代码
由此可见,当静态内部类实例化的时候,外部类构造函数并没有对a进行赋值,也就是说这时候a并没有进行默认初始化!
那么内部类怎么可以使用a呢?
作者: 半夜雨半夜雨    时间: 2013-11-1 20:21
静态变量保存在内存区的公共存储单元中,而不是保存在某个对象的内存区中。任何一个类对象在访问它时都会得到相同的数值。如果某一个类对象对它进行了修改,所有对象的此成员变量也都做了修改。静态方法属整个类,不用进行实例化操作。
作者: 马晓平    时间: 2013-11-1 23:38
     1,静态内部类不能访问外部类的实例成员,只能访问外部类的静态成员。即使内部类的实例方法也不能访问外部类的实例成员。
     2,因为静态内部类是外部类的类相关的,而不是外部类的对象相关的。静态内部类的对象不是寄存在外部类对象里,而是寄存在外部类的类本身中,也就是说,当静态内部类的对象存在时,并不存在一个被它寄存的外部类对象,静态内部类的对象里只有外部类的类引用,没有外部类的对象引用,如果允许静态内部类的实例方法访问外部类的实例成员,但找不到被寄存的外部类对象,将引起错误
     3.外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态类的类成员,也可以使用静态内部类的对象作为调用者来访问静态内部类的实例成员。




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