• 850 likes • 1.26k Views
声明. 本 PPT 讲述了 JAVA 的基础知识 由于 JAVA 和 C 本身很接近 , 所以本 PPT 主要侧重于说明两者的区别 制作这个 PPT 的目的 : 力图大家可以从对比中轻松的掌握 JAVA 语言 本 PPT 配有一些例子程序,都比较短小,适合大家直接用记事本直接编写. 内容. 第一章 初识 JAVA 第二章 JAVA 的基本元素 第三章 类 第四章 其他操作. 第 1 章 初识 JAVA. 第 1 章 初识 JAVA. JAVA 简介 JAVA 程序的执行 JAVA 的安装 第一个 JAVA 程序. JAVA 简介.
E N D
声明 • 本PPT讲述了JAVA的基础知识 • 由于JAVA和C本身很接近,所以本PPT主要侧重于说明两者的区别 • 制作这个PPT的目的: 力图大家可以从对比中轻松的掌握JAVA语言 • 本PPT 配有一些例子程序,都比较短小,适合大家直接用记事本直接编写
内容 • 第一章 初识 JAVA • 第二章 JAVA的基本元素 • 第三章 类 • 第四章 其他操作
第1章 初识JAVA • JAVA 简介 • JAVA 程序的执行 • JAVA 的安装 • 第一个JAVA 程序
JAVA 简介 • JAVA 是一种完全面向对象的程序 • JAVA 程序中只有类,而C++中可以没有类 • JAVA 程序分类 • JAVA 应用程序 • JAVA Applet
JAVA程序的执行 • JAVA程序的执行原理是:先将源代码编译为字节代码(.class文件) • 然后字节代码可以在JAVA虚拟机(JVM Java Virtual Machine)上解释执行
JAVA 的安装 • JAVA 的安装 • JAVA 环境变量的设置
下载安装 JDK 官方下载地址 http://java.sun.com/javase/downloads/index.jsp 可以选择 JDK6 的安装包 TIPS:安装的时候会提示您选择安装在什么目录下, 建议安装路径不要有空格, 所以不宜安装在\Program Files目录下
环境变量设置 安装完JDK 之后需要进行系统环境变量的设置 右键点我的电脑,选择属性->高级->环境变量 假如JDK安装的目录是C:\jdk1.6 • 添加一个名为JAVA_HOME的系统变量,值为C:\jdk1.6 • 然后在PATH这个变量的最后 加入 ;%JAVA_HOME%\bin • 加入CLASSPATH这个变量 其值为空的 需要设置这个环境变量,不过它的值是空的!不然可能运行的时候会出错.
第一个JAVA程序 现在可以用记事本敲一个JAVA程序了,先来个HelloWorld程序 代码如下: (HelloWorld.java) public class HelloWorld { public static void main(String [] args) { System.out.println("Hello World"); } }
第一个JAVA程序 运行方法: 开始菜单->运行->cmd 去到JAVA文件的目录下(例如我的电脑是C:\java) 执行以下命令: • C:\java>javac HelloWorld.java • C:\java>java HelloWorld 一切正常的话,您将可以看到Hello World 这行字 如果出现任何异常, 请看本PPT下一页的建议
说明 • JAVA程序中, 类名要与文件名一致 • 例如HelloWorld 程序中,类的名字是HelloWorld,那么保存文件的时候,就应该保存为HelloWorld.java • 执行的时候需要使用javac将源代码转化为字节代码,其执行语句是 javac 类名.java (执行结果将产生.class文件) • 真正执行程序的语句是 java 类名 (该句将执行该类的main函数)
第2章 JAVA基本元素 大家可以看到JAVA 程序与C++程序非常相似,只是一些细节上的不同。由于大家对C++都已经非常熟悉,所以下面主要讲述的是他们的区别 本章讲述的内容有: • JAVA 程序框架 • JAVA 数据类型 • JAVA 表达式 • JAVA 对象和引用变量 • JAVA 的String类 • JAVA 的输入输出 • JAVA 中的方法 • JAVA 的方法中的参数传递方式 • JAVA 数组 • JAVA 包的使用
JAVA 程序框架 如何才能创建一个JAVA应用程序呢? 我们先来看看 HelloWorld 程序的意义 • 第一行public class HelloWorld 它定义了一个类,public表示可以被外部访问,它的意义以后还会解释 • 第二行public static void main(String [] args) 这是这个类的主函数,程序将从这个地方开始执行 • main中的语句是输出一个字符串
JAVA 程序框架 • 一个java文件只能有一个声明为public的类,而且这个类的类名应该与主文件名一致 • 类中必须有一个 public static void main 方法 这是程序执行的起点 注:以上都是针对只有一个java源代码文件的程序而言的, 多个源代码文件的情况以后再做说明
数据类型 JAVA 的数据类型分为两大类 • 简单数据类型(共8种) • 除了上面的几种外,JAVA中只存在类,类对象的定义全部是引用变量 (注:我在后面的描述中,把除了简单数据类型之外的数据类型称为“对象数据类型”) 它们有着本质的区别,主要是内存分配方式不不同. 它们的区别将在本章的 “JAVA 对象和引用变量” 一节中进行叙述
简单数据类型 简单数据类型有3个大类 分别是: • 整数数据类型 • 浮点数据类型 • 布尔数据类型
整数数据类型 • char 0 ~ 65535 • byte -128 ~ 127 • short -32768 ~ 32767 • int -2^31 ~ 2^31-1 • long -2^63 ~ 2^63-1 char类型对应的是Unicode 字符集,其中 0-127 对应了我们常用的ASCII码.该类型C++中的使用方法在Java中是可行的,只是它在JAVA中可以覆盖更多的字符
浮点数据类型 • float -3.4E+38 ~ 3.4E+38 • double -1.7E+308 ~ 1.7E+308 • 布尔类型 • boolean 其值为true 或者 false 简单数据类型就只有上面介绍的3大类共8种
表达式及表达式计算 表达式计算的优先顺序,运算符的优先顺序,类型强制转换及隐式转换的规则与C++完全一样。 举例: • (4+7)*(45/7) • (4+7)*((double)45/7)
JAVA 对象和引用变量 • 简单数据类型只有前面那8种,和C++很类似 • 对象数据类型定义的变量则是“指向类对象的引用”,这种变量是“引用变量” • 简单数据类型与对象数据类型有本质的区别 • 简单数据类型定义的是一个“变量”,它的内存空间是在定义的时候就分配的 • 对象数据类型定义的是某个类的一个“引用变量”,它仅仅是一个指针. 该类变量需要使用new运算符进行内存分配. 在分配空间以后, 该“引用变量”就指向了这片申请的空间的地址。
例子 先用一个例子来说明 简单数据类型中有int类型 JAVA系统中还定义了一个与之对应的类: Integer 考虑以下语句: int x; x=30; Integer y; y=new Integer(67);
X X 30 地址 Integer对象 2700 2700 67 X X的值
简单数据类型 int x; 在定义的时候,就为x分配了内存空间 x=30 语句是对x进行赋值 • 对象数据类型 Integer y; 这句话声明的是一个指向Integer 对象的引用。它定义时并不分配内存,其实它的变量只是一个指针(即该变量存储的只是一个地址) 执行y=new Integer(67); 一句时才为它分配指向Integer类型的内存空间 在这里y是“引用变量” • 补充:有人说,JAVA是一种没有指针的语言 我想正确的理解应该是:JAVA是有指针的,只是它在 内部为你工作,对程序员是透明的。但是由于程序员 不能直接进行指针操作,所以JAVA数据处理的灵活性 要低于C++
几种对象数据类型 • 与8种基本数据类型相对应,java系统中定义了8种相应的对象数据类型,分别为:Character Byte Short Integer Long Float Double Boolean
String类 • String 类是JAVA最重要的类之一 在输入输出等很多地方都需要用到它 • 定义 String name; name=“Rhode”; • 以上第2行等价于 name=new String(“Rhode”); 因为String类中定义了一个“=”赋值运算符,所以使用String类的时候,可以不使用new运算符
String 类的用法 String 类重载了很多运算符,使用方便 • String s1 , s2 , t; • s1=“My”; • s2=“Book”; • t=s1+s2; // MyBook • int i=3; • t=s1+i; // My3 一些特殊的例子 n1=12; n2=3; String str; str=“Sum : ”+n1+n2; // 执行后 str=“Sum : 123”; str=“Sum : ”+(n1+n2); // 执行后 str=“Sum : 15”; str=n1+n2+”is the Sum” // 执行后 str=15+“is the Sum”; 执行顺序从左向右,加法执行是整数相加
String 类常用的方法 • 举例 str=“The book”; • char charAt (int index) 取第index个字符 • int compareTo (String str1); 与str1比较大小,返回 比较的值,功能与 C++中strcmp类似 • String concat (String str1); 把str1加到原字符串上 • boolean equals (String str1); 比较两个字符串是否相同,返回 值为true 或者 false • int length (); 返回字符串的长度 • String substring(int s, int l) 返回从第s个字符到第l 个字符的子串 • String toUpperCase(); 返回全部转化为大写字母 的字符串 • String toLowerCase(); 返回全部转化为小写字母 的字符串
String 对象的理解 这是类的对象,它的变量是“引用变量” 是指向String对象的指针 地址 String对象 1300 1300 Rhode name name的值
加深理解 • 比较两个字符串是否相等 现在有定义如下: String str1=new String(“abc”); String str2=new String(“abc”); String str3=str1; 语句1:if (str1==str2) 语句2:if (str1.equals(str2)) 语句3:if (str1==str3) 以上2个语句是不同的,我们说过str1,str2叫引用变量,这样的变量是只是一个“引用”,它的内涵你可以理解为指针,也就是地址。 • 由于str1,str2分配不同的空间,他们地址不同,所以语句1返回false • 真正的字符串内容的比较用的是语句2,他的值是true • 由于str1,str3他们指向了同一个对象(即他们的地址相同),所以语句3返回true
String类常用的转换 • 将String 类转化为int 或者 double 等类型的方法:使用Integer类或者Double类的静态方法来转化,举例: • 转化为 int int x = Integer.ParseInt(“45”); // 执行后 x=45 • 转化为 double double x = Double.ParseDouble(“7.5”); // 执行后 x=7.5 • 将int或者double 转化为String 比较简单,可以利用 String类提供的运算符来巧妙的转化: 例如:将int装化为String 可以用下面的语句 int x; String str = “”+x;
JAVA的输入输出 JAVA写控制台程序的输入需要自己处理JAVA提供的只是输入的字符流处理 我们需要定义一个InputStreamReader对象和一个BufferdReader 对象,这样我们可以获得需要的字符串,如果需要再将字符串转化为整数或者浮点数。 具体做法如下:
JAVA的输入 • 首先定义一个InputStreamReader对象和一个BufferdReader对象如下: • InputStreamReader charReader= new InputStreamReader(System.in); • BufferdReader keyboard= new BufferdReader(charReader); 以上两句可以合并写为下面这一句: BufferedReader keyboard =new BufferedReader (new InputStreamReader(System.in));
有了上面的定义后,就可以进行以下操怍 • 读入单个字符 ch=(char)keyboard.read(); • 读入整行的字符串 str=keyboard.readLine(); • 读入整数 num=Integer.parseInt (keyboard.readLine()); • 读入浮点数 dbnum=Double.parseDouble (keyboard.readLine()) 可以看出,输入操作只能得到字符流 如果要获得数字的输入,还需要自己转换
JAVA输出 • 输出的语句是 • System.out.println(String str); • System.out.print(String str); • System.out.flush(); // 清空缓冲区 • 输出举例 • 字符串输出: System.out.println(“Hello”); • 整数变量输出: System.out.println(“”+i);
综合例子 • 输入一个数字,输出它的2倍,并输出它个位的数字 (ReadWrite.java) • import java.io.*; • public class ReadWrite • { • public static void main(String [] args) throws IOException • { • BufferedReader key=new BufferedReader (new InputStreamReader(System.in)); • String st=key.readLine(); • int num=Integer.parseInt(st); • System.out.println("它的两倍是:"+num*2); • System.out.println("个位是: "+st.charAt(st.length()-1)); • } • }
程序说明 • InputStreamReader 和 BufferedReader 这两个类包含在java.io这个包中 所以程序第一句需要引用这个包 • main 函数定义的最后 throws IOException 这是因为IO输入有可能出错,JAVA要求对错误抛出异常. 如果没有这个部分,编译将不能通过
令牌化输入 • 前面的输入中,只能够每次读入一行 • 如果想输入多个整数(这N个整数可以在一行 内输入并用空格隔开,也可以分行输入,并且这些数字用空格隔开),要怎么做呢 ? • 实现这样的以空格为分界的输入就需要下面的令牌化输入方法 • 令牌的意义我们可以看作是每两个空格分隔符间的字符串 • 令牌化输入由StringTokenizer 这个类实现,它的使用需要引用java.util这个包
其使用方法如下: • 设置一个令牌字符串对象,不断读入 它的 nextToken() 方法可以获得下一个空格以前的字符串 它的hasMoreToken() 方法可以判断还有没有令牌 • 使用: StringTokenizer k; k=new StringTokenizer(keyboard.readLine()); while (输入的停止条件不成立) { number=Integer.parseInt(k.nextToken()); if (!k.hasMoreToken()) k=new StringTokenizer(keyboard.readLine()); }
格式化输出 • 对浮点数进行格式化输出需要使用DecimalFormat类的对象, 它在java.text包中 • 使用方法: • DecimalFormat df=new DecimailFormat(“0.00”); 格式化小数点后2位 • DecimalFormat df=new DecimailFormat(“0.##”);格式化小数点后2位,末尾的0用空格填空 例如 df.format(45.75367) 将会返回 45.75
综合例子 • 不断的输入浮点数字 • 如果输入的数字等于0,则程序结束; • 如果输入的数字不等于0,则将浮点数规范化为2位小数输出 (UseToken.java) • import java.io.*; • import java.util.*; • import java.text.*; • public class UseToken • { • public static void main (String [] args) throws IOException • { • BufferedReader keyboard=new BufferedReader (new InputStreamReader(System.in)); • DecimalFormat df=new DecimalFormat("0.00");
String t; • StringTokenizer k; • k=new StringTokenizer(keyboard.readLine()); • t=k.nextToken(); • while (!t.equals("0")) • { • double num; • num=Double.parseDouble(t); • System.out.println(""+df.format(num)); • if (!k.hasMoreTokens()) • k=new StringTokenizer(keyboard.readLine()); • t=k.nextToken(); • } • } • }
JAVA 中的方法 • 对简单数据类型来说, 以下几点均与C++一致, 不再赘述 • 运算符 ( 包括四则运算、比较运算、优先顺序、强制转换等 ) • 选择结构 (if , if …else , switch) • 循环语句(for, while , do…while, break, continue) • C++中有函数的概念,它可以游离于类之外,而JAVA中不可以存在这样的函数 • C++中的类有成员函数的概念,JAVA中也有, 在JAVA中将其称为“方法”
一些概念 public int absf(float a) { if (a>0) return a; else return -a; } 这是一个JAVA类的方法的例子 我们把其中public int absf(float a)称为方法的“题头”,方法名后面是“形参列表” 题开最开始的地方是限定词,限定词包括3组: • public, private, protected • static, abstract • final 每一组中都可以选择一个加到方法题头前面表示某种意义,具体含义在“类”一章中讲述
JAVA的方法中的参数传递方式 • JAVA参数传递方式是按值传递,程序首先为形参分配一个空间,再把实参复制到形参中 ( 这是跟C++不同的地方,C++可以有按地址传递) • 对于简单数据类型, 在方法中对形参的改变不会影响实参的值 • 对于对象数据类型(引用变量), 形参和实参位于两个不同的内存空间,但是他们都是对同一个对象的引用
JAVA的按值传递带来了一些问题 例如,我们需要写一个方法实现交换2个简单数据类型的整形变量的值, JAVA就没有比较简单的办法. • 下面是我自己写过的一个错误的例子 • 我开始认为对象数据类型是指向类对象的引用, 和C++类似,所以可以采用与C++类似的方法来实现2个数字的交换,于是写了下面一个错误的版本
错误版本 • public class MethodSpecial • { • public static void main(String [] args) • { • Integer A=new Integer(2); • Integer B=new Integer(4); • swap(A,B); • System.out.println("A="+A); • System.out.println("B="+B); • } • static void swap(Integer i,Integer j) • { • Integer k; • k=i; i=j; j=k; • } • }
JAVA将会这样运行程序: • 先生成了A,B的值, 分别是2和4 • swap被调用的时候, 程序首先为形参分配一个空间,再把实参复制到形参中(副本). 此时, i 和A同时指向了Integer(2)的地址, j和B同时指向了Integer(4)的地址, 不过i与A这两变量存放在不同的内存空间, j与B这两变量也存放在不同的内存空间 • swap调用完后, i指向了Integer(4)的地址, j指向了Integer(2)的地址, 这个没有错误, 也没有问题, 不过i的地址并不是A的地址, 所以A,B没有改变过. • 而如果是C++使用指针进行交换, 那么i和A 是属于同一片内存,当i和j的值调换时, 就是调换了A,B的值 ( 即调换了A,B所指向的内存的位置 ) • 区别在于引用 ——在 C++ 中当传递给函数的参数是引用时,传递的就是这个引用,或者内存地址(按引用传递)。在 Java 应用程序中,当对象引用传递给方法的一个参数时,传递的是该引用的一个副本(按值传递),而不是引用本身。 • 实现swap功能的原理如下: 改变形参(同时也是实参)所指向的内存空间的值. 这样,方法调用结束后, 实参所指向的内存空间的值就改变了 • 具体实现的时候, 我们需要自己定义一个类IntClass 来完成任务, 必须自己定义一个类的原因是Integer类没有提供赋值的操作
( MethodSpecial.java) • public class MethodSpecial • { • public static void main(String [] args) • { • IntClass A=new IntClass(2); • IntClass B=new IntClass(4); • swap(A,B); • System.out.println("A="+A.getNum()); • System.out.println("B="+B.getNum()); • } • static void swap(IntClass i,IntClass j) • { • int k; • k=i.getNum(); • i.setNum(j.getNum()); • j.setNum(k); • } • } • class IntClass • { • public int x; • public IntClass(int t) {x=t;} • public int getNum() {return x;} • public void setNum(int t) {x=t;} • }