专栏首页FREE SOLOpublic static void main(String args[])没那么简单!

public static void main(String args[])没那么简单!

Main方法是Java程序的入口,记住,我们这里不会讨论Servlet、MIDlet和其他任何容器管理的java程序,在java核心编程中,JVM会查找类中的public static void main(String[] args),如果找不到该方法就抛出错误NoSuchMethodError:main 程序终止。 Main方法必须严格遵循它的语法规则,方法签名必须是public static void,参数是字符串数组类型,如果是Java1.5及以后的版本还可以使用可变参数:

public static void main(String… args)

为什么main方法是静态的(static)

一般情况下,需要用到某个类的时候,都必须先实例化这个类,才能对其进行调用。在编程过程中发现,有些类不用实例化就可以直接拿来使用,使用它的字段、方法等等。

这时候,靠的就是static作用。static英文意思为“静止的,静态的”,在OOP中可以作为修饰符,类、字段、属性、方法等被static修饰后,变为静态类、静态字段、静态属性、静态方法…… static修饰的类成为静态类,静态类中只能包含静态成员(被static修饰的字段、属性、方法),不能被实例化,不能被继承;非静态中可以包含静态成员

正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。 因为C和C++同样有类似的main方法作为程序执行的入口。 如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。 静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。

   1、被调用时必须先实例化的情况:
   被调用成员为非静态成员(此时它所属的类肯定为非静态类)。如下小例子:


public class ClassA      //ClassA类(非静态类)
{
    public ClassA() { }  //构造函数
    public void Fun() { }//ClassA类中的方法(非静态方法)
}

public class ClassB     //需要调用ClassA类中方法的ClassB类
{
    public ClassB() { }  //构造函数
    public void Fun()  
    {
        ClassA a = new ClassA();//调用ClassA类中的方法需要先实例化
        a.Fun();
    }
}
  说明:ClassA类为非静态类,其中的方法Fun()也为非静态方法,所以在ClassB中调用时需要先实例化ClassA类。


   2、被调用时不需要实例化的情况:
   被调用成员为静态成员(此时它所属的类为静态类或非静态类)。如下小例子:

   (1)被调用类为非静态类:


public class ClassA      //ClassA类(非静态类)
{
    public ClassA() { }  //构造函数
    public static void Fun() { }//ClassA类中的方法(静态方法)
}

public class ClassB     //需要调用ClassA类中方法的ClassB类
{
    public ClassB() { }  //构造函数
    public void Fun()  
    {
        ClassA.Fun();  //调用ClassA类中的方法直接调用:类名.成员
    }
}
   说明:ClassA类为非静态类,但其中的方法Fun()为静态方法,所以在ClassB中调用时不实例化ClassA类(而且不能实例化),直接调用其成员,语法为“类名.成员”。 
   (2)被调用类为静态类:


public static class ClassA      //ClassA类(静态类)
{
    //当然静态类中不能存在构造函数
    public static void Fun() { }//ClassA类中的方法(静态方法)
}

public class ClassB     //需要调用ClassA类中方法的ClassB类
{
    public ClassB() { }  //构造函数
    public void Fun()  
    {
        ClassA.Fun();  //调用ClassA类中的方法直接调用:类名.成员
    }
}
   说明:ClassA类为静态类,其中的方法也Fun()为静态方法,所以在ClassB中调用时不实例化ClassA类(而且不能实例化),直接调用其成员,语法为“类名.成员”。 

为什么main方法是公有的(public)

Java指定了一些可访问的修饰符如:private、protected、public,任何方法或变量都可以声明为public,Java可以从该类之外的地方访问。因为main方法是公共的,JVM就可以轻松的访问执行它。

为什么main方法没有返回值(Void)

因为main返回任何值对程序都没任何意义,所以设计成void,意味着main不会有任何值返回

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 宠物商店

    葆宁
  • Java多重继承简单示例

    葆宁
  • 华为面试题:写一个程序要求出用1,2,5这三个数不同个数组合的和为100的组合个数(Java实现)

    因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+…+5以内的奇数+1,

    葆宁
  • [设计模式]建造者模式

    简介 建造者模式 (Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。  建造者模式是一种对象创建型模式 (可参考 设计...

    静默虚空
  • 探秘static——类不需实例化就能用?

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

    DannyHoo
  • 面试官经常问的策略模式,手把手教你写出来

    策略模式(Strategy Model) 属于23种GoF设计模式中的一种。 策略模式的描述为:定义了一组算法,并且将这些算法都封装了起来,这些算法之间可以相互...

    程序员小强
  • 建造者模式

    定义:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。 (separate the construc...

    卡尔曼和玻尔兹曼谁曼
  • Java开发GUI之Menu菜单 原

        在MacOS上的软件都有一个菜单栏,会浮现在屏幕顶部,Java的awt包中也提供了构建菜单功能的相关组件,示例代码如下:

    珲少
  • java设计模式(9)-桥接模式

    这篇推文分享一下桥接模式,JDBC原理也是运用了桥接模式,先设置驱动名称,链接,来获得数据库链接,降低耦合,减少维护

    爱敲代码的猫
  • 快速序列化组件MessagePack介绍

    晓晨

扫码关注云+社区

领取腾讯云代金券