在具体推广javamfc 对话框 文件拖放放功能问题,怎么解决

java 鼠标拖放文件的实现
在最近作的聊天工具中,希望追加文件传输的功能。基本思想是:将文件或文件夹拖拽到聊天对话框后,释放鼠标激活drop事件后,可以得到被选择的文件或文件夹的信息,以便进行数据的传输。在网络中搜索了一番后,发现有一篇文章非常适合我的需求。下文转自《java 鼠标拖放文件的实现》原文:
/** NewJFrame.java** Created on 日, 上午11:06*/import java.awt.datatransfer.DataFimport java.awt.datatransfer.Timport java.awt.datatransfer.UnsupportedFlavorEimport java.awt.dnd.DnDCimport java.awt.dnd.DropTimport java.awt.dnd.DropTargetDragEimport java.awt.dnd.DropTargetDropEimport java.awt.dnd.DropTargetEimport java.awt.dnd.DropTargetLimport java.io.Fimport java.io.IOEimport java.util.Iimport java.util.Limport javax.swing.JTextA/**** @author Administrator*/public class NewJFrame. extends javax.swing.JFrame. {
/** Creates new form. NewJFrame. */
public NewJFrame() {
initComponents();
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form. Editor.
// &editor-fold defaultstate="collapsed" desc=" 生成的代码 "&
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new MyTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
}// &/editor-fold&
* @param args the command line arguments
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
class MyTextArea extends JTextArea implements DropTargetListener{
public MyTextArea(){
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this);
public void dragEnter(DropTargetDragEvent dtde) {
public void dragOver(DropTargetDragEvent dtde) {
public void dropActionChanged(DropTargetDragEvent dtde) {
public void dragExit(DropTargetEvent dte) {
public void drop(DropTargetDropEvent dtde) {
Transferable tr = dtde.getTransferable();
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
System.out.println("file cp");
List list = (List) (dtde.getTransferable()
.getTransferData(DataFlavor.javaFileListFlavor));
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
File f = (File) iterator.next();
this.setText(f.getAbsolutePath());
dtde.dropComplete(true);
this.updateUI();
dtde.rejectDrop();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (UnsupportedFlavorException ufe) {
ufe.printStackTrace();
// 变量声明 - 不进行修改
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// 变量声明结束
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!豆丁微信公众号
君,已阅读到文档的结尾了呢~~
处理java完成鼠标拖放文件功效[宝典],java面试宝典2014版,java程序员面试宝典,java面试宝典,java完全自学宝典,java开发实战宝典,java web编程实战宝典,java葵花宝典,java宝典,java葵花宝典2014
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
处理java完成鼠标拖放文件功效[宝典]
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口第1章 初识Java 本章学习重点? ? ?Java程序的基本构成 。 Java程序集成开发环境 。 Java Application的一般开发步骤 。 1.1 程序设计语言? ? ? ?机器语言 汇编语言 高级语言 面向对象程序设计语言 机器语言机器语言是机器最终执行时所能识别的二进制 序列,任何其他语言编写的程序最后都要转换 为相应的机器语言才能运行 。 机器语言中的每一条语句实际上是一条二进制 形式的指令代码 。操作码 操作数?? 计算A=15+10 的机器语言程序? ??01111 : 把15放入累加器A中 01010 : 10与累加器A的值相加, 结果仍放入A中
: 结束,停机 汇编语言?为了提高编程效率,将机器指令的代码用英文 助记符来表示,代替机器语言中的指令和数据。 计算 A=15+10 的汇编语言程序? ? ?MOV ADD HLTA,15 A,10:把15放入累加器A中 :10与累加器A相加,结果存入A中 :结束,停机 高级语言?用近似自然语言并按照一定的语法规则来编写 程序的语言,它使程序员可以完全不用与计算 机的硬件打交道,可以不必了解机器的指令系 统,即可进行编程工作,而且效率还要高。 计算 A=15+10 的BASIC语言程序? ? ?A=15+10 PRINT A END‘ 15与10相加的结果放入A中 ‘ 输出A ‘ 程序结束 面向对象程序设计语言? ? ?随着软件业的不断发展,软件规模变得越来越大; Java、C++、Visual Basic和Delphi等应运而生; 将程序设计从结构(具体如函数、方法或过程)化 编程上升到了更高层次的面向对象编程,因而被称 为面向对象程序设计语言。 1.2 Java简介?? ?Java是由美国Sun公司开发的支持面向对象程 序设计的语言,它最大的优势是借助于虚拟机 机制实现的跨平台特性,实现所谓的“Write once,run everywhere”。 易移植性及网络编程使得Java迅速流行起来, 成为一种深受广大开发者喜欢的编程语言。 目前,随着J2ME、J2SE和J2EE的发展, Java已经不仅仅是一门简单的计算机开发语言 了,它已经拓展发展出一系列的业界先进技术。 三种版本???J2ME(Java 2 Micro Edition)是Java的 微型版,常用于嵌入式设备及消费类电器 (如手机等)上的开发。 J2SE(Java 2 Standard Edition)是Java 的标准版,用于针对普通PC的标准应用 程序开发。 J2EE(Java 2 Enterprise Edition)是 Java的企业版,用来针对企业级进行应用 服务的开发。 Java的诞生? ?1990年12月,SUN 公司成立一个叫做Green Team的小组 。 Green Team发表了一款名叫Star Seven(*7) 的机器,它有点像现在我们熟悉的PDA(个人 数字助理),不过它有着比PDA还强大的功能, 比如无线通讯(wireless network)、5寸彩色的 LCD、PCMCIA介面等等。 Java的诞生? ??Java语言的前身Oak就是在那时诞生的,主要的 目的是用来撰写在 star 7上的应用程序。 因为当时Oak要去注册商标时,发现已经有另外 一家公司已经先用了Oak这个名字。Oak这个名 字不能用,那要取啥新名字呢?工程师们边喝着 咖啡讨论着,看看手上的咖啡,突然灵机一动, 就叫 Java好了。就这样它就变成了业界所熟知的 Java了。 在日,JDK(Java Development Kits)1.0a2版本正式对外发表,它标志着Java的 正式诞生。 Java的特点?1. 平台独立性 2. 安全性? ? ?? ?(1)去除指针,避免了对内存的非法访问。 (2)Java是一种强类型的程序设计语言,要求显示的 声明,保证编译器可以提前发现程序错误,提高可靠性。 (3)垃圾自动回收机制让程序员从烦人的内存管理工 作中解脱出来,专注于程序开发;它很好的确保内存管 理的正确性,避免出现“内存泄露”现象。 (4)Java语言提供了异常处理机制。 (5)Java程序运行时,解释器会对其进行数组和字符 串等的越界检查,确保程序安全。 3. 多线程??在DOS年代里,人们一次只能运行一个程序,执 行完才能运行下一个,后来出现了视窗windows 之后,人们可以同时运行几个程序,并在各个运 行程序间做切换,比如一边听音乐一边编辑word 文档。 再后来,为了提高程序的并发性,又引入了线程 的概念,线程也称作轻量级进程,进程是系统分 配资源的基本单位,而线程成为了系统CPU调度 执行的基本单位,一个进程可以只有一个线程, 也可以有多个线程。 4. 网络化?? ?在网络环境中,对象可以在本地或远程机器执行。 Java程序可以通过网络打开和访问对象,就像访 问本地系统一样。 Java语言提供的丰富类库保证了其可以在HTTP、 FTP和TCP/IP协议中良好运行。 Java Applet程序需要客户端浏览器的支持,并且 其是通过标签对&applet&& /applet &将自己嵌入 HTML中。当用户浏览该WEB页时,Java Applet 程序才从服务器端下载到客户端解释执行。因此 也称Java Applet是可移动代码,这种移动性为分 布式程序开发提供了一种新的技术途径。 5. 面向对象? ? ?(1)封闭性 (2)继承性 (3)多态性 Java与其他编程语言间的关系? ? ? ? ? ?C语言适合用来开发系统程序,像很多的操作系统及 驱动程序都是用C来编写的; Fortran适合于用来进行数值计算; Pascal语言结构严谨,适合于做教学语言; Visual Basic和Delphi适合用来开发中小型的应用程 序,C++适合开发大型的应用程序; 而Java适合开发跨平台的应用程序。 每种语言都有其各自的特色,至于选用什么语言作为 开发工具,关键要看任务。只有适合的,没有最好的。 1.3 第一个Java程序?用Java书写的程序有两种类型:Java应用程 序(Java Application)和Java小应用程序 (Java Applet)。public class Hello { public static void main(String args[]) { System.out.println(&Hello,welcome to Java programming.&); } } 图解类名:用户自定义 public class Hello { public static void main(String args[]) { System.out.println(&Hello,welcome to Java programming.&); } } 注意:Java语言是大小写敏感的(a和A是不同的!) 程序中的唯一一 个语句,功能为 将括号中的字符 串进行原样输出简单Java程序的模版如下: public class 类名 { public static void main(String args[]) { //你的程序代码! } } 注意● 类名称后面的大括号标识着类定义的开始和结束, 而main方法后面的大括号则标识方法体的开始和结 束。Java程序中大括号都是成对出现的。 ● 习惯类名的首字母用大写,变量名小写打头。 ● 程序中应适当使用空格符和空白行来对程序语句 元素进行间隔,增加程序的可读性。 ● 在编辑程序时,最好一条语句占据一行。 文件名与public类名在拼写和大小写上必须保持一致。 ● 一个Java Application程序必须定义有且仅有一个 main方法,它是程序的执行入口。 1.4 Java程序开发工具??编写Java源程序的工具软件很多,只要是能编 辑纯文本(注意:word文档不是纯文本)的 都可以,比如notepad(记事本),wordpad (写字板),UltraEidt,EditPlus等等。 对于Java软件开发人员来说,他们一般倾向于 用一些IDE(集成开发环境)来进行程序编写, 以提高效率,缩短开发周期。 IDE介绍? ?(1)Borland 的JBuilder 有人说Borland的开发工具都是里程碑式的 产品,从Turbo C、Turbo Pascal到Delphi、 C++ Builder都是经典,JBuilder是第一个可开 发企业级应用的跨平台开发环境,支持最新的 Java标准,它的可视化工具和向导使应用程序 的快速开发变得可以轻松实现。 IDE介绍? ?(2)IBM 的Eclipse Eclipse是一种可扩展的开放源代码IDE, 由IBM出资组建。Eclipse框架灵活、扩展容易, 因此很受开发人员的喜爱,目前它的支持者越 来越多,大有成为Java第一开发工具之势。 IDE介绍? ?(3)Oracle 的JDeveloper JDeveloper的第一个版本采用的是买的 JBuilder的代码设计的,不过已经完全没有了 JBuilder的影子了,现在JDeveloper不仅仅是 很好的 Java 编程工具,而且是 Oracle Web 服务的延伸。 IDE介绍? ?(4)Symantec公司的Visual Cafe for Java 很多人都知道Symantec公司的安全产品, 但很少人知道Symantec的另一项堪称伟大的 产品:Visual Cafe,有人认为Visual Cafe如 同当年Delphi超越Visual Basic一样,今天, 它也超越了Borland 的Delphi。 IDE介绍? ?(5)IBM 的Visual Age for Java 一款非常优秀的集成开发工具,用惯了微 软开发工具的朋友在开始时可能会感到非常不 舒服,因为Visual Age for Java采取了与微软 截然不同的设计方式,为什么会这样呢?那是 因为蓝色巨人怎么能跟着微软的指挥棒转呢?! IDE介绍? ?(6)Sun公司的NetBeans 与Sun Java Studio 5 以前叫Forte for Java,现在Sun将其统一 称为Sun Java Studio 5,出于商业目的Sun将 这两工具合在一起推出,不过他们的侧重点是 不同的。 IDE介绍? ?(7)Macromedia公司的JRUN 提起Macromedia公司你肯定知道Flash、 PhotoShop,但很少人知道他还有一款出色的 Java开发工具JRUN,JRun是第一个完全支持 JSP 1.0 规格书的商业化产品。 JDK?综上,我们看到可以用来开发Java的利器很多, 它们仅仅是集成的开发环境,而在这些环境中, 其实有一样东西是共同的,也是最核心和关键的, 那就是JDK(Java Development Kits),中文意 思是Java开发工具集,JDK是整个Java的核心, 包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 (rt.jar)等,所有的开发环境都需要围绕它来进行, 缺了它就什么都做不了。 建议??对于初学者而言,我们的建议是:JDK+记事 本就OK了!因为掌握JDK是学好Java的第一 步也是最重要的一步。 首先用记事本来编辑源程序,然后再利用JDK 来编译、运行Java程序。这种开发方式虽然简 陋,但却是大家学好Java语言本身的好途径。 1.5 Java程序开发步骤? ??软件安装 最主流的JDK是Sun公司发布的JDK,因此本书采 用Sun的JDK,它可以从Sun公司的网站上 (http://java.sun.com)免费下载。 对于普通Java开发人员和一般学习者来说,选用 标准版J2SE就可以了,学会了J2SE,再学J2ME 或J2EE就比较容易上手,因为它们之间虽有所侧 重,但相似之处很多,尤其是语言本身是一样的, 都是Java。 软件安装?这里我们采用J2SE 1.4的版本,从网络上下载到 j2sdk-1_4_0_03-windows-i586.exe这个安装软件 (注意:安装软件必须是针对windows平台上的, 不要下错了,因为Sun网站上也提供了其他平台 的安装包,如针对Linux等的),下面就可以开始 安装了。 软件安装??安装工作实际上分为两个步骤。安装程序首先会收集 一些信息,用于安装的选择,然后才开始拷贝文件, 设置Windows注册表等具体的安装工作。安装过程中, 读者只需按照提示一步一步操作即可,假定我们的安 装目录设置为C:\jdk1.4(注意:后面配置环境变量时 要用到)。 安装完毕后,切换至C:\jdk1.4目录,我们可以发现有 一些子目录。 安装目录信息(1)“bin”文件夹 “bin”文件夹中包含编译器(javac.exe)、解释器 (java.exe)、Applet 查看器(appletviewer.exe) 等Java命令的可执行文件。?? 安装目录信息? ? ??(2)“demo”文件夹 “demo”文件夹中包含一些源代码的程序示例。 (3)“lib”文件夹 “lib”文件夹存放一系列类库。 (4)“jre”文件夹 “jre”文件夹存放Java运行时可能需要的一些 可执行文件和类库。 (5)“include”文件夹 该文件夹存放一些头文件。 环境变量配置?环境变量的配置主要是为了进行“寻径”,也即 让程序能找到它需要的文件,所以设置的内容就 是一些路径。在Windows操作系统中环境变量的 设置操作如下: ? ?需要配置两个用户变量:path和classpath 新建(若无)classpath用户变量,设置变量值为 “C:\jdk1.4\lib”,此外,当运行自己编写的Java 程序时,一般还需要将相应的工作目录也添加到 classpath的变量值中,以便程序运行时能找到所 编写的Java类。 编译运行? ? ? ??设置好环境变量后,就可以在Dos命令行模式下进行编 译和运行操作。 下面假定程序Hello.java存放在“F:\工作目录”路径 ; 打开Dos命令窗口进入到工作目录,然后再运行“javac Hello.java”命令 ; 源程序编译成功,系统自动在工作目录下生成一个字节 码文件Hello.class,这是一个二进制格式的文件,供解 释运行时用; 编译成功后,就可以进行程序的运行了。运行Java程序 的命令为“java Hello”。 提示? ??不以.java为扩展名的源程序文件是一个错误 。 开发Java程序时,开发人员必须用到JDK,而运 行或使用Java程序时,用户则只需要有JRE (Java Run-time Environment)Java运行时环境 即可。 一般在装JDK时,JRE也跟着一起安装了,因此 对于不开发Java程序的普通用户来说,只要到网 络上下载专门的JRE软件进行安装,即可运行 Java程序。 作业? ? ? ? ? ?1 3 4 6 8 9 第2章 Java基础语法 本章学习重点? ? ? ?Java语言的基本语法 。 变量的含义 。 数据类型 。 程序语句 。 2.1 引言?每一个Java程序都是按照一定规则编写而成, 这些规则一般称之为程序语法,只有语法正确 了,程序才能通过编译系统的编译,进而也才 能被计算机加以执行,本章重点介绍Java程序 的基本概念和语法。 符号? ? ?1. 基本符号元素 2. 关键字 3. 标识符 基本符号元素? ? ? ? ? ? ? ?字母:A-Z,a-z,美元符号$和下划线(__)。 数字:0-9。 算术运算符:+,-,*,/,%。 关系运算符:&,&=,&=,!=,==。 逻辑运算符:!,&&和||。 位运算符:~,&,|,^,&&,&&,&&&。 赋值运算符:=。 其他符号:(),[],{}等等。 关键字??关键字是Java语言本身使用的标识符,有其特 定的作用。所有的Java关键字将不能被用作用 户的标识符,关键字用英文小写字母表示。 初学者不必刻意记忆以上关键字,在以后的使 用过程中,自然会逐步掌握的。 标识符???本书中,标识符特指用户自定义的标识符。在Java语 言中,标识符必须以字母、美元符号或者下划线打头, 后接字母、数字、下划线或美元符号串。另外,Java 语言对标识符的有效字符个数不做限定。 合法的标识符: a,b,c,x,y,z,result,sum,value,a2,x3, _a,$b等。 非法的标识符: 2a,3x,byte,class,&a,x-value,new,true, @www等。 标识符命名约定(1)一般标识符定义应尽可能“达意”, 如value,result,number,getColor, getNum,setColor,setNum等。 ? (2)final变量的标识符一般全大写, 如final double PI=3.1415。 ? (3)类名一般用大写字母打头, 如Test,Demo。? 分隔符空白符在程序中主要起间隔作用,没有其 他的意义。空白符包括空格、制表符、回 车和换行符等,程序各基本元素间通常用 一个或多个空白符进行间隔。?1. 空白符?2. 可见分隔符可见分隔符也是用来间隔程序基本元素的, 这一点同空白符类似,但是不同的可见分 隔符有不同的用法。Java语言中,主要有 六种可见分隔符 六种可见分隔符? ? ? ? ? ?(1)“//” (2)“/* ”和“*/” (3)“;” (4)“,” (5)“:” (6)“{”和“}” 常量?Java程序中使用的直接量称为常量,它 是用户在程序中“写死”的量,这个量 在程序执行过程中都不会改变,也称最 终量(用final标识的量)。 布尔值??布尔类型的取值范围就是true或false两个值, 因而其常量值只能是true或false,而且true或 false只能赋值给布尔类型的变量。 不过,Java语言还规定布尔表达式的值为0可 以代表false,而1(或其他非0值)则表示true。 2. 整数值? ??整数常量在程序中经常出现,习惯以十进制表示,如10、 100等。 如八进制或十六进制进行表示,用八进制时,需在数字 前加0示意,而十六进制加0x(或0X)标识,譬如010 (十进制值8)、070(十进制值56)、0x10(十进制 值16)、0Xf0(十进制值240)。 程序中出现的整数值默认分配四个字节的空间进行存储, 即其数据类型为int,但当整数值超出int的取值范围(详 见书上表3-1)时,系统则自动用八个字节空间来存储, 即其类型为long型,若要系统将数值不大的整数常量也 用long类型来存储,可以在数值后添加L (或小写l)后 缀,如22L。 3. 浮点数? ? ?浮点数即通常所说的实数,它包含有小数点,可以用两 种方式进行表示:标准式和科学记数式。 标准式是由整数部分、小数点和小数部分构成,如1.5、 2.2、80.5等都是标准式的浮点数。 科学记数法由一个标准式跟上一个以10为底的幂构成, 两者间需有E(或e)间隔开,如1.2e+6、5e-8和3E10 等都是以科学记数法表示的浮点数。在程序中,一般浮 点数的默认数据类型为double,即用8个字节空间来存 放,当然也可以用F(或f)后缀来限定其类型为float, 如55.5F、22.2f等。 4. 字符常量?字符常量是指用一对单引号括起来的字符,如‘A’、 ‘a’、‘1’、和‘*’等,事实上,所有的可见Ascii码 字符都可以用单引号括起来作为字符常量。 此外,Java语言还规定了一些转义字符,这些转义字 符以反斜杠打头,将其后的字符转变为另外的含义。 需要注意的是,反斜杠后的数字表示Unicode字符集 的字符,而不是Ascii码字符集。?? Java转义字符表转义字符 \xxx \uxxx \' \& \r \\ \n \b \f \t 描述 1到3位八进制数所表示的字符(xxx) 1到4位十六进制数所表示的字符(xxxx) 单引号字符 双引号字符 回车 反斜杠 换行 退格 换页 跳格 5. 字符串常量?System.out.println(&Hello,welcome to Java programming.&);? ? ? ? ? ? ?上述语句中,用双引号括起来的就是字符串常量,再比 如: &Nice to meet you! & &Y\t-& (¥) &1\n2\n3 & (1、2、3各占据一行) 尤其需要注意的是,单个的字符加上双引号也是字符串 常量,如: &N& (字符串常量) 'N' (字符常量) 字符串常量一般都是用来给字符串变量赋初值的。 变量? ?? ?在程序执行过程中其值可以改变的数据,称为变量。 每个变量都必须有对应的名称来标识它,即变量名。变 量名由程序设计者自己命名,但要注意必须是合法的标 识符。 另外,为了提高程序可读性,一般都会根据变量意义或 特征取对应英文单词或简写等。 根据变量数据的特点,决定其数据类型,在Java中,一 个变量只能属于某种确定的数据类型,并且在定义该变 量时就要给出声明,这样就确定了该变量的取值范围, 同时也确定了对该变量所能执行的操作或运算。 八种基本的数据类型? ? ? ?整型: byte、short、int、long 实型: float和double 布尔型: boolean 字符型: char 变量定义? ? ? ? ? (存放某人的年龄) (存放某大学人数) (存放某人性别) (存放某帐户的余额) (存放布尔值)变量一经定义,系统将为其分配一定长度的内存存储空 间,在程序中使用到该变量时,就需要在对应的内存中 进行读数据或写数据,通常称这种操作为对变量的访问。 final变量final变量的定义形式与普通变量一样,但其所起作用 却是类似于前面讲的常量。 ? 定义final变量的方式有两种: 1. 定义的同时初始化 final double PI = 3.14; 2. 先定义后初始化 final double PI ; … PI = 3.14; …? 提示??在程序设计时,一般建议将程序中多次要用到 的常量值定义为final变量,这样在程序中就可 以以final变量名来引用该常量值,以减少程序 的出错概率,同时将来若常量值发生变化时也 好调整。 final变量与普通变量的本质区别是:后者在初 始化后仍能对其进行赋值,而前者在初始化后 就不能再被赋值。 变量类型转换??一般情况下,各种数据类型的变量间最好不要 互相串用,但是在特定的情况下,存在进行变 量类型转换的需要。 比如将一个int类型的值赋给long类型变量,或 将一个double类型的值赋给float类型变量。前 者的转换不会破环原有值,这种转换一般系统 会自动进行,而后者的转换很可能会破环原有 值,这种转换需要程序员在程序中明确指出, 即进行强制转换。 类型转换long a = 10; (常量10的默认类型为int,系统会自动将其转 换为long类型并存至a中) ? float f = 11.5; b = (short)f; (强制转换)? 2.2 基本数据类型数据类型名称 布尔型 整型 数据类型标识 占据存储空间 boolean byte short int long 浮点型 字符型 float double char 1bit 8bits(1Byte) 16bits(2Bytes) 32bits(4Bytes) 64bits(8Bytes) 32bits(4Bytes) 64bits(8Bytes) 16bits(2Bytes) 取值范围 true(非0),或false (0) -128 ~ +127 -32768 ~ +32767 -21亿 ~ +21亿 -9.2×1018 ~ +9.2×1018 7位精度 15位精度 Unicode字符 布尔型??布尔类型用关键字boolean来标识,其取值范围就是: true(逻辑真)和false(逻辑假),是最简单的数据 类型。 布尔类型的数据可以参加逻辑运算,并构成逻辑表达 式,其结果也是布尔值,常用来作为分支、循环结构 中的条件表达式。boolean flag1 = boolean flag2 = 3&5; boolean flag3 = 1; 整型? ? ? ?1. 2. 3. 4.byte short int long 【例2-1】数据溢出演示。 public class Test { public static void main(String[] args) { byte a = 20; short b = 20000; short c = 200000; System.out.println(&清华大学的院系数量:&+a); System.out.println(&清华大学的在校生人数:&+b); System.out.println(&海淀区高校在校生总人数:&+c); } } 【例2-2】演示常量的不同进制表示。 public class Test { public static void main(String[] args) { byte a = 10; //十进制 short b = 010; //八进制 int c = 0x10; //十六进制 System.out.println(&a的值:&+a); System.out.println(&b的值:&+b); System.out.println(&c的值:&+c); } } 浮点型【例2-3】演示单精度浮点型的使用。 public class Test { public static void main(String[] args) { float pi = 3.1415f; float r =6.5f; float v = 2*pi*r; System.out.println(&该圆周长为:&+v); } } 【例2-4】演示双精度浮点型的使用。 public class Test { public static void main(String[] args) { double pi = 3.; double r =6.5; double v = 2*pi*r; System.out.println(&该圆周长为:&+v); } } 字符型? ??Java语言用Unicode字符集来定义字符型,一个字符 占用两个字节的存储空间,这与C/C++不同。 前面已经介绍过字符常量,下面再来看看字符型的变 量定义: //定义字符型变量ch ch = ‘1’; //给ch赋初值为‘1’ 字符型变量在程序常被用作代号,比如ch为‘1’代表 成功,为‘0’代表失败;为‘F’表示女性,为‘M’表 示男性等。在具体进行程序设计时,应注意灵活应用。 2.3 程序语句? ? ? ?赋值语句 条件表达式 运算 复合语句 赋值语句? ?? ? ? ? ? ?赋值语句的一般形式为: variable = 在这里“=”不是数学中的等号,而是赋值运算符,其 功能是将右边表达式的值赋(即传递或存入)给左边 的变量,例如: int i,j; char c; i = 100; c = ‘a’ j = i +100; i = j * 10; 自增自减语句??特别地,对于形如i=i+1;这样的赋值语句, 可以将其简写为i++;或者++i,并称之为自增 语句,同样还有自减语句i--;或者--i;,它们 等价于i=i-1;语句。 我们把“++”和“--”叫做自增和自减,它们写 在变量的前面与后面有时是有区别的! 【例2-5】自增赋值语句。 public class Test { public static void main(String[] args) { int i, j , k = 1; i = k++; j = ++k; System.out.println(&i=&+i); System.out.println(&j=&+j); } } 复合赋值语句的复合赋值运算? ? ? ? ?+= 加后赋值 -= 减后赋值 *= 乘后赋值 /= 除后赋值 %= 取模后赋值 【例2-6】复合赋值语句。 public class Test { public static void main(String[] args) { int i=0, j=30 , k = 10; i += //相当于 i = i+k; j -= //相当于j=j-k; i *= //相当于i=i*k; j /= //相当于j=j/k; k %=i+j; //相当于k=k%(i+j); System.out.println(&i=&+i); System.out.println(&j=&+j); System.out.println(&k=&+k); } } 条件表达式?条件表达式的一般形式为: Exp1?Exp2:Exp3 首先计算Exp1,当表达式Exp1的值为true时,计算表 达式Exp2并将结果作为整个表达式的值,当表达式 Exp1的值为false时,计算表达式Exp3并将结果作为整 个表达式的值。? 【例2-7】条件表达式示例。public class Test { public static void main(String[] args) { int i, j=30 , k = 10; i = j==k*3?1:0; System.out.println(&i=&+i); } } 运算(1)算术运算 ? Java的算术运算有加(+)、减(-)、 乘(*)、除(/)和取模(%)运算。 ? 3/2 结果为1 ? 3/2.0 结果为1.5 ? 5%2 结果为1 ? 11%3结果为2 (2)关系运算关系运算的结果为布尔值,即true或false Java语言中共有六种关系运算:– – – – – –&(大于) &=(大于等于) &(小于) &=(小于等于) = =(等于) ! =(不等于) 【例2-8】关系运算示例。 public class Test { public static void main(String[] args) { int i=0, j=30 , k = 10; boolean b1,b2,b3; b1 = i&k; b2 = i&=j; b3 = j/3!=k; System.out.println(&b1=&+b1+&,b2=&+b2+&,b3=&+b3); } } (3)逻辑运算x y false true true false x&& y false true false false x||y true true true false !x false false true true?Java语言中有三种逻 辑运算:&&(与)、 ||(或)、!(非),参 与逻辑运算的操作数 为布尔类型值,最终 结果也为布尔值。true true false false (4)位运算运算符 用法 ope1 &ope2 ope1 |ope2 ~ ope1 ope1 ^ope2 ope1&&ope2 ope1&&ope2 ope1&&&ope2 功能 按位与 按位或 按位取反 按位异或 左移 带符号右移 不带符号右移?位运算指的是对二进 制位进行计算,其操 作数必须为整数类型 或者字符类型。& | ~ ^ && && &&& 复合语句??语句是程序的基本元素,任何单独的一条语句都 可以称之为简单语句,而复合语句是指由一条或 多条的语句构成的语句块。 在Java语言中,复合语句是用大括号括起来的, 可以将其从整体上看成是一条语句,复合语句主 要用于流程控制结构中,如分支,循环等,它体 现的是程序的一种结构性或者说是局部性,复合 语句所包含的语句们要么都执行,要么都不执行, 或者都被重复执行若干次。 2.4 应用举例【例2-9】分析以下程序有哪些错误。 public class Test { public static void main(String[] args) { short i, i = 50000; j = 2.5; System.out.println(&i=&+i+&, j=&+j); } } ?【例2-10】假设整型变量x的当前值为2,则复合 赋值语句x/=x+1执行后x值为多少?【例2-11】分析以下程序段的功能。 int x,y,z, … //x,y,z分别被赋值 result = (x&y)?x:y; result =(result&z)?result:z; 作业? ? ? ? ? ? ?1 2 3 4 6 8 9 第3章 分支结构 本章学习重点? ? ? ?复合语句。 if语句 。 if-else语句 。 switch语句 。 3.1 复合语句? ??在Java语言中,有简单语句和复合语句之分。 一条简单语句总是以分号结束,它代表一个要 执行的操作,可以是赋值、判断或者跳转等语 句,甚至还可以是只有分号的空语句(;), 空语句表示不需要执行任何的操作。 而复合语句则是指用大括号括起来的语句块 (block),它一般由多条语句构成,但也允 许只有一条简单语句。 复合语句格式如下: { 简单语句1; 简单语句2; … 简单语句n; } ? 比如以下例子均为复合语句: { a = 1; b = 2; } 或 { S = 0; }? ?? ??复合语句在后面的流程控制结构中经常要用到,比如 需要多个语句作为一个“整体语句”出现时就必须用 大括号将其括起来作为一条复合语句。 Java程序的语句流程可以分为以下三种基本结构: 顺序结构、分支(选择)结构以及循环结构。 对于分支结构和循环结构,当条件语句或者循环体语 句多于一条时,必须采用复合语句的形式,即用大括 号将其括起来,否则系统将默认条件语句或循环体语 句仅有一条,即最近的那一条。 反过来说,当条件语句或者循环体语句只有一条时, 则可用可不用大括号{},这点请初学者学习后面内 容时注意留心。 3.2 顺序结构??由赋值语句以及输入输出语句构成的程序, 只能按其书写顺序自上而下,从左到右依 次执行,将此类程序结构称为顺序结构。 它是最简单的程序结构,也是计算机执行 的最一般流程。 【例3-1】交换两变量的值。 public class Test { public static void main(String[] args) { int a=5,b=8,c; System.out.println(&a,b的初始值&); System.out.println(&a=&+a); System.out.println(&b=&+b); c = a = b = System.out.println(&a,b的新值&); System.out.println(&a=&+a); System.out.println(&b=&+b); } } 【例3-2】已知三角形的三条边长,求它的面积。 提示:面积 = s( s ? a)( s ? b)( s ? c) 其中, s =a+b+c 2public class Test { public static void main(String[] args) { double a=3,b=4,c=5,s; //三角形的三条边 //三角形的面积 s = (a+b+c)/2; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); System.out.println(&该三角形的面积为:&+area); } } 3.3 分支结构?? ?分支结构也叫选择结构,分支结构表示程序中存在分 支语句,这些语句根据条件的不同,将被有选择地加 以执行(取决于条件表达式的取值情况)。 分支结构:单分支、双分支和多分支结构。 Java语言的单分支是if语句,双分支是if-else语句,多 分支是switch语句,实现时,也可以用switch语句构成 双分支结构,或者用if-else语句嵌套构成多分支结构。 单分支条件语句?单分支条件语句的一般格式是: if (布尔表达式) { 布尔表达式 语句; true 语句 }false int i=0,j=0; if (i!=j) { i++; j++; }int i=0,j=0; if (i!=j) i++; j++;int i=0,j=0; if (i!=j) i++; j++; 【例3-4】乘坐飞机时,每位顾客可以免费托运20kg 以内的行李,超过部分假定按每公斤收费1.2元的话, 试编写相应计算收费的程序。?(1)数据变量: w -----行李重量(以公斤为单位) fee-----收费(单位元) 根据数据的特点,变量的数据类型必须为浮点 型,不妨定为float类型。 ?(2)算法: 0 fee = 1.2 * (w-20)w &= 20 w & 20(3)由System.out.println();语句提示用户输入数 据(行李重量),然后通过利用前述的交互式输 入方法给w变量赋值。 ?(4)由单分支结构,构成程序段即对用户敲 入的数据进行判断,并按收费标准计算收费额。 程序段局部如下: . . . fee = 0; if (w&20) fee = 1.2 * (w-20); . . . import java.io.*; public class Test { public static void main(String[] args) throws IOException { float w, //以下代码为通过控制台交互输入行李重量 InputStreamReader reader=new InputStreamReader(System.in); BufferedReader input=new BufferedReader(reader); System.out.println(&请输入旅客的行李重量:&); String temp=input.readLine(); w = Float.parseFloat(temp); //字符串转换为单精度浮点型 fee = 0; if ( w & 20) fee = (float)1.2 * (w-20); System.out.println(&该旅客需交纳的托运费用:&+fee+&元&); } } 【例3-5】根据年龄,判断某人是否为成年。 public class Test { public static void main(String[] args) { byte age=20; if (age&=18) System.out.println(&成年&); if (age&18) System.out.println(&未成年&); } } 【例3-6】已知鸡和兔的总数量,以及鸡兔脚的总数, 求鸡和兔各自的数量。 public class Test { public static void main(String[] args) { double chick, short heads=10,feet=32; chick = (heads*4-feet)/2.0; rabbit = heads - if (chick==(short)chick && chick&=0 && rabbit&=0) { System.out.println(&鸡有&+chick+&只&); System.out.println(&兔有&+rabbit+&只&); } } } 双分支条件语句?Java语言的双分支结构由if-else语句实现,一 般格式如下:if (布尔表达式) { 语句1; } else { 语句2; }true false布尔表达式语句1语句2 int i=0,j=0; if (i==j) { i++; j++; } else { i--; j--; }int i=0,j=0; if (i==j) { i++; j++; } else i--; j--;int i=0,j=0; if (i==j) i++; j++; else { i--; j--; } 【例3-7】鸡兔问题的改进。 public class Test { public static void main(String[] args) { double chick, short heads=10,feet=33; chick = (heads*4-feet)/2.0; rabbit = heads - if (chick==(short)chick&&chick&=0&&rabbit&=0) { System.out.println(&鸡有&+chick+&只&); System.out.println(&兔有&+rabbit+&只&); } else { System.out.println(&数据输入可能有误!&); } } } 【例3-8】根据年龄,判断某人是否为成年,用双分支实现。 public class Test { public static void main(String[] args) { byte age=20; if (age&=18) System.out.println(&成年&); else System.out.println(&未成年&); } } 【例3-9】判断2020的奇偶性,并进行输出? public class Test { public static void main(String[] args) { short n = 2020; if (n%2==0) System.out.println(&2020是偶数。&); else System.out.println(&2020是奇数。&); } } ? ?【例3-10】判断并输出2020年是否为闰年? 闰年的判断是能被4整除但又不能被100整除,或能 被400整除的公元年,因此闰年的判断可以用一个布尔表 达式来实现。public class Test { public static void main(String[] args) { boolean leapY short year = 2020; leapYear = (year%4==0&&year%100!=0) || (year%400==0); if (leapYear) System.out.println(&2020是闰年。&); else System.out.println(&2020不是闰年。&); } } 分支结构嵌套?? ?Java语言允许对if-else条件语句进行嵌套使用。 前述分支结构的语句部分,可以是任何语句 (包括分支语句本身),我们把分支结构的语 句部分仍为分支结构的情况,称为分支结构嵌 套。 构造分支结构嵌套的主要目的是解决条件判断 较多,较复杂的一些问题。 常见的嵌套结构如下所示: if (布尔表达式1) if (布尔表达式2) 语句1;if (布尔表达式1) 语句1; else if (布尔表达式2) 语句2; else 语句3;if (布尔表达式1) if (布尔表达式2) 语句1; else 语句2; else 语句3; 请分析以下分支嵌套程序段执行后的输出结果。int i=1,j=2; if (i!=j) --------① { if (i&j) --------② i--; --------③ else j--; --------④ System.out.println(“i=”+i+”,j=”+j); --------⑤ } else System.out.println(“i=”+i+”,j=”+j); --------⑥ ... --------⑦ 【例3-11】根据某位同学的分数成绩,判断其等级:优秀(90分以 上);良好(80分以上90分以下);中等(70分以上80分以下); 及格(60分以上70分以下);不及格(60分以下)。 public static void main(String[] args) throws IOException { InputStreamReader reader=new InputStreamReader(System.in); BufferedReader input=new BufferedReader(reader); System.out.println(&请输入分数:&); String temp=input.readLine(); score = Float.parseFloat(temp); if ( score & 90) if ( score & 80) if ( score & 70) if ( score & 60) System.out.println(&该同学的分数等级为:不及格&); else System.out.println(&该同学的分数等级为:及格&); else System.out.println(&该同学的分数等级为:中等&); else System.out.println(&该同学的分数等级为:良好&); else System.out.println(&该同学的分数等级为:优秀&); } 【例3-13】假定个人收入所得税的计算方式如下:当收入额小于等 于1800元时,免征个人所得税;超出1800元但在5000元以内的部 分,以20%的税率征税;超出5000元但在10000元以内的部分,按 35%的税率征税;超出10000元的部分一律按50%征税。试编写相 应的征税程序。double income, … … tax = 0; if ( income &= 1800) System.out.println(&免征个税.&); else if (income&=5000) tax = (income-; else if (income&=10000) tax = ()*0.2+(income-; else tax = ()*0.2+()*0.35 +(income-1; System.out.println(&您的个人收入所得税额为:&+tax); if ( income &= 1800) System.out.println(&免征个税.&); else if (income&=5000) tax = (income-; else if (income&=10000); tax = ()*0.2+(income-; else tax = ()*0.2+()*0.35+(income-1; switch语句?Java语言多分支结构的实现语句是switch, switch语句的一般语法格式如下:switch(表达式) { case 判断值1: case 判断值2: ... case 判断值n: [default: } 语句n; 语句1; 语句2;语句n+1;] switch语句? ???表达式的值必须为有序数值(如整型数或字符等),不能为 浮点数。 case语句中的判断值则须为常量值,也可称之为标号,它 代表一个case分支的入口,每一个case分支后面的语句可 以是单条的,也可以是多条的,并且当有多条语句时,不需 要加大括号{}将其括起来。 default子句是可选的,并且其位置必须在switch结构的末尾, 当表达式的值与任何case常量值均不匹配时,就执行 default子句,然后就退出switch结构了。 若表达式的值与任何case常量值均不匹配,且无default子 句,则程序不执行任何操作,直接跳出switch结构,继续后 续的程序。 【例3-14】在控制台敲入0至6的数字,输出对应的星期数 (0对应星期天,1对应星期一,依此类推)。 public static void main(String args[])throws IOException { System.out.print(&请输入星期数(0-6):&) ; day=(int)(System.in.read())-'0'; switch(day) { case 0: System.out.println(day +&表示是星期日&); case 1: System.out.println(day +&表示是星期一&); case 2: System.out.println(day +&表示是星期二&); case 3: System.out.println(day +&表示是星期三&); case 4: System.out.println(day +&表示是星期四&); case 5: System.out.println(day +&表示是星期五&); case 6: System.out.println(day +&表示是星期六&); default: System.out.println(day+&是无效数!&) ; } } switch(day) { case 0: System.out.println(day +&表示是星期日&); case 1: System.out.println(day +&表示是星期一&); case 2: System.out.println(day +&表示是星期二&); case 3: System.out.println(day +&表示是星期三&); case 4: System.out.println(day +&表示是星期四&); case 5: System.out.println(day +&表示是星期五&); case 6: System.out.println(day +&表示是星期六&); default: System.out.println(day+&是无效数!&) ; } 使用switch结构时应注意的问题??(1)允许多个不同的case标号执行相同的一 段程序,比如以下情形: ... case 常量i: case 常量j: 语句; break; ... (2)每一个case子句的常量值必须各不相同。 作业? ? ?1 2 7 第4章 循环结构 本章学习重点? ? ? ?while、do-while以及for语句 。 跳转语句break和continue 。 分支及循环结构的嵌套编程 。 较复杂程序的执行流程分析 。 4.1 循环结构?? ? ?在进行程序设计时,经常会碰到一些计算并不 很复杂,但却要重复进行相同的处理操作的问 题。比如: (1)计算累加和1+2+3+…+100。 (2)计算阶乘,如10!。 (3)计算一笔钱在银行存了若干年后,连本 带息有多少? ?问题(1),用一条语句:sum = 1+2+3+…+100 来求解,则赋值表达式太长,?改成多条赋值语句:sum +=1; sum +=2; sum +=3; …; sum +=100;也不行,即便加到100那也 有100条语句,程序过于臃肿,不利编辑、存储 和运行。 ?Java语言引入三种语句:while、do-while以及for 来解决这类问题。我们把这类问题的结构称为循 环结构,把这三种实现语句称为循环语句。 这三种循环语句的流程图如下所示:表达式1 条件表达式 循环体?true循环体false true条件表达式条件表达式2falsetrue循环体 表达式3false (a)while语句 (b)do-while语句(c)for语句 while语句?while语句的一般语法格式如下: while(条件表达式) { 循环体;} while是关键字,首先计算条件表达式的值,若为true则 执行循环体,然后再计算条件表达式的值,只要是true 就循环执行,直到布尔值为false才结束退出while结构。 循环体可以是复合语句、简单语句甚至是空语句, 一般情况下,循环体中应包含有能修改条件表达式取值 的语句,否则就容易出现“死循环”(程序毫无意义地 无限循环下去)。 例如:while(1);这里,循环体为一空语句,而条件 表达式为一常量1(Java语言里,0代表false,非0为 true),因此这是一死循环。 (1)存放累加和的变量初始值一般赋值为0。 (2)变量i既是累加数,同时又是控制变量(控制循环体的循环次数)。 (3)循环体语句sum+=i; i++; 可以合并简写为:sum+=i++; 但对于初学者而言,不建议这么写。 (4)while循环体语句多于一条,因而必须以复合语句形式出现,千万别 漏了大括号。 【例4-1】利用while语句实现1到100的累加。 public static void main(String[] args) { int sum=0; //累加和变量sum int i=1; // 控制变量i while(i&=100) { sum+=i; i++; } System.out.println(&累加和为:&+sum); } 本程序需要注意的要点有: (1)求阶乘的积时,变量jc初始值应为1。 (2)由于阶乘的积,数值往往比较大,因此要注意防止溢出, 比如尽量选用取值范围大的长整型long。【例4-2】利用while语句求10的阶乘。 public class Test { public static void main(String[] args) { long jc=1; int i=1; while(i&=10) { jc*=i; i++; } System.out.println((i-1)+&!结果:&+jc); } } 【例4-4】有一条长的阶梯,如果每步2阶,则最后剩1阶 ,每步3阶则剩2阶,每步5阶则剩4阶,每步6阶则剩5阶, 只有每步7阶的最后才刚好走完,一阶不剩,问这条阶梯 最少共有多少阶? public class Test { public static void main(String[] args) { int i=1; while(!(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0)) { i++; } System.out.println(&这条阶梯最少有:&+i+&阶&); } } ?假如现在想算出在1万个阶梯内,都有哪些 阶梯数满足题意的话,可以这样改写程序中 的while结构:while(i&=10000) { if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) System.out.print(i+&阶 &); i++; }??新程序运行结果如下:119阶 329阶 539阶 749阶 959阶 1169阶 1379阶 1589阶 1799阶 2009阶 2219阶 2429阶 2639阶 2849阶 3059阶 3269阶 3479阶 3689阶 3899阶 4109阶 4319阶 4529阶 4739阶 4949阶 5159阶 5369阶 5579阶 5789阶 5999阶 6209阶 6419阶 6629阶 6839阶 7049阶 阶 7679阶 7889阶 8099阶 8309阶 8519阶 8729阶 8939阶 9149阶 9359阶 9569阶 9779阶 9989阶 do-while语句?do-while语句的语法格式如下: do { 循环体; }while(条件表达式); 【例4-5】假定在Bank中存款额5000元,按6.25%的年利率计算,试问 过多少年后 就会连本带利翻一翻?试编程实现之。public class Test { public static void main(String[] args) { double m=5000.0; //初始存款额 double s=m; //当前存款额 int count=0; // 存款年数 do { s=(1+0.0625)*s; count++; }while(s&2*m); System.out.println(count+&年后连本带利翻一翻!&); } } for语句?for语句的一般语法格式如下:for(表达式1;条件表达式2;表达式3) { 循环体; }?表达式1一般用来给循环控制变量赋初值,它仅在刚开始时被执行 一次,以后就不再被执行。 表达式2是一个条件表达式,根据其取值的不同,决定循环体是否 被执行,若为true,则执行循环体,然后再执行表达式3。 表达式3通常用作修改循环控制变量之用,,接着又判断条件表达 式2的布尔值,若还为true,则继续上述循环,直至布尔值变为 false。?? 【例4-6】利用for语句实现1到100的累加。public class Test { public static void main(String[] args) { int sum=0; //累加和变量sum for(int i=1; i&=100;i++) // 控制变量i { sum+=i; } System.out.println(&累加和为:&+sum); } } 【例4-7】假定在Bank中存款额5000元,按6.25%的 年利率计算,试问过多少年后就会连本带利翻一翻? 试用for语句编程实现之。 public class Test { public static void main(String[] args) { double m=5000.0; //初始存款额 double s=m; //当前存款额 int count=0; // 存款年数 for(;s&2*m;s=(1+0.0625)*s) count++; System.out.println(count+&年后连本带利翻一翻!&); } } 4.2 循环嵌套?当循环体语句又是循环语句时,就构成了循环嵌 套,即多重循环,循环嵌套可以是两重的、三重 的甚至更多重(较复杂的算法)。【例4-8】编程实现打印以下图案: * *** ***** ******* ********* *********** * *** ***** ? ******* ********* ***********public class Test { public static void main(String[] args) { int i,j; // i控制行数, j控制*的个数 for(i=1;i&=6;i++) { for(j=1;j&=i*2-1;j++) System.out.print(&*&); System.out.println(); //换行 } } } 4.3 跳转语句? ? ?break continue return 1. break?break语句的作用是使程序的流程从一个语句块的 内部跳转出来,如前述的switch结构以及循环结 构。break语句的语法格式为: break [标号];标号是可选的,如前面介绍的switch结构程序就没有使用标 号。不使用标号的break语句只能跳出当前的switch或循环 结构,而带标号的则可以跳出由标号指出的语句块,并从语 句块的下条语句处继续程序的执行。 因此,带标号的break语句可以用来跳出多重循环结构。?? 【例4-9】写出以下程序执行后的输出结果。 public class Test { public static void main(String[] args) { int i ,s=0; for(i=1;i&=100;i++) { s+=i; if(s&50) } System.out.println(&s=&+s); } } 【例4-10】写出以下程序执行后的输出结果。 public class Test { public static void main(String[] args) { int jc=1,i=1; while(true) { jc=jc*i; i=i+1; if (jc&100000) //首先突破10万的阶乘 } System.out.println((i-1)+&的阶乘值是&+jc); } } 【例4-11】写出以下程序执行后的输出结果。 public class Test { public static void main(String[] args) { int s=0,i=1; label: while(true) { while(true) { if (i%2==0) //不带标号 if(s&50) //带标号 s+=i++; } i++; } System.out.println(&s=&+s); } } 2. continue???continue语句只能用于循环结构,它也有两种使用形式:不带 标号和带标号。 前者的功能是提前结束本次循环,即跳过当前循环体的其他后 续语句,提前进入下一轮循环体继续执行。对于while和dowhile循环,不带标号的continue语句会使流程直接跳转到条件 表达式,而对于for循环,则跳转至表达式3,修改控制变量后 再进行条件表达式2的判断。 带标号continue语句多用在多重循环结构中,标号的位置与 break语句的标号位置相类似,一般需放至整个循环结构的前面, 用来标识这个循环结构,一旦内层循环执行了带标号continue 语句,程序流程则跳转到标号处的最外层循环,具体是:while 和do-while循环,跳转到条件表达式,for循环,跳转至表达式3。 【例4-12】写出以下程序执行后的输出结果。public class Test { public static void main(String[] args) { int s=0,i=0; do { i++; if (i%2!=0) s+=i; }while(s&50); System.out.println(&s=&+s); } } 【例4-13】写出以下程序执行后的输出结果。public class Test { public static void main(String[] args) { int i,j; label: for(i=1;i&=200;i++) //查找1到200以内的素数 { for(j=2;j&i;j++) //检验是否不满足素数条件 if (i%j==0) //不满足 //跳过后面不必要的检验 System.out.print(& &+i); //打印素数 } } } 提示:??跳转语句break及continue的使用,使得程序 流程设计变得更灵活,但同时也给编程者增加 了分析负担,建议应少用,慎用。 学会分析程序的执行流程是掌握程序设计的关 键,也是基础,建议初学者应读透本章的例子, 为后面的进一步学习打下一个良好的开端。 作业? ? ? ?2 6 7 8 第5章 方法 本章学习重点? ? ?方法定义和调用 。 递归算法 。 变量作用域 。 5.1 方法的概念和定义?? ?在一个程序中,相同的程序段可能会多次重复 出现,为了减少代码量和出错概率,一般将这 些重复出现的代码段单独抽出来,写成子程序 形式,以供多次调用。 这类子程序在Java语言中叫做方法。 这类子程序也叫函数(如C语言)。 方法的好处? ? ?缩短程序 提高程序的可维护性 分而治之 方法是Java语言的重要概念之一,同时也是实现 结构化程序设计的主要手段,结构化程序设计是 面向对象程序设计的基础,因此,掌握Java方法 非常重要。 ? ?main()方法 System.out.println()int Average(int x, int y) { result = (x + y) / 2; } 自定义方法的一般形式返回值类型 方法名(类型 形式参数1, 类型 形 式参数2, …… ) { 方法体 } 注意? ?(1)如果不需要形式参数,则参数表(即方 法头的小括号)中就空着。 (2)返回值类型与return语句配合,即return 语句后面的表达式类型应与返回值类型相一致。 如果不需要返回值,则应该用void定义返回值 类型,同时return语句之后不再需要任何表达 式。 注意???(3)一个方法中可以有多条的return语句,只要 方法执行到其中的任何一条return语句时,就中止 方法的执行,返回到调用它的地方。 (4)方法内部可定义只能自己使用的变量,称之 为局部变量(或内部变量),局部变量的作用域 仅限于定义它们的地方起一直到方法体结束。 (5)方法中局部变量的确定值要在该方法被调用 时由实际参数传入确定。 【例5-1】不带参数同时也没有返回值的方法示例。 void Print_wang( ) { System.out.println(&********&); System.out.println(& System.out.println(& System.out.println(& System.out.println(& } * &); * &); * &); * &);System.out.println(&********&);System.out.println(&********&); 【例5-2】带参数但没有返回值的方法示例。 void Print_lines(int i) { for(int j=0;j&i;j++) System.out.println(&********&); } 【例5-3】已知三角形的三条边长,定义求它的面积的方法。 提示:面积 = s ( s ? a)( s ? b)( s ? c) a+b+c 其中, s = 2 double Area(double a,double b,double c) { double s, s = (a+b+c)/2; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); } 【例5-4】定义求圆面积的方法。 double Circle(double radius) { area = 3.14*radius* } 5.2 方法的调用? ? ?在程序中是通过对方法的调用来执行方法体的,Java 语言中,方法调用的一般形式为: 方法名(实际参数表) 对无参方法调用时则只要写上小括号即可。实际参数 表中的参数可以是常数,变量或其它构造类型数据及 表达式,各实参之间要用逗号间隔开,并注意需与形 参相对应。 调用方式? ? ?(1)方法表达式 (2)方法语句 (3)方法参数 【例5-5】调用Average方法。 public class Test { static int Average(int x, int y) { result = (x + y) / 2; } public static void main(String args[ ]) { int a = 12; int b = 24; int ave = Average(a, b); System.out.println(&Average of &+ a +& and &+b+& is &+ ave); } } 【例5-6】调用例5-1中的Print_wang方法。 public class Test { static void Print_wang() { System.out.println(&********&); System.out.println(& * &); System.out.println(& * &); System.out.println(&********&); System.out.println(& * &); System.out.println(& * &); System.out.println(&********&); } public static void main(String args[ ]) { Print_wang(); } } 【例5-7】调用Average方法。 public class Test { static int Average(int x, int y) { result = (x + y) / 2; } public static void main(String args[ ]) { int a = 12; int b = 24;System.out.println(&Average of &+ a +& and &+b+& is &+ Average(a, b));} } 超前引用【例5-8】调用求三角形面积的方法。 public class Test { public static void main(String[] args) { double a=3,b=4,c=5,s; //三角形的三条边 //三角形的面积 area = Area(a,b,c); //调用方法求面积 System.out.println(&该三角形的面积为:&+area); } //定义求三角形面积的方法 static double Area(double a,double b,double c) { double s, s = (a+b+c)/2; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); } } 参数传递? ??当对带参方法进行调用时,实际参数将会传递给 形式参数,也就是实参与形参结合的过程。 参数是方法调用时进行信息交换的渠道之一,方 法的参数分为形参和实参两种,形参出现在方法 定义中,在整个方法体内都可以使用,离开该方 法则不能使用。实参出现在主调方法中,进入被 调方法后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生方法调用 时,主调方法把实参的值传送给被调方法的形参, 从而实现主调方法传递数据给被调方法。 形参和实参??? ?(1)形参只在方法被调用时才分配内存单元,在调 用结束时,便会“释放”所分配的内存单元。因此, 形参只在本方法内有效,方法调用结束后就不能再使 用。方法内部定义的(局部)变量也是如此。 (2)实参可以是常量、变量、表达式,甚至是方法 等,无论实参是何种类型的量,在进行方法调用时, 它们都必须具有确定的值,以便把这些值传递给形参。 (3)实参和形参在数量上,类型上,顺序上应严格 一致,否则会发生类型不匹配”的错误。 (4)方法调用中发生的数据传递是单向的,因此在 方法调用过程中,若形参的值改变,则实参不会跟着 改变。 【例 5-9】写出下列程序的运行结果。 public class Test { static void Swap(int x,int y) { temp=x; x=y; y= System.out.println(&x=&+x+&,y=&+y); } public static void main(String[] args) { int x=10,y=20; Swap(x,y); System.out.println(&x=&+x+&,y=&+y); } }程序运行结果: x=20,y=10 x=10,y=20 图5-1方法的参数传递调用前 x y 调用时 x y 交换 x y 调用返回 x y10 20 10 20 10 20 10 20x y x y10 20temp20 10 返回值?带返回值方法的一般形式为:返回值类型 方法名(类型 形式参数1, 类型 形式参数2, …… ){ 方法体 return 表达式; } 返回值?方法返回值是指方法被调用之后,执行方法体中的程序段 所取得的并通过return语句返回给主调方法的值。 方法的返回值只能通过 return语句返回给主调方法。 方法内部返回值的数据类型和方法定义中方法的返回值类 型应保持一致。 不返回方法值的方法,可以明确定义其为&空类型&,类型 说明符为& void &。? ?? 方法嵌套及递归Java语言允许在一个方法的定义中出现对另一 个方法的调用,我们把这样的情况称为方法的 嵌套(调用),即在被调方法中又调用了其它 方法。main方法1 2?m1方法3 4m2方法调用m1方法9调用m2方法8 7 65结束 【例 5-10】写出下列程序的运行结果。 public class Test { static int m1(int a ,int b) { a+=a; b+=b; c=m2(a,b); return(c*c); } static int m2( int a,int b) { c=a*b%3; return( c ); } public static void main(String[] args) { int x=1,y=3,z; z= m1(x,y); System.out.println(&z=&+z); } }程序运行结果如下: z=0 【例 5-11】定义一个求圆柱体体积的方法,要求利用例5-4 求圆面积的方法来实现,并在main()方法中进行验证。public class Test { static double Circle(double radius) { area = 3.14*radius* } static double Cylinder(double r,double h) { vol = Circle(r)*h; } public static void main(String[] args) { double r=5.5,h=30,v; v = Cylinder(r,h); System.out.println(&底面半径为&+r+&,高度为&+h+&的圆柱体体积:&+v); } } 递归?一个方法在它的方法体内调用它自身的情况称 为递归调用,这是一种特殊的嵌套调用,称之 为递归方法。 int m(int x) { z=m(y); } 【例 5-12】用递归法计算n的阶乘。?n!可用下述公式递归表示: n!=1 (n=0,1) n!= n × (n-1)! (n&1) 【例 5-12】用递归法计算n的阶乘。static long factorial(int n) { long f=0; if(n&0) System.out.println(&n&0,input error&); else if(n==0||n==1) f=1; else f=factorial(n-1)*n; } 5.3 变量作用域??局部(动态)变量也称为内部变量,局部变量 是在方法内作定义说明的,在各个方法(包括 main()方法)中定义的变量及方法的形式 参数变量均为局部变量。 其作用域仅限于方法内,离开该方法后再使用 这种变量则是非法的,因为它已经被“释放” 不存在了。 int m1(int a) /*方法m1*/ { int b,c; …… } int m2(int x) /*方法m2*/ { int y,z; …… } public static void main(String args[]) /*主方法main()*/ { int m,n; …… } 提示?1) 主方法中定义的变量只能在主方法中使用,因为它 也是一个方法,与其它方法是平行关系。 2) 形参变量是属于被调方法的局部变量,而实参变量 一般是属于主调方法的局部变量。 3) 允许在不同的方法中使用相同的变量名,它们代表 不同的对象,各自在自己的作用域中发挥作用。如进 行方法调用时,形参和实参的变量名都为x,这是允 许的。 4) 在复合语句中定义变量,其作用域只在复合语句范 围内。??? 作业? ? ? ? ? ?1 3 5 8 9 10 第6章 数组 本章学习重点? ?数组的概念和使用 。 数组作为方法参数 。 6.1 数组?在现实问题中,经常需要处理一批类似的数据,如对 6位同学的成绩进行处理,利用基本数据类型的话, 那就必须定义6个变量:result1,result2,result3, result4,result5和result6。假如需要对60位同学的成 绩进行处理的话,那就需要定义60个基本数据类型的 变量,这是不方便的。 为了便于处理一批同类型的数据,Java语言引入了数 组类型。? 数组特点? ?首先,数组中的每个元素都是相同数据类型的; 其次,数组中的这些相同数据类型元素是通过数组 下标来标识的,并且该下标是从0开始的; 最后,数组元素在内存中的存放是连续的。? 6.2 数组的声明和创建?一维数组的声明格式为: 数据类型 [ ] 数组名; 数据类型 数组名[ ];short [ ] x; 或 short x[ ]; short x[ 60];或 创建数组? ?初始化方式 new操作符方式数据类型 数组名[ ] = {数据1,数据2,...,数据n}; short x[ ] = {1,2,3,4,5,6}; char ch[ ] = {‘a’,’b’,’c’,’d’,’e’,’f’}; 数据类型 数组名[ ] = new 数据类型[元素个数]; short x[ ] = new short[6]; x[0] = 9; x[1] = 8; short x[ ] = new short[6]; int len = x. //通过循环给每个数组元素赋值 for(int i=0;i&i++) x[i]=i*2; //通过循环输出每个数组元素的值 for(int i=0;i&i++) System.out.print(x[i] + “ ”); ?二维数组的声明格式如下: 数据类型 [ ] [ ] 数组名;或 数据类型 数组名[ ] [ ];short [ ] [ ] x; float y [ ] [ ]; short [ ] [ ] x = {{1,2,3},{4,5,6},{7,8,9}}; float y [ ] [ ]={{0.1,0.2},{0.3,0.4,0.5},{0.6,0,7,0.8,0.9}}; short [ ] [ ] x = new short[3][3]; float y [ ] [ ]= new float[3][]; y[0] = new float[2]; y[1] = new float[3]; y[2] = new float[4];非等长数组由于各列元素个数不同, 只能采取各列单独进行创建的方式 6.3 数组的应用举例?数组很适合用来存储和处理同类的一批数据, 请看以下几个关于数组的应用例子。 【例 6-1】某同学参加了高数、英语、Java语 言、线性代数和物理5门课程的考试,假定成 绩分别为70、86、77、90和82,请用数组存 放其成绩,并计算5门课程的最高分和平均分。? public class Score { public static void main(String[] args) { int x[]={70,86,77,90,82}; int max=0; //临时变量 int sum=0; //总分 程序运行结果如下: for(int i=0;i&x.i++) 最高分:90 平均分:81.0 { if(x[i]&max) max=x[i]; sum+=x[i]; } System.out.println(&最高分:&+max); System.out.println(&平均分:&+sum*1.0/x.length); //注意“/”运算 } } 【例 6-3】试用冒泡法对10,50,20,30,60和40数列进行降序排序。 public class BubbleSort { public static void main(String[] args) { int x[]={10,50,20,30,60,40}; //临时变量 for(int i=1;i&x.i++) //比较趟次 for (int j=0;j&x.length-i;j++) //在某趟中逐对比较 { if(x[j]&x[j+1]) { //交换位置 temp=x[j]; x[j]=x[j+1]; x[j+1]= } } for(int i=0;i&x.i++) System.out.print(x[i]+& &); //遍历输出排好序的数组元素 } } 6.4 数组与方法?有了数组这种构造类型之后,我们 可以利用传递数组的首地址值来间 接达到传递一批值的目的。 【例 6-5】方法中的数组传递。 public class TestArray { public static void main(String[] args) { int x[]={10,20,30,40,50}; display(x); } public static void display(int y[]) { for(int i=0;i&y.i++) System.out.print(y[i]+& &); } } 作业? ? ? ? ?1 2 3 5 7 第7章 字符串 本章学习重点? ? ? ?字符串的定义 。 String类型字符串的操作方法 。 StringBuffer类型字符串的操作方法 。 StringTokenizer字符分析器的操作方法 。 字符串?字符串的定义 字符串的创建 String类型字符串的操作 StringBuffer类型字符串的 操作?字符分析器 main()方法???? 字符串的定义? ?字符串可以看成是由两个或两个以上字符组 成的数组。 Java语言中使用String和StringBuffer两个 类来存储和操作字符串,因此Java语言中 字符串是一个对象。 字符串的定义? ? ? ?Java中的字符串可分为字符串常量和字符串变量两 种类型。 字符串常量:由一系列字符用双引号括起来表示 。 字符串变量:利用String或StringBuffer类型的变 量来代表这些字符串常量。 例如:– –String str; str=&Hello!“;?str表示一个字符串变量,str的值为&Hello! &。 字符串的创建? ?创建String类型的字符串 创建StringBuffer类型的字符串 String类型的构造函数(表)? 创建String类型的字符串?由字符串常量直接赋值给字符串变量 。如:String str=&Hello! &?由一个字符串来创建另一个字符串。例如:String str1=new String(&Hello&); String str2=new String(str); String str3=new String(); 创建String类型的字符串?由字符数组来创建字符串。例如:char num[ ]={‘H’,’i’}; String str=new String(num);?由字节型数组来创建字符串。例如:byte bytes[ ]={25,26,27}; String str=new String(bytes);?由StringBuffer对象创建String类型字符串。如: String str= new String(s); 创建StringBuffer类型的字符串?由String对象来构造StringBuffer类型的字 符串,方法如下:–StringBuffer( String s );?上述方法分配了s大小的空间和16个字符的 缓冲区。如:StringBuffer str=new StringBuffer(Hello!); 创建StringBuffer类型的字符串?构造StringBuffer类型的空字符串,方法如下:–StringBuffer( ); StringBuffer( int len );?上述方法生成具有16个字符缓冲区的空字符串。–?上述方法生成具有len个字符缓冲区的空字符串。 例如:StringBuffer str=new StringBuffer(); StringBuffer str=new StringBuffer(12); String类型的构造函数(表)构造函数 String() String(string) String(char[ ]) String(char[ ],int,int) 功能描述 构造一个空的字符串。 用一个字符串来生成一个新的字符串,两个字 符串相等。 用字符型数组来生成一个新的字符串,其中第 一个参数是字符数组,第二和第三个参数分别 是用来生成字符串的字符型数组的起始的位置 和长度。 用byte型数组生成一个新的字符串,其中第一 个参数是byte型数组,第二和第三个参数分别 是用来生成字符串的byte型数组的起始的位置 和长度。 利用StringBuffer对象来创建一个String类型字 符串。String(byte[ ]) String(byte[ ],int,int)String(StringBuffer) String类型字符串的操作?求字符串的长度 字符串的连接 字符串的大小写转换?字符串的检索 字符串类型与其他类型的转化 字符串的替换 字符串的其他操作??? ?? ?求字符串的子集?字符串的比较 求字符串的长度?String类中使用length()方法来获得字符串的长度,方 法定义为:–public int length();String s=&You are great!&; String t=&你很优秀!&; int len_s,len_t; len_s=s.length(); len_t=t.length();?例如: 字符串的连接?两个字符串使用+进行连接。例如:String str1=&I&+&like&+&swimmming&; String str2; str2=str1+&but Jane like running.&;?使用contat()方法进行连接 。例如:String contat(); String str1=&I&+&like&+&swimmming&; String s=str1. contat(but Jane like running.); 字符串的大小写转换?把字符串中所有的字符变成小写?String toLowerCase(); String toUpperCase();String date=&Today is Sunday.&; String date_lower,date_ date_lower=date. toLowerCase(); date_upper=date. toUpperCase();?把字符串中所有的字符变成大写??例如: 求字符串的子集?获得给定字符串中的一个字符String CharAt(int index); 如:String date=&Today is Sunday.&; String str2=data.CharAt(s.length()-1)–?获得给定字符串的子串String substring(int begin_index); – String substring(int begin_index,int end_index); 如:String date=&Today is Sunday.&; String str2=date. substring(6);– 字符串的比较?equals()和equalsIgnoreCase()方法– –boolean equals(String s); boolean equalsIgnoreCase(String s);?例如:String date1=&SunDay &,date2= & Sunday&; System.out.println(data1. equals (data2)); System.out.println(data1. equalsIgnoreCase (data2));??Java语言中比较两个字符串是否完全相同,不能使用==符 号,因为即使两个字符串完全相同的情况下也会返回false。 请看例子 字符串的比较?compareTo()和compareToIgnoreCase()方法– –int compareTo(String s); int compareToIgnoreCase(String s); String s1=“me” ; s1. compareTo(“her”)大于0 s1. compareTo(“you”)小于0 s1. compareTo(&me&)等于0? 例如: 字符串的比较?startsWith()和endsWith()方法– – –boolean startWith(String s) boolean startWith(String s,int index) boolean endsWith(String s)boolean b1,b2,b3; b1=s. startsWith(&abc&); b2= s.startsWith(s,2); b3= s.endsWith(&abc&);例如:String s=&abcdgde &; 字符串的比较?regionMatches()方法––boolean regionMatches(int index,String s, int begin,int end) boolean regionMatches(boolean b,int index, String s,int begin,int end)?请看例子 字符串的检索?? ?Java中的String类提供了以下两种方法来查找一个字 符串在另一个字符串中的位置。indexOf()方法是从字符串的第一个字符开始检索。 lastIndexOf()方法是从字符串的最后一个字符开始检索。?方法定义为:int indexOf(String s) int indexOf(String s,int begin_index) int lastIndexOf(String s) int lastIndexOf(String s,int begin_index)?请看例子 字符串类型与其他类型的转化? ?数值类型转化为字符串类型 方法定义为:String static valueOf(boolean t) String static valueOf(int t) String static valueOf(float t) String static valueOf(double t) String static valueOf(char t) String static valueOf(byte t) 字符串类型与其他类型的转化? ?字符串类型转化为数值类型 方法定义为:public int paresInt(String s) public float paresFloat(String s) public double paresDouble(s) public short paresShort(String s) public long paresLong(String) public byte paresByte(String s) 字符串类型与其他类型的转化?字符串向字符数组的转化– –char[ ] toCharArray() public void getChars(int begin,int end, char c[ ],int index) String(char[ ],int offset,int length)char c[ ]= &今天星期六&.getChars(); String s=new String(c,0,4); System.out.println(s);? ?用字符数组数组来构造一个字符串–例如: 字符串类型与其他类型的转化?字符串向字节数组的转化–byte[ ] getBytes() String(byte[],int offset,int length)byte b[ ]= &今天星期六&.getBytes(); String s=new String(b,4,6); System.out.println(s);?用字节数组来构造一个字符串–?例如: 字符串的替换?字符串中字符的替换String replace(char oldChar,char newChar) 如:String s=&bag&; s=s.replace(a,e);–?字符串中子串的替换String replaceAll(String oldstring,String newstring) 如: String s=&more and more &;–s=s.replaceAll (&more &, &less&); 字符串的其他操作?字符串前后部分空格的删除–String trim();? ?用来把字符串前后部分的空格删除,返回删除空 格后的字符串。 例如:String str=& It is Sunday &; String s=str.trim(); 字符串的其他操作?对象的字符串表示–String toString()? ?toString()是Object类一个public方法,用来把任何 对象表示成String类型的字符串。 请看例子 StringBuffer类型字符串的操作?字符串的追加 字符串的插入 字符串的删除 字符串的修改?求字符串的长度和容量 字符串的替换 字符串的反转 注意?????? 字符串的追加? ? ? ? ? ?StringBuffer append(数值类型 t); 参数类型包括boolean、int、char、float、double、 long类型。 StringBuffer append(String s) StringBuffer append(char[ ]) StringBuffer append(char[ ],int begin,int end) StringBuffer append(Object t) 字符串的插入? ? ? ? ??StringBuffer insert(int offset, 数值类型 t) 参数类型包括boolean、int、char、float、double、 long类型。 StringBuffer insert(int offset, String t) StringBuffer insert(int offset,char[ ] t) StringBuffer insert(int offset, char[ ] t, int begin,int end) StringBuffer insert(int offset,Object t) 字符串的删除?删除字符串的一个字符–StringBuffer deleteCharAt(int index) StringBuffer delete(int begin_index,int end_index)?删除字符串的子串–?例如:StringBuffer s=new StringBuffer(“It iss Sunday”); s=s.deleteCharAt(5); s=s.delete(5,12); 字符串的修改? ??void setLength(int length) 如果length的长度小于原字符串的长度,那么进行 setLength操作后当前字符串的长度为length,且后 面的字符被删除,但如果length的长度大于原字符串 的长度,那么进行setLength操作后,会在原字符串 的后面补字符‘\u0000’来使原字符串变长为length。 例如:StringBuffer s=new StringBuffer(&Sunday&); s.setLength(8); 求字符串的长度和容量?字符串的长度–StringBuffer length() StringBuffer capacity()StringBuffer s=new StringBuffer(&Sunday&); int len1=s.capacity(); Int len2=s.length();?StringBuffer字符串的容量–?例如: 字符串的替换?子串的替换–StringBuffer replace(int begin_index, int end_index,String s) void setCharAt(int index,char ch) StringBuffer s=new StringBuffer(&me them&); s.setCharAt(1,'y'); s.replace(3,7,&their&);?单个字符的替换–?例如: 字符串的反转? ? ?StringBuffer reverse(); reverse方法是将字符串倒序。 请看例子 注意??String中对字符串的操作不是对原字符串本身 进行的,而是对新生成的一个原字符串对象的 拷贝进行的,其操作的结果不影响原字符串。 相反,StringBuffer中对字符串的操作是对原 字符串本身进行的,可以对字符串进行修改而 不产生副本。 请看例子 字符分析器?定义 StringTokenizer类的构造函数 StringTokenizer类的常用方法? ? 定义??Java的java.util包中有StringTokenizer类可 以通过分析一个字符串把字符串分解成可被 独立使用的单词,这些单词称为语言符号。 例如:字符串&It is Sunday&,如果把空格作 为该字符串的分隔符的话,那么该字符串有It、 is和Sunday三个单词。 StringTokenizer类的构造函数? ? ?StringTokenizer(String s) StringTokenizer(String s, String delim) StringTokenizer(String s, String delim, boolean isTokenReturn)例如: StringTokenizer s=new StringTokenizer(&It;Sunday&,&;&);? StringTokenizer类的常用方法? ? ? ? ?public String nextToken(); public String nextToken(String delim) public int countTokens() public boolean hasMoreTokens(); 请看例子 main()方法? ?Java中每一个程序都是从public static void main(String[ ] args)方法进入的。 main方法中的参数是字符串数组arg[ ],args是命 令行参数,字符串数组arg[ ]的元素是在程序运行 时从命令行输入的,其形式为:java 类文件名 arg[0] arg[1] arg[2] arg[3]……?请看例子 作业? ? ? ?1 2 6 7 第8章 类和对象 本章学习重点:? ? ? ?理解类与对象、封装的概念 类中成员变量和方法的声明与使用 对象的创建与使用 包的作用与用法 8.1 面向对象的概念?传统的程序设计语言是结构化的、面向过程的,以 “过程”和“操作”为中心来构造系统、设计程序, 但当程序的规模达到一定程度时,程序员很难控制其 复杂性。 ?? ?由于其他方法的影响数据会发生改变,同时数 据可能会出乎意料地遭到破坏,这都将导致程 序的可靠性降低,并且使程序很难调试; 修改数据时需要重写与数据相关的每个方法, 这将导致程序的可维护性降低; 方法和操作的数据没有紧密地联系在一起,由 于复杂的操作网络而导致代码的重用性降低。 面向对象的类设计 ??从程序设计的观点来看,类也可以看作是数据类型, 通过这种类型可以方便定义或创建某类的众多具有不 同属性的对象,因此类的引入无疑扩展了程序设计语 言解决问题的能力。 人们把现实世界分解为一个个对象,解决现实世界问 题的计算机程序也与此相对应,由一个个对象组成, 这些程序就称为面向对象的程序,编写面向对象程序 的过程就称为面向对象程序设计(Object-Oriented Programming,简写为OOP) ? ??要想得到正确并且易于理解的程序,必须采用良好的程序设计方 法。 结构化程序设计和面向对象程序设计是两种主要的程序设计方法。 结构化程序设计建立在程序的结构基础之上,主张采用顺序、循 环和选择三种基本程序结构以及自顶向下、逐步求精的设计方法, 实现单入口、单出口的结构化程序。 面向对象程序设计则主张按人们通常的思维方式建立问题域的模 型,设计尽可能自然地表现客观世界和求解方法的软件。类和对 象是为实现这一目标而引入的基本概念,面向对象程序设计的主 要特征在于类的封装性和继承性以及由此带来的对象的多态性。 与结构化程序设计相比较,面向对象程序设计具有更多的优点, 适合开发大规模的软件。 8.2 类? ? ? ?类是Java语言的最基本概念,是组成Java程 序的基本要素; 类是Java的执行单位,Java运行的就是Java 类本身; 类封装了该类对象的成员变量和方法。 Java的类分为两大部分– –系统定义的类 用户自定义的类 定义一个兔子类class Rabit{ final char EyeColor=ˋRˊ; //所有兔子的眼睛都是红的 int age; //兔子的年龄 //兔子的性别 //兔子皮毛的颜色 //兔子跑的速度 } 一个简单类public class Example{ public static void main(String args[ ]){ System.out.println(“热烈庆祝中华人民共和国建国60周年! } } 类声明 public class Teacher { private S 成员变量声明 pr public Teacher(String name,int hours){ this.name= 构造函数 this.hours= 类体 this.payment=0; } public void show(){ System.out.println(name+&工作了&+hours+&小时,应付&+payment) } public void countPayment(){ payment=counting(1000,hours,50,0); 成员方法 } public void resetHour() { hours=0; } public void addHour(int h){ hours+=h; } protected long counting(int base,int h,int perHour,long other){ return (long)base+h*perHour+ } } 类声明?类声明格式如下:–[类的修饰字]class 类名[extends 父类名][implements 接口列表]?class是声明一个类的关键字,是必须的,类名是要声明的类的 名字,它必须是一个合法的Java标识符。 根据声明类的需要,类声明还可以包含三个选项:– – –?声明类的修饰符; 说明该类的父类; 说明该类所实现的接口。 类体? ?类体用一对大括号括起。 类体中定义了该类中所有的变量和该类所支持 的方法:– –成员变量对应类的静态属性 方法对应类的行为和操作 ?成员变量––成员变量是类和对象的静态属性,它可以是基本数据类型的 变量,也可以是其它类(系统类或用户自定义类)的对象。 因此,定义成员变量的操作就是说明变量或创建对象的操作。 方法是类的动态属性,标志了类所具有的功能和操作,用来 把类和对象的数据封装在一起。 Java的方法与其它语言中的函数或过程类似,是一段完成某 种功能的程序段。?方法–– 成员变量?最简单的成员变量的声明方式如下:– ––type 成员变量名; 这里的type可以是Java中任意的数据结构,包括简 单类型、类、接口、数组。 在一个类中的成员变量应该是唯一的。?成员变量的作用域是整个类。 ?1.静态成员变量– –––用static修饰的成员变量就是静态成员变量(类变量)。 静态成员变量最本质的特点是:它们是类的成员变量,不属 于任何一个类的具体对象,它不保存在某个对象的内存区成 员变量中,而是保存在类的内存区成员变量的公共存储单元。 换句话说,对该类的具体对象而言,静态成员变量是一个公 共的存储单元。任何一个类的对象访问它,得到的都是相同 的值;任何一个类的对象修改它,都是对同一内存单元进行 操作。 没有用static修饰的变量是实例变量,必须实例化该类才可以 使用实例变量。该类的不同对象都各自拥有自身的实例变量 的版本。 ? ?2.最终成员变量 final:用来声明一个常量。– – –如: classFinalVar{ final int CONSTANT=50; …… }–?此例中声明了常量CONSTANT,并赋值为50。对于 用final限定的常量,在程序中不能改变它的值。通常 常量名用大写字母表示。 成员方法?方法由方法

我要回帖

更多关于 mfc 对话框 文件拖放 的文章

 

随机推荐