【Java】_2_Java程序入门第五课

时间:2022-04-23 23:17:04

  我们知道,在C程序中,主入口函数(通常大家叫主函数,就是main()函数)可以获取系统传递给程序的参数,其主函数的定义形式如下:

#include <stdio.h>

int main(int argc;char* argv[])
{
statement;

   return 0;}

  在C中,main函数的形式参数: argv指针数组存储的是传递的参数的指针,argc存储的是主函数获取的参数的个数,即argc存储的是数组argv的index

大小,并且argv[0]存储的是可执行程序的文件名(这个包括路径?嘻嘻,这里卖个关子)。

  那么在Java中是否具有这样的机制呢? 

【Java的命令行参数】

  Java的入口函数main也提供了C语言一样的机制,我们来看入口函数的main的定义:

/*

*/

public class class_name
{
public static void main(String args[])
{
statements;
}
}

  可以看到,main函数也存在形式参数:String args[]

  这里,系统传递给Java程序的参数就是存储在形式参数  args[] 中,大家可以看到Java中的形式参数没有:argc count项? 这是为什么呢?

/*
本程序代码测试For Each语句 和命令行参数
*/

public class ForEach
{
public static void main(String[] args)
{
//测试for each语句和main函数的参数
//for(String getmain:args)
//System.out.println(getmain);

for(int i=0;i<args.length;i++)
System.out.println(args[i]);

}
}

  程序的执行结果如下:

【Java】_2_Java程序入门第五课

  通过程序我们看到,Java的main函数确实接受了系统传递过来的参数,并且没有存储Java程序的名称。同时我们可以看到不需要

argc count计数也能完整的输出输入的参数;这就是Java与C语言main函数之间的差别。

 

【Java For Each循环】 

  如果接触过VB,那么大家一定会熟悉VB结构中提供的For Each循环结构;同样在Java中在SDK 5.0 以后的版本也提供了这样一个循环结构。

通过For Each循环可以处理具有集合特性的数据,例如可以处理数组、对象集合等。其语法结构是:

  for(Object object_var:Object Set)  statement;

      对于集合Object Set中的每一个对象object_var,执行statement。

  我们可以测试一下这个语句:

/*
本程序代码测试For Each语句 和命令行参数
*/

public class ForEach
{
public static void main(String[] args)
{
//测试for each语句和main函数的参数
for(String getmain:args)
System.out.println(getmain);

//for(int i=0;i<args.length;i++)
//System.out.println(args[i]);

}
}

  程序的执行结果如下所示:

【Java】_2_Java程序入门第五课

  可以看到上面的输出结果和用for循环驱动是一致的。

 

【Java 程序执行的返回值】

  可以看到,Java程序的入口函数定义为void型,就是不返回任何值,但是有时候我们需要返回值那么怎么办呢?我们是否可以和C中一样

将Java的入口函数定义为int型(或者是其他返回类型呢)?

  遗憾的是,Java程序的main函数必须定义为void类型,那么我们是否不能有返回值给系统了呢?

  Java虽然没有提供入口函数的return机制,但是提供的System类的方法可以说实现这个目的。语法如下:

     System.exit(x);  //通过这个方法实现返回值到系统。

  具体的实例就不做了。

 

【Java 字符串类型】

   字符串:在Java中字符串是Unicode字符序列。和C语言类似,Java没有内置标准的数据类型来表示字符串,而是通过在标准库中

提供一个“预定义的类”来提供对字符串处理的支持;这个类就是:String

   根据OOP的思想,任何一个字符串都可以认为是String类的实例Instance。而在Java中沿袭了C/C++体系的习惯,在Java中用

双引号来表示字符串。

Exp:

  “abcde”;//Java字符串

      String EmptyStr="";  //空字符串

  String  Greeting=“Hello world”;//字符串“Hello world”

1、子串

  从字符串提取的一个小字符串就是一个子串,包括字符串本身;这通过String提供的substring方法来实现。

  其语法是:

  object.substring(index_start,index_end);

  由于字符串引用索引是从index_start可以0开始,且index_end是第一个不需要提取的字符,因此[index_start,index_end)是左闭右开区间,

因此这里需要注意 。 

  提取的子串的长度为: index_end - start_index.

