为什么java的主函数入口必须是public static void main (String[] args);

很多写javaEE好几年的程序员经常会记得java的主函数就是这么写的,但实际上为什么这么写大都已经忘记。

由于每天被各种框架,各种技术包围,所以出现了一种知道怎么用但不知道为什么这么用的情况。

java的主函数是一个java基础知识的大综合,在面试中,从这里就能看出程序员的基础知识掌握程度。

一、是不是所有的类都可以有主方法?如果是,为什么?如果不是,那么在什么类中可以有主方法。

首先我们可以看到程序都是写在一个以.java结尾的文档中的,但是一个.java的文档并不是只能存在一个类,它里面可以存在很多类

但是并不是所有的类都可以有主方法的。只有在此类名与文档名相同的情况下,才可以在此类中存在主函数。如果文件中只有一个类,文件名必须与类名一致

二、为什么主函数要写public

这是java修饰符的知识,java中共有四种访问限制修饰符:private,public,protected,default

private:私有,内部访问
public:共有,都可以访问
default:同一个包可以访问
protected:同一个包或者子类可以访问

修饰符 同类 同包 子类 不同包
public
protected  
default    
private      

需要注意的是,由于访问限制修饰符的存在,所以会有一些默认的规则,保证jvm的安全

1.java保存的文件名必须与类名一致;
2.如果文件中只有一个类,文件名必须与类名一致;
3.一个Java文件中只能有一个public类;
4.如果文件中不止一个类,文件名必须与public类名一致;
5.如果文件中不止一个类,而且没有public类,文件名可与任一类名一致。

而主函数必须用public修饰,由于一个文件中只能有一个public,所以需要让主函数使用public作为类的对外接口,供jvm使用。

三、主函数的static

java的static是一个关键字,也是作为java类中方法的修饰符。

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

1、static变量
 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。可用类名直接访问,一旦静态变量被修改,其他实例均对修改可见,故线程不安全。因为static变量独立于任何实例,因此static变量必须被实现,而不能是抽象的abstract。在接口中,static变量默认被限制位static final修饰

2、static方法

静态方法可以直接通过类名调用,不需要创建实例,因此静态方法中不能用this和super关键字,不能直接访问当前类的实例变量和实例方法(因为它们都还没被加载)。只能访问当前类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

3、static代码块

 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块仅仅只会被执行一次。

所以java的主函数入口被修饰成static以便在不用创建类的实例时,就可以调用。

四、void无返回值的

这里是方法的副作用和返回值类型

一个方法的执行,如果在返回一个值之外还导致某些外部“状态”发生变化,则称该方法产生了副作用。这里所谓“状态”发生变化,可以是实例域或静态变量被修改

1.没有返回值的方法必然有副作用,除非它的方法体是空的或者方法没有意义。所以,没有返回值的方法、有返回值但有副作用的方法称为过程

2.有返回值而且没有副作用的方法称为函数(function)。

由于java的主函数是栈中最底层的函数,所以并不存在能够接收的值,所以使用void,无返回的

五、main方法名(注意是main,很多初学者都会写成mian,这是不一样的)

main是java主方法的方法名,是不能被改变的,就算错了一个字也是不可以运行的。

由于java中有关键字(保留字)存在的机制,所以main也类似与一个关键字(但不是),jvm运行时,只会找符合要求的main单词,所以将main改变后,jvm将找不到主入口,方法将不能执行。当然,main也可以作为方法名存在。也可以作为变量名存在。

在一个类中可以存在多个main方法,这是方法的重载。在名字相同的同时,必须有不同的参数。不允许参数完全相同而只是返回值不同的情况出现。无法进行编译,程序在eclips中显示错误

六、String数组的参数

java语言是可以在命令行进行编辑执行的(我估计应该没人在这里玩吧)。这里可以了解到关于java的基本类型和应用类型。

8种基本类型 

一、4种整型 
    byte      1字节           -128——127

short     2 字节         -32,768 —— 32,767

int       4 字节          -2,147,483,648 ——2,147,483,647(超过20亿)

long      8 字节   -9,223,372,036,854,775,808——9,223,372,036854,775,807

注释:java中所有的数据类所占据的字节数量与平台无关,java也没有任何无符号类型

