我们知道,在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的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]); } }
程序的执行结果如下所示:
可以看到上面的输出结果和用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); } }
执行结果如下:
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的内容。
哎, 学习进度有点慢啊, 这个还真需要时间啊。