自己调用main方法和jvm调用有区别吗?

xushaoqian911 2007-06-19 11:34:26
class A{
public static void main(String s[]){
B.main(s);
}
}
class B{
public static void main(String s[]){
System.out.println("ok");
}
}


这样调用和直接运行B有区别吗?
命名空间上有区别吗?

...全文
321 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
huoyin 2007-06-19
  • 打赏
  • 举报
回复
从你最上面的例子来看,由A的类对象和jvm直接调用B.main()方法效果是相同的,其区别有设置jvm的参数方式不同...

下面的这个例子,搂主并没有说清楚如何在A类中启动tomcat,如果A的类对象和tomcat服务器是同一个jvm,则C.i=1。否则C.i=0
xushaoqian911 2007-06-19
  • 打赏
  • 举报
回复
有区别,
如果A,B类再调用第3方的类C时,C类的静态变量就是同一个.
KYO_vs_IORI 2007-06-19
  • 打赏
  • 举报
回复
没有区别哦。。。
xushaoqian911 2007-06-19
  • 打赏
  • 举报
回复
class C{
public static int i=0;
}

比如说我在A类中改变C类的静态变量,C.i=1,

并在A类中启动tomcat,

那么在tomcat的servlet中调用C类的静态变量i还为0吗?
believefym 2007-06-19
  • 打赏
  • 举报
回复
B.main
入口是A.main,你把B里的main理解为一个普通的static方法就可以了
yyw84 2007-06-19
  • 打赏
  • 举报
回复
命名空间是.NET里面叫法,JAVA里面应该被称为包
yyjn12 2007-06-19
  • 打赏
  • 举报
回复
没区别.
命名空间是什么?别搞的这么深奥.我从未在java领域内听说过"命名空间"这个词.劳烦您给解释一下.

jvm自动调用的话,可以收命令行参数.
自动在args[]中.
没有参数的情况下.没有什么区别.
huoyin 2007-06-19
  • 打赏
  • 举报
回复
你最后回复的是没有什么问题:_)
BTW:谢谢你的回复
zqrqq 2007-06-19
  • 打赏
  • 举报
回复
>>>同一个JVM中即使有多个不同的classloader,一个类对象在正常情况下只会被载入一次
这句话是对的
但是,不能忽略了“不正常”的情况!。。。


>>>classloader与静态变量的值有关感觉有些不太严谨
我来解释一下:
如果classloader1和classloader2都载入了class A,这时系统内会同时存在两个class A,假设分别是A' 和A'',他们的初始化i都是0,之后,A'的static变量i被修改为1,但是A''的static变量i依然是0
huoyin 2007-06-19
  • 打赏
  • 举报
回复
我想说的问题是在同一个JVM中即使有多个不同的classloader,一个类对象在正常情况下只会被载入一次,一般不会出现多个不同的classloader载入同一个class的情形,也就是说内存中有多个相同的类定义。在jvm中,classloader是一个树形的结构,且通过代理机制工作。

我承认你说的两个classloader会载入同一个类的情况是存在的,但你说classloader与静态变量的值有关感觉有些不太严谨。
zqrqq 2007-06-19
  • 打赏
  • 举报
回复
这个问题太复杂!

先搞清除一个技术的存在价值,再研究它的具体细节。具体到classloader,sun.com网站上的例子是一个hello world似的demo,没有实际价值,它只是解释,某些情况下,你可能需要使用不同的classloader装载相同的类(包和名称相同)。

为什么需要不同的classloader呢?
这个问题实在不是一下子能解释清除的!。。。
huoyin 2007-06-19
  • 打赏
  • 举报
回复
to:zqrqq
我参照sun.com网站写了一个代码,其结果是在同一个JVM中不同的classloader载入类的静态变量只有一个copy,而且只有一个类对象。
另外classloader的职责是将类的定义从文件载入内存,如果一个类定义已经被载入到内存,不太明白为什么另外一个classloader还要做相同的动作?

代码如下:
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

class Bar {
public static int n = 0;
}

public class Foo {
public static void main(String[] args) throws Exception {

// XXXXXXXXXXXX: EDIT THIS LINE
File classDirectory = new File("C:\\workspace\\foo\\");

// Create two Bars, one normal and one using reflection
Bar bar1 = new Bar();
Bar bar2 = (Bar) Class.forName("Bar").newInstance();

// Create a new class loader with the default (system) class loader as a parent
URL u = classDirectory.toURL();
URLClassLoader cl = new URLClassLoader( new URL[] {u} );
Class cls = cl.loadClass("Bar");
Object obj = cls.newInstance();
Bar bar3 = (Bar) obj;
// This will say "true"
System.out.println("bar1.getClass() == bar3.getClass(): " + (bar1.getClass() == bar3.getClass()) );

// Try to cast our classloaded object to a Bar. This will work.
System.out.println("First cast works!");
System.out.println("bar1.n: " + bar1.n);
System.out.println("bar2.n: " + bar2.n);
System.out.println("bar3.n: " + bar3.n);
bar1.n = 5;
System.out.println("bar1.n: " + bar1.n);
System.out.println("bar2.n: " + bar2.n);
System.out.println("bar3.n: " + bar3.n);
}
}

zqrqq 2007-06-19
  • 打赏
  • 举报
回复
问题:类的静态变量会与classloader有关系吗?
答案:有。如果classloader不一致,导致系统内可以存在两个class A(参见classloader。。。)

xushaoqian911 2007-06-19
  • 打赏
  • 举报
回复
那tomcat到底用不用别的classloader装载呢?
huoyin 2007-06-19
  • 打赏
  • 举报
回复
to:zqrqq
类的静态变量会与classloader有关系吗?静态变量不是在jvm中只存在一个对象吗?
zqrqq 2007-06-19
  • 打赏
  • 举报
回复
>>>那么在tomcat的servlet中调用C类的静态变量i还为0吗?

这个涉及classloader的问题,如果假定servlet用相同的classloader装载class A,那么,系统内只有一个class A, 那么, servlet中读取的C.i应该等于1。

如果用了不同的classloader, 比如tomcat用了一个其他的classloader装载servlet,然后这个classloader再次装载class A,那么这个class A跟以前的class A是不一样的,可能C.i还是等于0

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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