public static void main(String[] args) {}疑问解决

提前祝大家国庆快乐!虽然是国庆节,也不能停止每天都码代码的习惯。
“雄关漫道真如铁,而今迈步从头越 ” 问题解决的过程是艰辛的,结果是舒坦的。


在这里我是针对public static void main(String[] args) {} 里面出现的这些词的具体作用做出的分析。

public

  • main方法是程序的入口方法,是要被JVM调用的,所以访问权限应为public。
  • public 使得方法main()是公共的可以被共享的,是一个公有的方法,能够被任何对象访问,也能够被jJVM访问。

void

  • 使用void来修饰:main方法执行完毕时,并不需要有返回值,所以用 void修饰即可。
  • void 指明main()方法无返回值。

static

为什么要由static修饰?

static含义:意思是静态,可以用来修饰成员变量和成员方法。当修饰成员变量时,在内存中只存储一份,可以被共享访问、修改。 当修饰成员方法时,可以被共享访问,也被称为公共方法。

  1. 首先我们知道在java中调用一个方法,要么是通过实例对象调用,要么是直接通过类名调用。而JVM在调用我们的main方法是需要直接通过类名调用的,不会生成一个实例对象来调用,所以必须由static修饰。

  2. 用static修饰的就是静态方法。静态方法不依靠对象而存在。其直接与类有关,只要包含在类中,就可以得到执行。因此,main()方法作为程序的入口,在这之前是不可能有任何对象被建立的,也就是在main之前包括main自身不可能是非静态方法。

既然有静态 , 那必然有非静态,即为实例成员

静态成员和实例成员区别

  1. 下面是静态成员和实例成员使用时候需要注意的点:
  • 声明方法时,方法类型前面不使用static修饰的是实例方法
    用static修饰的是静态方法,也称类方法。
  • java中的静态成员包括静态方法和静态成员变量,静态成员都是由static修饰的。
  • java中的实例成员包括实例方法和实例成员变量,实例成员都没有被static修饰。
  • 静态方法只能访问静态的成员,不可以直接访问实例成员。
  • 实例方法可以访问静态的成员,也可以访问实例成员。
  • this的含义,this代表的是当前类对象,静态方法中是不可以出现this关键字的
  1. 详解调用差别
    2. 1 使用对象调用实例类型方法
    当字码文件被分配到内存时,实例方法不会被分配入口地址,只有当该类创建对象后,类中的实例方法才会分配入口地址,这时实例方法才可以被创建的对象调用。

    2.2 使用类名调用方法类
    类中定义的方法,在该类被加载到内存时,就分配了相应的入口地址, 这样的类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用,类方法的入口地址直到程序推出时才被取消。但是需要注意,类方法不能直接操作实例变量,因为在类创建对象之前,实例成员变量还没有分配内存。实例方法只能使用对象调用,不能通过类名调用。

如何使用

  1. 类方法的调用是:
    类名.类方法
    对象.静态成员方法。(这里不推荐使用,因为static定义之后是大家都可以用的而不是某个对象独有的)
  2. 实例方法的调用是:
    必须new出一个对象,即:对象.实例方法

注意点:

  • 在一个类中直接使用本类中的方法加不加this,一个意思,暂时看不出区别,后期在继承中做区别。所以在实例方法中调用静态方法时可以加this代表当前对象调用,也可以不加。

通过下面这段代码来实现上面的注意点,使大家进一步理解静态成员和实例成员:

public class Static {
    public static void main(String[] args) {
        System.out.println("静态方法访问:");
        //1.静态方法只能访问静态的成员,不可以直接访问实例成员。
        Static.staticMember();
        //Static.instanceMember();//报错:非静态方法'nullStatic()'不能从静态上下文中引用
        System.out.println(s1);
        //System.out.println(s2);//报错:非静态字段's2'不能从静态上下文中引用

        //静态方法可以间接实例成员访问
        Static sc = new Static();
        System.out.println("静态方法间接访问:");
        sc.instanceMember();
        System.out.println(sc.s2);

        System.out.println("-------------------------------------");
        //2.静态方法中是不可以出现this关键字的。
        System.out.println("出现this关键字报错");
        //System.out.println(this.s2);//“Test.Static。这不能从静态上下文中引用

        System.out.println("-------------------------------------");
        System.out.println("实例方法访问:");
        Static s = new Static();
        s.instanceMethod();
    }

    //实例方法
    public void instanceMethod(){
        //3.实例方法可以访问静态的成员,也可以访问实例成员。

        //2.1访问成员变量
        System.out.println(s1);
        System.out.println(s2);

        //2.2访问成员方法
        Static.staticMember();
        //标记
        this.instanceMember();
        //instanceMember();//和用this调用表示一个意思

        System.out.println("-------------------------------------");
    }


    /*
    调用方法
    要在main 方法里面调用, 因为main 方法是程序的入口方法.
    * /
    /*
    java中的静态成员 包括静态方法和静态成员变量,静态成员都是由static修饰的;
    java中的实例成员 包括实例方法和实例成员变量,实例成员都没有被static修饰;
    * */
    //静态变量
    static String s1 = "我是静态变量";
    //静态方法
    public static void  staticMember(){
        System.out.println("staticMember被执行");
    }

    //实例成员变量
    String s2 = "我是实例成员变量";
    //实例方法
    public void instanceMember(){
        System.out.println("InstanceMember被执行");
    }
}
/*结果:
静态方法访问:
staticMember被执行
我是静态变量
静态方法间接访问:
InstanceMember被执行
我是实例成员变量
-------------------------------------
出现this关键字报错
-------------------------------------
实例方法访问:
我是静态变量
我是实例成员变量
staticMember被执行
InstanceMember被执行
-------------------------------------
* */

方法名main的名字可以改吗?

main方法是程序的入口,所以每次我们用的是public static void main的结构作为程序入口。

方法为什么要在main里面调用?

要在main 方法里面调用, 因为main 方法是程序的入口方法。

方法里面的String[] args是调用哪里的值?可以使用并且输出吗?

String[]是一个字符串数组,args表示参数的名称,即表示为接收一个字符串类型的数组,数组名字为args。

下面我将演示一下如何赋值和使用:

  1. 点击配置(run configuration)。
    在这里插入图片描述
  2. 点击编辑配置(editor configuration)。
    在这里插入图片描述
  3. 找到构建与运行(build and run)下面的第三个框输入内容即为String[] args的内容。
    在这里插入图片描述

具体代码实现如下:

public class mainTest {
    public static void main(String[] args) {
        System.out.println(args[0]);
        System.out.println(args[1]);
    }
}
/*输出:
Hello
World!
*/

感悟:

当你向不懂得地方寻找答案时,仿佛打开了一扇新世界的大门,这个世界远比你想象的更加big,更加rich。所以作为一名想成为一个优秀码猿,需要不断去学习和接受新知识。
并且可以做到:“温故而知新”。

如果有所错误,还请大家多多指正。

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值