作者:100jq |
通过上一节的学习,相信大家已经能够学会如何配置环境变量了。如果还有问题请联系“百家拳软件项目研究室”或者到我们的论坛交流bbs.100jq.com。接下来,我们继续进行吧!
这节我们首先体验一下用java编写的程序。也让大家过把代码瘾,呵呵。目前世界上大部分的软件教程有一个习惯,最开始时总要输出一个字符串“HelloWorld”。我们也是不能免俗啊,也要输出这么一段话。
实践:1、单击“开始”――>运行――>CMD,进入DOS系统。
2、用cd命令进入一个你容易找到的目录。如图2-1
图2-1
3、输入命令notepad Hello.java 用记事本创建并打开一个java文件。
如图2-2
图 2-2
4、在里面输入下列代码
/*
简单的 HelloWorld 程序
*/
public class Hello{
//main方法
public static void main (String args[]) {
System.out.println ("Hello World!"); //输出字符串“Hello World!”
}
}
本例子,点击此处下载
upload/2007_07/07070220084567.rar
5、在DOS的界面里,敲javac Hello.java 编译这个文件。会发现文件夹里多了一个Hello.class的文件。如图2-3
图 2-3
6、最后一步,还是在DOS的界面里,敲 java Hello 观察结果。
相信你已经看到结果了吧!
总结
通过上述几个步骤我们体验了java代码原来是这么编写和运行的啊。那么具体这些东西是什么意思呢?
javac是jdk的编译器,刚才我们输入javac Hello.java的时候意思是把把Hello.java这个源文件编译成了字节码,就是Hello.class这个文件。
java命令是 java的解释器 java Hello的意思是将编译后的字节码放在解释器上执行。 从中我们也可以看到java语言的执行过程,是先编译后解释的。
JDK里面还有许多命令呢!下面我们来全面了解一下JDK。JDK的命令为
4类。有基本命令,RMI命令,国际化命令,安全控制命令。在这里我只介绍些,有代表性的命令。刚才那两个javac和java已经说过了。
他们是基本命令,基本命令里还有jar命令,也是很常用的。Jar命令是java类的归档命令。Jar命令可将多个文件合并为单个JAR归档文件。Jar是个多用途的存档及压缩工具,它基于zip和zlib压缩格式。说的通俗一点就是它是把java的类文件,即*.class文件打包用的。我们来做个例子,
实践:1、在刚才那个目录的DOS窗口里敲jar cvf hello.jar Hello.class
2、观察结果。如图2-4
图 2-4
看看有没有生成一个叫做hello.jar的文件,用winrar打开有没有Hello.class这个文件呢?如果有的话就好了,其实jar命令还可以打很多格式的包哦。上一节我们配置JDK的时候,是不是把CLASSPATH里面配置了一个lib的目录,那里面也有很多jar包。所以说jar命令,是大家要掌握的一个命令。
下一个介绍国际化的命令,JDK里只有一个这样的命令native2ascii,该命令将本地编码字符(既非Latin-1,又非Unicode字符)的文件,转换为Unicode编码字符文件。这是一个处理多国语言字符的命令,都转换为Unicode编码了,就容易处理了。这样开发国际化的软件,是非常方便的。
实践:1、在任意目录里面建立两个文件,一个叫gb2312.txt,另一个叫ascii.txt
在gb2312.txt里面输入“百家拳软件项目研究室”这段话。之后保存。
2、在dos里面进入文件所在的目录。敲 native2ascii -encoding gb2312 gb2312.txt ascii.txt 。
3、打开ascii.txt看看是什么结果呢?里面的有很多符号吧
/u767e/u5bb6/u 62f 3/u 8f 6f /u4ef6/u9879/u76ee/u7814/u 7a 76/u5ba4 这些就是
“百家拳软件项目研究室”这段话的Unicode编码。
好了这节课介绍了java代码的编写和jdk的一些命令。相信大家应该有所了解了吧!但是我们要学习一门技术的话,也不能只会编hello world啊。下一节我们将介绍java语言的基础
请阅读下一节
作者:100jq |
上回课,我们学习了并实践操作了一个Hello World的例子,大家显然是没有解渴。不
过,回过头来有些同学问了。“你写了一大堆,是出字了。不过我不明白是什么意思啊!
这个不用着急。下面我为大家解释一下这段程序。
1 /*
2 简单的 HelloWorld 程序
3 */
4 public class Hello{
5 //main方法
6 public static void main (String args[]) {
7 System.out.println ("Hello World!"); //输出字符串“Hello World!”
8 }
9 }
程序中的1-3 行是注释行
/*
简单的 HelloWorld 程序
*/
“/*……*/”是多行注释,而“//”是单行注释的意思。
第4行
声明类名为Hello,保存时要以Classname.java保存。类名(Classname)是在源文件中指明的,源文件编译后可在源代码所在的目录里生成一个classname·class 文件。在本例题中,编译器创建了一个称为Hello.class 的文件, 它包含了公共类Hello 的编译代码。
public class Hello{
第5行是一个单行注释
第6行
是程序执行的起始点。java 技术解释器必须发现这一严格定义的点,否则将拒绝运行程序。C和C++语言,也采用main()做为程序的起点。但是与java有些不同,以后的课程会介绍的。
第7行
声明如何使用类名、对象名和方法调用。它使用由System 类的out 成员引用的PrintStreamout对象的println()方法,将字串“Hello World!”打印到标准输出上。
System.out.println (“Hello World!”);
分号“;”是java语言语句的分隔符
第8-9行
那两个花括号是分别和第4行和第6行的花括号配对
数据类型的概述
数据类型对于任何一门计算机语言来说都是重要的,因为变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在java语言里,数据类型分为两大类:
一、基本数据类型。二、复合数据类型(对象数据类型)。
基本数据类型又分4类8种。如下:
u 逻辑型:boolean。
u 文本型:char。
u 整型:byte,short,int和long。
u 浮点型:double和float。
复合数据类型就有很多种了,他们都是从Object这个类继承下来的。
下面我想重点的讲一个问题:
文字类型的char和String,这两个都是文本类型。但是不同之处,
1、char是基本数据类型,而String不是,但是String是非常有用的。
2、char是一个16位的unicode(国际码)字符,用单引号引上。例如,
char c = ‘100jq’;
String是一个类。字符串在java里是对象。在java SE 5中有三个类可以表示字符串:
String,StringBuffer和StringBuilder。StringBuilder是jdk1.5的特性,在jdk1.5之前的版本中没有。字符串要放在双引号中。字符串中的字符也是Unicode 。String对象表示的字符串是不能修改的。如果要对字符串修改,应该使用StringBuffer和StringBuilder类。
实践:
public class Assign {
public static void main (String args []) {
// 声明整数型变量
int x, y;
// 声明并赋值给一个单精度浮点数变量
float z = 3.414f ;
// 声明并赋值给一个双精度浮点数变量
double w = 3.1415;
// 声明并赋值给一个布尔类型的变量
boolean truth = true;
// 声明字符型变量
char c;
// 声明字符串型变量
String str;
//声明并赋值给一个字符串型变量
String str1 = "bye";
// 为字符型变量复值
c = 'A';
// 给字符串型变量赋值
str = "Hi out there!";
// 给整型变量赋值
x = 6;
y = 1000;
System.out.println(x);
System.out.println(z);
System.out.println(w);
System.out.println(truth);
System.out.println(c);
System.out.println(str);
System.out.println(str1);
}
}
错误的赋值举例:
y = 15.454; //y是个整型数
w = 456; //w是个双精度数
将这个程序用上节课的方法,编译执行。就可以看到结果了。
这是基本数据类型的例子 点击此处下载
这节课,我们基本了解了java的数据类型的知识。也知道了基本数据类型的概念。但是对象型的数据呢?java是面向对象的语言啊,光靠基本数据类型也无法描述客观的世界啊。因为我们不可能说,桌子、椅子是整数,还是字符。所以对象型的数据类型是非常必要的,也是理解面向对象概念的基础之一。请看下节
作者:100jq |
上节课给大家留下一个问题,计算机要描述的是现实世界。光有基本数据类型,是不能满足我们的需要的。在这个大千世界里,任何东西都可以看做成对象,它们当然不能都是整数和文字了。现在学习java的同学,一般会看到一些java的教程里写的一个日期的例子。这个例子是个典型的例子。你们想啊,日期里面有很多属性啊,像是年,月,日。基本类型的数据就不能很好的描述它。就像是人,是一个类型。人有很多属性,头,躯干,四肢,这样的话,我们就更难用基本类型来描述了。
我们还是看看这个日期的例子吧!
public class MyDate {
private int day; //日
private int month; //月
private int year; //年
public MyDate(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
}
public MyDate(MyDate date) {
this.day = date.day;
this.month = date.month;
this.year = date.year;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public MyDate addDays(int more_days) {
MyDate new_date = new MyDate(this);
new_date.day = new_date.day + more_days;
return new_date;
}
public void print() {
System.out.println("MyDate: " + day + "-" + month +
"-" + year);
}
}
在上次课的那个例子里我们已经看到了,class关键字后面是个类名。这个类名就是MyDate。MyDate 这个类里面定义了3个属性,4个方法,2个构造函数。因为还没有讲到这些概念,目前说还是有点超前。我还是先来讲些理论的东西。
理论阐述:
类描述了同一对象都具有的数据和行为。java语言中的类将这些数据和行为进行封装,形成了复合数据类型。创建一个新类,就是创建了一种新的数据类型。在程序中,类只定义一次,而用new运算符可以实例化同一个类的一个或多个对象。比如人是一个类,每一个人就是一个对象。那当然是人定义一次,对象可以new出很多对象了。但是这些具体的人,都具有同样的特征(数据和行为)。
java的类里面有3个东西,看下面:
class 类名 {
声明属性;
声明构造函数;
声明方法;
}
刚才讲了,类不是要描述现实的数据和行为吗?在这里属性就是要描述封装的数据,方法就是描述行为。构造函数嘛,是在new的运算符后面的,当然是构造对象的了,要不怎么能叫构造函数呢!
顺便说一下,那两个属性的前面有一个private 那是权限修饰符。意思是私有的也就是别人不能用。java语言用这种权限修饰符实现封装。不想C语言的结构体,都是公有的属性,那样是不安全的。就像是人有五脏六腑,那些东西就是私有的。怎么能让谁都碰呢?这就是面向对象的一个重要的概念叫做封装。面向对象一共有三个重要特征(封装,继承,多态)我们以后会学到的。
所以,刚才MyDate那个类里面,有3个属性 int类型的day,month,year .4个方法
setDay(int day),getDay() , addDays(int more_days), print().还有两个构造函数。
看下面的例子如何调用这个类的方法的:
public class TestMyDate {
public static void main(String[] args) {
MyDate my_birth = new MyDate(22, 7, 1964); //通过第一个构造函数new了一个叫my_birth的对象,并在参数里面赋值
MyDate the_next_week = my_birth.addDays(7); //这个对象调用了addDays(int more_days)的方法,赋值给the_next_week的变量
the_next_week.print(); //调用print()方法
}
} 点击此处下载源码
调用一个类的方法,实际上是进行对象之间或用户与对象之间的消息传递。
实践:
1、 编译上述两个类 ,直接编译TestMyDate.java就行。还记得怎么做吗?进入DOS界面,到你存放这两个文件的目录下,敲javac TestMyDate.java
2、 然后敲 java TestMyDate 就OK了。
观察结果
总结:
今天我们理解了对象类型的数据类型,也知道了对象和对象之间的调用方式。
再为大家提供些代码吧。点击此处下载
作者:100jq |
上两次课我们知道了,java语言中的两种数据类型。这节课呢,我们对上两次课做一个补充,也加深一下理论知识的学习。理论的东西是很有用的啊。这节课介绍基本类型变量和引用类型变量。
java中数据类型分为两大类,上次课已经讲完了,是基本类型和对象类型。相应的,变量也就有两种类型:基本类型和引用类型。基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。引用类型,可是引用类型呢?它是一个对象类型的啊,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。很好理解吧,因为一个对象,比如说一个人,不可能是个数字也不可能是个字符啊,所以要想找它的话只能找它的地址了。
罗唆:
我们在学习计算机的过程中,所谓的难的东西,就是以前没有听过的概念,和不常用的思想。像是这个引用类型的概念就是以前不常用的,基本类型当然好理解不讲大家也知道。所以我们对于这样陌生的概念我们只要多琢磨一下就会明白的。
我们废话少说,接下来看看这两种类型变量的不同处理吧。基本类型自然是简单,声明是自然系统就给它空间了。例如,
int baijq; baijq=250; //声明变量baijq的同时,系统给baijq分配了空间。
引用类型就不是了,只给变量分配了引用空间,数据空间没有分配,因为谁都不知道数据是什么啊,整数,字符?我们看一个错误的例子:
MyDate today;
today.day = 4; //发生错误,因为today对象的数据空间未分配。
那我们怎么给它赋值啊?引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。举个例子:
MyDate today; //将变量分配一个保存引用的空间
today = new MyDate(); //这句话是2步,首先执行new MyDate(),给today变量开辟数据空间,然后再执行赋值操作。
小总结: 刚才说了一大堆,其实就是一件事。如果是引用类型的变量,必须先得new一个对象出来。不new哪来的对象啊,不new哪有数据空间啊?没有数据空间怎么能访问呢?这回明白了吧!
我们还有个问题没有说,引用类型变量怎么赋值?这个就不是很难了。举个例子:
MyDate a,b; //在内存开辟两个引用空间
a = new MyDate(); //开辟MyDate对象的数据空间,并把该空间的首地址赋给a
b = a; //将a存储空间中的地址写到b的存储空间中
如图5-1
作者:100jq |
这节课我们又要讲语法了,这是“百家拳软件项目研究室”这部教程的第6节课,我们这个教程侧重的是实践的内容和语言的重点。在java语言中还有很多细节的东西,请参考sun公司的官方培训教程。我们这里不能一一讲述。这节课我们来给大家提供一些程序流程控制的一些例子供大家学习。计算机怎么做事情,是我们教给他的。我们用它解决实际生活中的问题,所以计算机要描述现实生活中的流程。java语言中提供了4类程序控制语句,来描述流程:
1.循环语句:while,do-while,for
2.分支语句:if-else,switch,
3.跳转语句 break,continue,label: 和return
4.异常处理语句:try-catch-finally,throw
实践:
1.循环语句
while 语句
class While {
public static void main(String args[]) {
int n = 10;
while(n > 0) {
System.out.println("tick " + n);
n--;
}
}
}
do…while 语句
class DoWhile {
public static void main(String args[]) {
int n = 10;
do {
System.out.println("tick " + n);
n--;
} while(n > 0);
}
}
二者区别,do…while至少循环一次,而while的表达式要是为flase的话可以一次也不循环。再通俗一点,do…while就算是括号里的是flase,人家最少也能do一次。
for语句
class ForTick {
public static void main(String args[]) {
int n;
for(n=10; n>0; n--)
System.out.println("tick " + n);
}
}
与上面那两个的区别,for循环执行的次数是可以在执行之前确定的。通俗一点说吧,看这个例子 for(n=10; n>0; n--)就是在括号里的时候,就已经知道要循环10次了。
还有啊,for循环的部分可以为空的
class ForVar {
public static void main(String args[]) {
int i;
boolean done = false;
i = 0;
for( ; !done; ) {
System.out.println("i is " + i);
if(i == 10) done = true;
i++;
}
}
} 循环语句的例子下载
2.分支语句
if/else语句
class IfElse {
public static void main(String args[]) {
int month = 4; // April
String season;
if(month == 12 || month == 1 || month == 2)
season = "Winter";
else if(month == 3 || month == 4 || month == 5)
season = "Spring";
else if(month == 6 || month == 7 || month == 8)
season = "Summer";
else if(month == 9 || month == 10 || month == 11)
season = "Autumn";
else
season = "Bogus Month";
System.out.println("April is in the " + season + ".");
}
}
//这段程序输出:
//April is in the Spring.
// 注意 “||”是或运算
switch语句
class Switch {
public static void main(String args[]) {
int month = 4;
String season;
switch (month) {
case 12:
case 1:
case 2:
season = "Winter";
break;
case 3:
case 4:
case 5:
season = "Spring";
break;
case 6:
case 7:
case 8:
season = "Summer";
break;
case 9:
case 10:
case 11:
season = "Autumn";
break;
default:
season = "Bogus Month";
}
System.out.println("April is in the " + season + ".");
}
} 分支语句代码下载
switch语句适合于条件非常多的逻辑
请看上述语句可以混合使用,请看下载例子
作者:100jq |
昨天我们说有4类程序控制语句,但是才讲了2个。今天讲跳转语句。异常处理语句我们找一节专题来讲。
循环跳转语句 :break [label] //用来从语句、循环语句中跳出。
continue [label] //跳过循环体的剩余语句,开始下一次循环。
这两个语句都可以带标签(label)使用,也可以不带标签使用。标签是出现在一个语句之前的标识符,标签后面要跟上一个冒号(:),标签的定义如下:
label:statement;
实践:
1、 break语句
class Break {
public static void main(String args[]) {
boolean t = true;
first: {
second: {
third: {
System.out.println("Before the break.");
if(t) break second; // break out of second block
System.out.println("This won't execute");
}
System.out.println("This won't execute");
}
System.out.println("This is after second block.");
}
}
}
// 跳出循环
class BreakLoop {
public static void main(String args[]) {
for(int i=0; i<100; i++) {
if(i = = 10) break; // terminate loop if i is 10
System.out.println("i: " + i);
}
System.out.println(" Loop complete.");
}
} 5个break跳出循环的例子下载
//跳出switch
class SampleSwitch {
public static void main(String args[]) {
for(int i=0; i<6; i++)
switch(i) {
case 0:
System.out.println("i is zero.");
break;
case 1:
System.out.println("i is one.");
break;
case 2:
System.out.println("i is two.");
break;
case 3:
System.out.println("i is three.");
break;
default:
System.out.println("i is greater than 3.");
}
}
} 这个在昨天的分支语句中,我们就已经学到了。
2、 continue语句
class Continue {
public static void main(String args[]) {
for(int i=0; i<10; i++) {
System.out.print(i + " ");
if (i%2 = = 0) continue;
System.out.println("");
}
}
}
//带标签的continue
class ContinueLabel {
public static void main(String args[]) {
outer: for (int i=0; i<10; i++) {
for(int j=0; j<10; j++) {
if(j > i) {
System.out.println();
continue outer;
}
System.out.print(" " + (i * j));
}
}
System.out.println();
}
} 此例子打包下载
作者:100jq |
前几次课的讲解,我们了解了这样几个问题。java的两种数据类型,和一些程序控制语句。今天,我们还是要通过一些例子。对上述东西有一个更深的理解。
我们现在知道了,所有对象型的数据类型的基类是java.lang.Object 。而写java程序的时候非常多的工作都是在写这些类,和实现里面的方法。而偏偏就有那么8种基本类型和他们不一样。以至于让你来回在这两种之间转换,这是很让人头疼的事情。java中int,long,char这样的类型不是对象型。因此java里提供了一种叫做包装类(wrapper)的东西,使基本类型,有着相应的对象类型Integer,Long,Character等。这样就可以,先把基本类型的东西,转成对象来用,然后再转回去。来来回回,千锤百炼。
到了jdk5.0的时候呢,就不用了。看下面的例子: 实践:
public class Test1 {
public static void main(String[] args) {
// 装箱
int i = 0;
Integer integer = i;//i这么一个基本类型的数,可以赋值给Integer型的变量
// 简单的拆箱
int j = integer; //integer这种原始类型的数,也能赋值给j这个原始类型的变量
Integer counter = 1; // 装箱
int counter2 = counter; // 拆箱
while (counter < 100) {
System.out.println("计数 "+counter++); //看啊,counter这个对象型的数,还能自动增加
}
}
}
在幕后JVM已经自动执行了转换,同理Boolean和boolean之间也可以,自动拆箱装箱。但是,Integer和int毕竟还是有着不同的。看下面例子:
public class Test2 {
public static void main(String[] args) {
Integer i1 = 256;
Integer i2 = 256;
if (i1 = = i2)
System.out.println("相等!");
else
System.out.println("不相等!");
}
} 结果输出的是“不相等!”,两个对象比较,它们在内存中开辟的是两个地址怎么能相等呢?
警告:你可千万不能依赖这个结果,请把i1和i2的值,改成100。(请看Test3.java)看看什么结果,令人惊讶的是改了个数,居然输出了“相等!”。
这是因为JVM可以选择要尝试这段代码的最佳优化,并对两个Integer对象使用一个实例,这样的话“= =”就会返回true了。在自动装箱时对于值从–128到127之间的值,使用一个实例。上述例子打包下载
这种装箱与拆箱机制对,程序流程控制语句,也有很大影响:
public class Test4 {
public static void main(String[] args) {
Boolean arriving = true;
Integer peopleInRoom = 0;
int maxCapacity = 100;
while (peopleInRoom < maxCapacity) {
if (arriving) {
System.out.printf("很高兴见到你.%d号先生/n",peopleInRoom);
peopleInRoom++;}
else {
peopleInRoom--;
}
}}}另外一个从unboxing获得好处的语句是switch。在jdk5.0之前的JVM,switch接受int、short、character或者byte值,而在unboxing的操作中,你现在也可以为它赋予新引入的enum之外的Integer,Short,Char以及Byte值。Enum的值,我们在后面的教程会详细讲述。上述例子打包下载