一个内部类的问题

kelvin_yuwenjing 2010-01-31 09:24:46
public class Outer {
public String name="Outer";

public static void staticMethod() {
Inner inner=new Inner();//编译不通过
Outer.Inner inner1=new Outer.Inner();//编译不通过
Inner inner2=new Outer().new Inner();//编译通过
StaticInner staticInner=new StaticInner();//编译通过
Outer.StaticInner staticInner1=new Outer.StaticInner();//编译通过
}

public void createInner(){
Inner inner=new Inner();//编译通过
Outer.Inner inner1=new Outer.Inner();//编译通过
StaticInner staticInner=new StaticInner();//编译通过
Outer.StaticInner staticInner1=new Outer.StaticInner();//编译通过
}


public class Inner{
String name=new String("Inner");
void showName(){
System.out.println(name);
}
}

public static class StaticInner{
String name=new String("Inner");
void showName(){
System.out.println(name);
}
}

}

如上所贴代码,我在外部类Outer的静态方法staticMethod() 中创建实例内部类Inner的实例时,外部类的实例必须已经存在;而在外部类的实例方法createInner()中创建实例内部类Inner的实例时,外部类的实例却不必已经存在。大家说说这到底是怎么回事?
...全文
89 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
joezhpf 2010-02-01
  • 打赏
  • 举报
回复
同意楼上的. 静态方法只能 当前类的静态的资源.
实际如楼上所言你可以把静态类也看作一个 特殊的静态方法.
sing4j 2010-02-01
  • 打赏
  • 举报
回复

public class Test {


public static void main(String[] args) {
say();//编译一定会出错
Test t=new Test();
t.say();//编译不可能会出错
//看了这段代码我想楼主应该明白了,这个跟你那个内部类是一个意思
//这是天天在写的main方法
}

public void say(){
System.out.println("hello.......");
}

public void test(){
say();//编译不可能会出错
}

}
darxin 2010-02-01
  • 打赏
  • 举报
回复
楼主所提的是基本的语法问题。
如果在一个类A中定义了另一个静态的类B,我们称A类为顶层类,B类为嵌套类(nested classes)。
如果在一个类A中定义了另一个非静态的类B,我们称A类为顶层类,B类为内部类(inner classes)。


试想,我们是如何处理静态成员的?如:

public class Outer {

public static void sayHello() {
System.out.println("Hello world!");
}

public static void main(String[] args) {
Outer.sayHello();
sayHello();
}
}

对于静态函数,在main函数中调用 类名.方法名 是基本用法;调用 方法名 也是可以的,因为是同一个类的静态成员。

对于类来说, new 操作是创建对象的基本方法,如:
new Outer();

同理,对于嵌套类我们要用静态成员两个概念去看待它。所以我们在创建嵌套类的对象时,使用的是:
new Outer.StaticInner();

当然在同一个类中的静态成员函数中,可以直接使用下面的方法创建嵌套对象:
new StaticInner();

------------------------------
再看一下我们是如何处理非静态成员的?

public class Outer {

public void sayHello() {
System.out.println("Hello world!");
}

public static void main(String[] args) {
new Outer().sayHello();
}
}

我们必须先生成对象,再通过 对象.方法名 的方式调用非静态成员。

同理,对于内部类我们也要用非静态成员两个概念去看待它。所以我们在创建内部类的对象时,使用的是:
new Outer().new Inner();

也就是说必须有 new Outer() 这个对象存在才可以创建内部类的对象。

当然在静态成员函数中不能调用非静态成员。所以下面的调用是不可以的:

public class Outer {

public static void staticMethod() {
Inner inner=new Inner();//编译不通过
}
...
}
liwis521125 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cgcavalier518 的回复:]
我的理解是,内部类也是外部类对象的一种属性,因为staticMehtod是静态方法,这个方法是类的一种行为,而不是对象的行为,所以编译不过。
[/Quote]

single_pen 2010-02-01
  • 打赏
  • 举报
回复
java中 不存在静态类的呀!~~
single_pen 2010-02-01
  • 打赏
  • 举报
回复
因为一个是 静态的!!一个是非静态的!!~~
小贝壳666 2010-01-31
  • 打赏
  • 举报
回复
staticMethod为静态方法
Inner不是静态类
cgcavalier518 2010-01-31
  • 打赏
  • 举报
回复
我的理解是,内部类也是外部类对象的一种属性,因为staticMehtod是静态方法,这个方法是类的一种行为,而不是对象的行为,所以编译不过。
sing4j 2010-01-31
  • 打赏
  • 举报
回复
因为staticMehtod是静态方法。
不好意思写错了。
sing4j 2010-01-31
  • 打赏
  • 举报
回复
因为staticMehtod是静态类。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