二、 2种浮点类型 
    float    4 字节         32位IEEE 754单精度(有效位数 6 – 7位)

double   8 字节         64位IEEE 754双精度(有效位数15位)

三、1种Unicode编码的字符单元 
    char    2 字节          整个Unicode字符集

四、1种真值类型 
boolean    1 位             True或者false

3种引用类型 

类class

接口interface

数组array

我们在命令行输入是不管是什么字符都是一个字符串类型,如数字1可以是字符串“1”等等。所以用字符串的数组类型来装

大话java基础知识一之为什么java的主函数入口必须是public static void的更多相关文章

  1. Java基础知识强化10:Java中的中间缓存变量机制

    1.对于自增运算++j与j++,由于加一的执行顺序不同,所以Java中有中间缓存变量来储存其单个表达式的值,而j的自增自减的结果依然保留在原来的变量储存区.因为本体是j的值,而单个表达式的值是中间产生 ...

  2. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  3. java基础知识(五)java类

    类是java的核心和本质,是java语言的基础. 一.java中的类 1.类class 一个类可以包含局部变量.实例变量.类变量(静态变量) 一个类至少有一个构造方法,如果没有,系统会默认给出一个无参 ...

  4. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  5. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  6. Java基础知识强化103:Java常量池理解与总结

    一.相关概念 1. 什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. 2. Class文件中的 ...

  7. Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

    1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...

  8. Java基础知识强化13:Java中单例模式案例使用(懒汉式)

    1.古往今来历史上皇帝通常只有一人.为了保证其唯一性,古人采用增加"防伪标识"的办法,如玉玺.更为简单的办法就是限制皇帝的创建.本案例中就是使用单例模式从而保证皇帝的唯一性.实例运 ...

  9. Java基础知识强化12:Java中运用数组的四种排序方法

    1.使用JavaApi文档中的Arrays类中的sort()进行快速排序 首先我们直接看代码如下: package himi.text; import java.util.Arrays; public ...

随机推荐

  1. LinkedList实现原理

    原文链接:https://www.jianshu.com/p/56c77c517e71 本文对LinkedList的实现讨论都基于JDK8版本 Java中的LinkedList类实现了List接口和D ...

  2. 关于Intel芯片架构的发展史

    ---恢复内容开始---  当你真正的深入去行走在底层的道路上,你就会接触大量的一些貌似懂的概念性名词,比如Intel公司的x86架构,x64等等,又或者是当年的386,486等等,唉,有的时候真的是 ...

  3. linux中断和异常睡眠问题

    中断和异常: 中断只代表异步中断,异常代表同步中断,这样系统调用是异常处理,不是中断处理. 这里异常处理是可以休眠block的,因为异常处理所需的数据是存储在异常栈中,而每个进程都有一个异常栈,所以异 ...

  4. 16.Shortest Unsorted Continuous Subarray(最短未排序子数组)

    Level:   Easy 题目描述: Given an integer array, you need to find one continuous subarray that if you onl ...

  5. pytorch 迁移学习[摘自官网]

    迁移学习包含两种:微调和特征提取器. 微调:对整个网络进行训练,更新所有参数 特征提取器:只对最后的输出层训练,其他层的权重保持不变 当然,二者的共性就是需要加载训练好的权重,比如在ImageNet上 ...

  6. Linux 磁盘 分区 挂载点的理解

    在Linux中一切皆文件: 虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口:同时,它也提供了内核中的 ...

  7. Linux安装与分区解释

    Linux安装过程中最重要的就是对硬盘进行分区: Linux是先建立一个根目录“/”,然后在根目录上建立一系列的空目录,接着把硬盘分区挂载到相应目录上. 在linux系统中至少必须有两个挂载点(磁盘分 ...

  8. java 学习原生jdbc

    public class App { public static void main( String[] args ) { //JDBC驱动 String driverName = "com ...

  9. c#缓存帮助类

    public static class CacheHelper { static object _lockObj = new object(); private static Dictionary&l ...

  10. day_07 深浅拷贝

    1. 基础数据类型的补充 1字符串的操作: 1.join 把字符串或者列表的的内拼接,拼接成字符串 和split相反--把字符串转换成列表 2.删除 字典和列表在循环中是不能进行删除的,可以在循环中把 ...