今天看北大慕课遇到一段代码,于是下载下来跑了一下,奇葩的是,没有main方法既没报错,还出了结果。

下面贴出代码:

class InitialTest
{
public static void main(String[] args)
{
new InitialTest2(6);
}
int n=10; //step2
{
n++;
System.out.println("InitialTest..."+n);
} static int x;
static
{
x++;
System.out.println("static..." +x);
} } class InitialTest2 extends InitialTest{
InitialTest2(int a){
this.a=a;
System.out.println("this.a=" + a );
}
int a;
{
System.out.println("InitialTest2..."+this.a);
}
static
{
x++;
System.out.println("static2..." +x);
}
}
执行:
InitialTest
static...1
static2...2
InitialTest...11
InitialTest2...0
this.a=6

 

执行:

InitialTest2
static...1
static2...2
InitialTest...11
InitialTest2...0
this.a=6

  于是乎查阅很多资料,发现这种解释相对靠谱:

实际上人家说“Java应用程序必须从main()方法开始运行”这句话千真万确,不容置疑的。那上面的例子如何解释呢?
 
原因在于Java虚拟机在执行InitialTest2的时候,首先加载类,然后执行内部的静态块,执行完静态块后才去调用main方法。
 
可是,在静态块中,System.exit(0)已经强制性的让程序退出了,而根本就没机会调用main方法。而且,InitialTest2是在静态块中输出的,这就给初学者一个错觉。
继续探究,注释了InitialTest类中main方法那一段,看看还能不能执行;结果在eclipse中不能直接运行了。。。
继续探究,仅注释InitialTest类中main方法中new InitialTest2(6)这一句;结果报错了。。。
错误: 在类 InitialTest2 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)

 继续探究,把文件名改成InitialTest2.java(原文件名为InitialTest.java) 直接cmd运行:

C:\Users\ProfessorRen>D:

D:\>javac InitialTest2.java

D:\>java InitialTest2
static...1
static2...2
InitialTest...11
InitialTest2...0
this.a=6 D:\>

  接着上面继续探究,把main方法那一段注释,放在cmd下执行,编译通过,但运行报错了。。。

吃饭去,有空继续。。。。。。
参考链接:http://lavasoft.blog.51cto.com/62575/106321/

没有main方法真的不能执行代码了吗?的更多相关文章

  1. main方法介绍

    main方法是程序的入口点,程序从这里开始,也是从这里结束. 执行过程:程序在执行编译的过程中先找main方法,然后执行main‘{’下的第一行代码,以此执行,如果遇到main方法中有调用其他的方法时 ...

  2. 为什么java的main方法必须是静态的

    今天看类型信息时发现一个问题,不能再main方法中打印this关键字的信息,这时想起了之前的知识,不能再静态方法中调用this.理由很简单,this表示“这个对象”,也就是声明一个类的对象,然而静态方 ...

  3. Flutter main future mirotask 的执行顺序

    下面这段代码的输出是什么? import 'dart:async'; main() { print('main #1 of 2'); scheduleMicrotask(() => print( ...

  4. 1-为什么java的main方法必须是静态的

    为什么java的main方法必须是静态的   今天看类型信息时发现一个问题,不能再main方法中打印this关键字的信息,这时想起了之前的知识,不能再静态方法中调用this.理由很简单,this表示“ ...

  5. main方法击破

    什么是main方法? 是类中的一段代码,可以让程序独立运行. public class HelloWord{ public static void main(String[] args) { for ...

  6. 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法

    6.    类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1.   类 6.1.1.    类的定义 package cn.itcast ...

  7. 为什么main方法是public static void?

    Main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public.static.void的.当然,很多人首先学的是C和C++,但是在Java中main方法与前者 ...

  8. 为什么 main 方法是 public static void ?

    Main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public.static.void的.当然,很多人首先学的是C和C++,但是在Java中main方法与前者 ...

  9. Java项目中每一个类都可以有一个main方法

    Java项目中每一个类都可以有一个main方法,但只有一个main方法会被执行,其他main方法可以对类进行单元测试. public class StaticTest { public static ...

随机推荐

  1. VirtualBox实现内外网络互访问的配置

    作者 jrl137824675 来源地址:http://www.2cto.com/os/201205/133370.html   环境: 宿主机操作系统            Windows XP s ...

  2. ASP.Net零碎

    ASP.Net零碎 ServerPush 什么是ServerPush,服务器向客户端浏览器“推送”,其实就是“长连接”. 只有浏览器请求服务器端,服务器端才有给浏览器响应数据,不会主动向浏览器推送数据 ...

  3. JS基础,你需要掌握的要点!

    [循环控制语句]1.break:终止本层循环,继续执行循环后面的语句: 当循环有多层时,break只会跳过一层循环:2.continue:跳过本次循环,继续执行下一次循环: 对于for,continu ...

  4. JS判断当前手机类型

    window.onload = function () { var u = navigator.userAgent; if (u.indexOf('Android') > -1 || u.ind ...

  5. logback配置文件详解

    一:根节点<configuration>包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文 ...

  6. Hadoop化繁为简-从安装Linux到搭建集群环境

    简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...

  7. Java并发,看到了,就记录下呗

    在这篇博客中,主要把之前看的书的内容记录一下,个人感觉还是可以的,原题是这样的:开发一个高效的缓存.这里指的是单机. 首先我来看当前的一个版本 public interface Computable& ...

  8. 欲练JS,必先攻CSS——前端修行之路

    今天我讲的主题是css,具体聊一下我大概的css学习历史,分享一些干货,希望这次分享对大家有所启发和帮助. 个人的css历史: 说说自己的css学习的历史,12年,当时是老师手把手1对1教我div+f ...

  9. 如何在.Net中使用MongoDB

    最近在研究mongodb,针对.net 中使用mongodb的文章要么是早期的驱动版本,要么资料很少,所以写个随笔记录一下 本文主要记录 1.什么是MongoDB 2.MongoDB windows ...

  10. Plupload上传插件自定义图片的修改

    若自定义的一个上传图片效果,代码(可能不全),当用户再次点击所有或任意一个上传图片的input时,uploader.files已经多了客户再次上传的图片,但是你就想要最后的两张图片,这就可以使用到up ...