黑马程序员技术交流社区

标题: 静态类中为什么不能调用非静态的方法和变量 [打印本页]

作者: 罗衎    时间: 2011-7-25 11:31
标题: 静态类中为什么不能调用非静态的方法和变量
package Test;
class Outer{
private int a=100;
class Inner
{
private int a=50;
void print()
{
  int a=30;
  System.out.println(a);
  System.out.println(this.a);
  System.out.println(Outer.this.a);
}
}
void print()
{
  Inner p=new Inner();
  p.print();
}
Inner getInner()
{
  return new Inner();
}

}
public class Test
{
public static void main(String [] args)
{
  Outer o=new Outer();
  Outer.Inner fi= o.getInner();
  fi.print();
}
}


我在Outer 中定义了一个内部类 Inner
然后main函数在Test类中
第一:我想实现  在main中直接调用Inner的print方法,可不可以i不去构造getInner()的方法,
如果可以 请多写其他的方法  可以在main中调用Inner方法
第二: 如果我把 main函数放进Test 里面的话   上述同样的问题
第三: 为什么静态类中不能调用非静态类的成员变量和方法?
作者: 詹季春    时间: 2011-7-25 11:33
1、首先应该清楚一点,就是一个内部类的对象的存在必然要存在一个对应的外部类对象,因为内部类对象是寄存在外部类上对象的,不可能只存在内部类对象而不存在外部类对象,相反只存在外部类对象不存在内部类对象是可以的
2、对于上面的第一个问题,在使用内部类的方法的时候就必须要创建内部类的对象
3、没有明白楼主第二个问题要表达的观点
4、
而没有外部类
静态模块是属于类的
而非静态是属于对象的
一个静态调用非静态,也许这个对象还不存在,也就不能使用这个对象上面的东西:)
[ 本帖最后由 詹季春 于 2011-07-25  11:47 编辑 ]
作者: 匿名    时间: 2011-7-25 12:06
接口 接口 接口
作者: 匿名    时间: 2011-7-25 12:06
嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。 在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。 如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封装类的非static的成员变量。
为什么静态类中不能调用非静态类的成员变量和方法?至于静态类?为什么要追究静态类呢?有任何用处吗?
作者: 匿名    时间: 2011-7-25 12:54
标题: 回答你标准
只要是静态类型的数据,它都是在JVM编译时javac .java文件时运行的,而非静态的是java .class文件时运行,如果,两个怎么可能互相调用呢?
作者: 孙斌    时间: 2011-7-25 13:18
标题: 关于静态类
我在Outer中定义了一个内部类 Inner,然后main函数在Test类中
第一:我想实现在main中直接调用Inner的print方法,可不可以不去构造getInner()的方法,
如果可以请多写其他的方法,可以在main中调用Inner方法
答:可以,参见如下代码:
  1. class Outer{
  2.         private int a = 100;
  3.         class Inner
  4.         {
  5.                 private int a = 50;
  6.                 void print()
  7.                 {
  8.                         int a = 30;
  9.                         System.out.println(a);
  10.                         System.out.println(this.a);
  11.                         System.out.println(Outer.this.a);
  12.                 }
  13.         }
  14.         void print()
  15.         {
  16.                 Inner p = new Inner();
  17.                 p.print();
  18.         }
  19.         Inner getInner()
  20.         {
  21.                 return new Inner();
  22.         }

  23. }
  24. public class Test
  25. {
  26.         public static void main(String [] args)
  27.         {
  28.                 Outer o = new Outer();
  29.                 Outer.Inner fi = o.getInner();
  30.                 fi.print();
  31.                 //以下效果和fi.print();相同
  32.                 Outer.Inner inner = o.new Inner();
  33.                 inner.print();
  34.         }
  35. }
复制代码
第二:如果我把main函数放进Test里面的话,上述同样的问题
答:main函数不就在Test里面吗?

第三:为什么静态类中不能调用非静态类的成员变量和方法?
答:一个类声明为 static 的,表示它仅包含静态成员,不能使用 new 关键字创建静态类的实例。
而对于非静态类的方法和变量,在使用前需要创建类的实例对象后才可以使用,所以静态类中不能调用非静态类的成员变量和方法。
[ 本帖最后由 孙斌 于 2011-07-25  13:33 编辑 ]




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