《疯狂Java讲义》8

46 阅读6分钟

目录

 

与用户互动

1、 运行Java程序的参数

2. 使用Scanner获取键盘输入

系统相关

1.System类

2.RunTime类

BigDecimal类


与用户互动

1、 运行Java程序的参数

****Java程序的入口——main()方法的方法签名: 

public static void main(String[] args)    { }

下面详解为什么用这个方法签名:

  • public修饰符: 因为Java类由JVM(java虚拟机)调用,为了让JVM可以自由调用这个main()方法,所以用public进行修饰。

  • static修饰符: JVM调用这个方法时,不会先创建该主类的对象,然后通过对象调用这个主方法,JVM直接通过调用这个类来调用这个主方法(之前说道过,static修饰的方法是类方法,可以通过类或者对象进行调用)。

  • void: JVM调用主方法,主方法的返回值要返回给JVM,但是这没有任何意义,所以就不要返回值就好了。

  • String[] args: 字符数组形参。根据方法调用原则,谁调用了方法,谁就提供形参的值,也就是说,JVM调用了主方法,所以由它为形参赋值。

    但是JVM怎么知道如何为这个数组赋值?

    看下面代码:

     

    图片

    结果如下:

     

    图片

    这是是意料之中的结果,因为没有给数组赋什么值,长度当然为0;

    但是如果运行Java程序时(控制台运行)在类名后面紧跟一个或者多个字符串(多个字符之间通过空格分开),JVM就会把这些字符串依次赋值给args数组元素。

    如果某参数本身包含了空格,则应该将参数用双引号(“”)括起来,否则java会把这个空格单座参数分隔符,而不是参数本身。

     是不是很神奇,没想到一个以为是套路的东西含义这么深刻。

2. 使用Scanner获取键盘输入

(1)Scanner主要提供了两个方法来扫描输入:

    1)hasNextXXX():是否还有下一个输入项,其中XXX可以是int,long等代表基本数据类型的字符串;如果只是判断是否包含下一个字符串,则直接使用hasNext()。

    2)nextXXX():获取下一个输入项。

 

代码如下:

图片

结果如下:

图片

    这里需要了解一下,Scanner默认的是通过空白(空格,Tab空白,回车)作为分隔符,如果不想将空白作为分隔符,例如想输入一行数据,无论有没有空格,都看作一个输入项,如果是这种需求,可以把Scanner的分隔符设置成只回车。  为Scanner设置分隔符使用useDelimiter(String pattern)方法即可。该方法的参数应该是一个正则表达式。(后文会介绍)

看一下栗子:

图片

结果为:

图片

    可以看到这次在一行输入三个数据,空白是没有分界符的作用的。

    实际上,Scanner提供了两个简单的方法进行逐行读取:

1)boolean hasNextLine():返回输入源中是否还有下一行;

2)String nextLine():返回输入源中下一行的字符串。

下面演示个用Scanner获取输入源中整型的输入项:

图片

结果为:

图片

    可以看到的是,它将数字(整数或者浮点数均变成了浮点数进行输出),但是第二个输入数据,因为输入了字符,不是数字,所以没有输出结果,此时,Scanner的读取操作被阻塞。这也是其不如上一个程序所在,适应性不强。

   Scanner不仅能够读取用户的键盘输入,还能对文件进行读入。

举个栗子:

 

图片

这个大体上写法类似于上面的,要注意两点,一个是文件的载入的写法,一个是上面的异常处理(这个程序会自动提示生成)。

 

系统相关

Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定的功能。Java提供了System类和Runtime类与程序的运行平台进行交互。

1.System类

    System类作为当前运行平台时,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法。

    System类提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法(这个我不清楚,了解一下而已)。System类还有两个获取当前系统时间的方法,currentTimeMillis()和nanoTime(),它们都返回一个long型整数,这里必须指出的是,这两个方法返回的时间粒度取决于底层操作系统,可能所在的操作系统根本不支持以毫秒和纳秒作为计时单位。

2.RunTime类

****Runtime类代表Java程序的运行环境时,每个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取

与之关联的Runtime对象Runtime作为运行环境时,可以访问JVM的相关信息,

如处理器数量,内存信息等。

举个栗子:

 

图片

结果如下:

图片

    此外,Runtime类还有一个功能:直接单独启动一个进程来运行操作系统的命令:

图片


感觉好厉害的样子哦!

BigDecimal类

1. 为了能精确表示、计算浮点数,Java提供了BigDecimal类,该类提供了大量的构造器用于创建BigDecimal 对象,包括把所有的基本数值型变量转换成一个BigDecimal对象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。

2. 在BigDecimal类的构造器中,BigDecimal(double val)构造器有一定的不可预知性,当程序使用new BigDecimal(0.1)来创建一个BigDecimal对象时,它的值并不是0.1,它实际上等于一个近似0.1的数,因为0.1无法准确表示为double浮点数。但是使用BigDecimal(String val)构造器的结果是可预知的,因此通常优先使用基于String的构造器。 如果必须使用double浮点数作为BigDecimal 构造器的参数时,通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。

END

图片