黑马程序员技术交流社区
标题:
静态类中为什么不能调用非静态的方法和变量
[打印本页]
作者:
罗衎
时间:
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方法
答:可以,参见如下代码:
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();
//以下效果和fi.print();相同
Outer.Inner inner = o.new Inner();
inner.print();
}
}
复制代码
第二:如果我把main函数放进Test里面的话,上述同样的问题
答:main函数不就在Test里面吗?
第三:为什么静态类中不能调用非静态类的成员变量和方法?
答:一个类声明为 static 的,表示它仅包含静态成员,不能使用 new 关键字创建静态类的实例。
而对于非静态类的方法和变量,在使用前需要创建类的实例对象后才可以使用,所以静态类中不能调用非静态类的成员变量和方法。
[
本帖最后由 孙斌 于 2011-07-25 13:33 编辑
]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2