为什么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. Easyui-交互式消息弹出框

    由于项目在优化的时候需要用到弹出框,按自己的想法是傻傻的用一些alert直接弹出得了,但是这样用户体验度不是特别好,影响界面美观,所以自己还是用了封装好的easyui给的消息框,怎么用呢,这个里面很有 ...

  2. 【bzoj3209】: 花神的数论题 数论-DP

    [bzoj3209]: 花神的数论题 首先二进制数中1的个数最多就是64个 设所有<=n的数里二进制中1的个数为i的有a[i]个 那么答案就是  然后快速幂 求a[i]可以用DP 设在二进制中从 ...

  3. Sublime3插件安装

    首先声明一下,小编是做后台开发出身,但是总是想捣鼓一些小的网站出来,可能是完美心作祟,感觉前端这边不能差事,所以就自己上了,一开始是用eclipse来开发的,具体原因忘了,也不知道怎么就开始用Subl ...

  4. docker log: containerid-json.log 文件disappear,问题排查及解决方案

    问题排查: 运行 #docker info   查阅资料,知道了docker的logging driver相关理论:https://docs.docker.com/engine/admin/loggi ...

  5. java 实现导出Excel文件

    java 实现导出Excel(java生成 excel 并导出文件) 经常有有一些数据需要导出成   excel  格式 ,所以就需要实现啦 开始: 1.加入jar poi-3.6-20091214. ...

  6. vue安装常用插件命令

    1. 安装element-ui npm i element-ui -S 2. 安装vuex npm install vuex --save 3. 安装axios npm install --save ...

  7. CSS(十二).transition的应用之CSS中心扩散

    实现 css中心向两边扩散的两个核心 1.hover 之前的 垂直居中 2.文字置于最顶层 顺道来讲讲hover 伪元素是不支持 hover 的,不过我们可以给普通的 tag 标签添加 hover 以 ...

  8. CSS+jQuery实现轮播

    CSS+jQuery实现轮播 CSS jQuery 前端  实现功能: 自动轮播: 鼠标放在上面停止轮播: 鼠标放在上面显示左右切换的按钮: 鼠标放在小圆圈上显示对应的图片: 轮播效果图 style. ...

  9. pandas学习3(数据处理)

  10. Go语言基础之16--Mysql基本操作

    一.Mysql驱动及数据库连接 1.1 Golang中的Mysql驱动 A. https://github.com/go-sql-driver/mysql B. Go本身不提供具体数据库驱动,只提供驱 ...