Exp:

  String greeting="Hello world";

      String sub_greeting=greetring.substring(0,5);

      String sub_sub_greeting=sub_greeting.substring(1,3);

这样我们的子串sub_greeting就是“Hello”;而sub_sub_greeting则是“el”;

/*
本程序测试字符串String类
*/

public class string
{
public static void main(String args[])
{
String greeting
="Hello world!";
String sub_greeting
=greeting.substring(0,5);
String sub_sub_greeting
=sub_greeting.substring(1,3);

System.out.println(sub_greeting);
System.out.println(sub_sub_greeting);



System.exit(
0);
}
}

执行结果如下:

【Java】_2_Java程序入门第五课

2、字符串的拼接

  我们知道在C++中,通过运算符重载的功能,将 + 重载提供字符串拼接运算,那么在Java中是否具有这样的机制呢?

  Java中不具有运算符重载机制,但是我们依然可以通过 + 运算符连接两个字符串。

Exp:

  String string_link="hello" +" " + "world!";

  这里: string_link 将表示: “hello world!” 这个字符串。

 

3、字符串的不可改变性

  接触过C/C++的对字符串的操作可能在这里会引起部分误解,我们知道如下:

Exp:   *.c

  char p[]="abcdefg";

      p[1]='x' ; //是可以通过这样的方式来改变字符串的内容的。实际上并没有改变“abcdefg”的内容,而是改不了变量p[1]的内容。

  而在Java中不能通过这这机制来改变String对象中的内容;因为String 对象更像一个引用,而不是数组变量。  

 

Exp: *.java

  String  str="abc";

     str[1]='x'; //这种语法是错误的,Java的String类是不可改变指向的内容; 这类似于C/C++中的 char *p=“abcd”一样;不能通过p[1]

                      //改变“abcd”的内容一样。

  如果需要改变字符串的内容,则可以通过Stringbuffer类实现。

 

4、检测字符串是否相等

  有时候需要检测字符串是否相等,那么我们怎么检测两个字符串是否相等呢?

  在String类中提供了一个方法来实现这个功能:object.equals(String obj);

  如果测试的object对象和obj对象相等则返回true;否则返回false。

Exp:

  String   str="Hello";

     str.equals("Hello"); //这里返回true。 当然也可以这样测试  “Hello”.equals(str);  同样返回true。

  需要说明的是,equals方法使大小写敏感的,就是说  “Hello”.equals("hello"); 返回的是false。

  如果需要不区分大小小,则可以使用equalsIgnoreCase 方法来测试。

Exp:

  "Hello".equalsIgnoreCase("hello"); //返回值为true;

  注意:

    不能用 == 符号来测试两个字符串String对象是否相等,虽然有时候 == 确实能进行比较。== 的用途是用来比较两个字符串

的存储位置是否一致,如果一致则运算结果是true,否则为false。

    == 运算符可以用来检测共享字符串是否相等,子串串常量是共享的,而 + 或substring方法得到的字符串均不是共享的。

 

5、字符串存储空间和字符串长度(即代码点和代码单元)

  我们知道Java中字符是采用Unicode编码的,这样字符串存储的空间就比char类型多了一倍。

  通常可以这样认为: 代码点计数 就是 字符串的存储空间计数; 而代码单元计数就是字符串长度(即字符个数)计数。可以通过下面

的方法获取字符串长度:

  int  str_length="hello world".length();

     而如果需要获取代码点计数则需要通过下面的方法:codePointCount(start_index,end_index);

Exp:  获取字符串“hello world”的存储空间大小。

  int cp_str="Hello world".codePointCount(0,"Hello world".length());

  

  有时候需要获取字符串指定位置index的代码单元的内容,我们可以通过:charAt(index);方法; 因为String的index是从0开始计数的

所以    0<= index < object.length-1 .

Exp: 获取字符串“hello world" 的第四个字符

   char  four_in_str="hello world"。charAt(4-1);  //这样four_in_str存储的就是字符'l'

6、 Java的String类的API接口

  Java提供了很多的String类的API接口函数,这些函数用来处理字符串将非常容易,具体就不说了,太多了。

 

【小结】

  到这里,书第三章基本已经看完了,接下来的事情就是第四章了,粗略的看了一下,第四章主要是介绍OOP的内容。

  哎, 学习进度有点慢啊, 这个还真需要时间啊。