关于main调用非静态方法

知之洲 2012-08-15 12:00:50

class A
{
public A()
{
System.out.println("I am a");
}

public static void main(String arg[])
{
A a = new A();
//B b = new B();
C c = new C();
D d = new D();
}

class B
{
public B()
{
System.out.println("I am b");
}
}

static class C
{
public C()
{
System.out.println("I am c");
}
}
}

class D
{
public D()
{
System.out.println("I am d");
}
}


为什么在A类里面写的类B就不能直接调用构造函数(必须要在类名前加static,像类C这样)
这是因为main是静态的不能直接调用非晶态的方法
但是为什么在A类外面写的类D就可以直接被调用构造函数,不需要在类D前加static

...全文
181 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
知之洲 2013-06-19
  • 打赏
  • 举报
回复
引用 3 楼 ming_311 的回复:
内部类相当于类的属性,只有定义为static时才属于某一个类,虚拟机在寻找A类时会在持久层加载A类和A类的静态属性,方法,内部类等等。 D类同理。而B类只会在A类加载之后,虚拟机才会在堆里面分配。 把注释那句改成如下即可 [code=java]//B b = new B(); B b = new A().new B(); [/Code]
还是有点不大明白,能不能说得详细点
ming_311 2012-08-30
  • 打赏
  • 举报
回复
内部类相当于类的属性,只有定义为static时才属于某一个类,虚拟机在寻找A类时会在持久层加载A类和A类的静态属性,方法,内部类等等。 D类同理。而B类只会在A类加载之后,虚拟机才会在堆里面分配。

把注释那句改成如下即可
[code=java]//B b = new B();
B b = new A().new B();
[/Code]
Luger 2012-08-30
  • 打赏
  • 举报
回复
我也看晕了 坐等高人解答

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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