声明:
本文内容基于吉首大学软件学院-Java程序设计(Java面向对象程序设计)网课与个人实践经验修改编写而成。本文属于Arcadia项目组成部分。若有错误或不足之处存在请联系专栏作者指出,谢谢。本文禁止转载。
更新:
2020.03.12:更新演示案例
2020.03.27:更新文章专栏归属,更新文章封面
1.1 Java的发展
- Java发展的四个阶段
1.第一阶段——萌芽期时间:1990年-1994年主要产品:Oak语言发布者:Sun MicroSystems公司2.第二阶段——完善期时间:1995年-1998年产品:Java语言(1995),JDK1.0(1996),JDK1.2(1998)发布者:Sun MicroSystems公司备注:1998年12月8日,企业平台J2EE发布,标志着里程碑式产品的诞生。在提高性能的基础上集成了完整的API。3.第三阶段——平稳期时间:1999年-2004年产品:J2SE/J2EE和J2ME(1999)、JDK1.3(2000)、JDK1.4(2000)发布者:Sun MicroSystems公司备注:Java已经成为最为流行的网络编程语言,并且在移动计算和智能制造等领域得到了广泛应用。4.第四阶段——发展期时间:2005年-至今产品:JDK1.5(2005)、Java SE 8.0(JDK1.8)(2014年)发布者:ORACLE公司备注:2009年4月20日甲骨文(Oracle)公司以74亿美元收购Sun MicroSystems公司,获得Java版权。
- Java技术分支:
Java SE(Java Standard Edition,标准版)前身是Java J2SE,2005年后更名为Java SE。是EE企业版和ME微型版的基础。包含构成Java语言核心的类。比如:数据库连接、接口定义、数据结构、输入/输出、网络编程等。Java EE(Java Enterprise Edition,企业版)前身是J2EE,2005年后更名为Java EE。包含Java SE中的所有类,并且还包含了用于开发企业级应用的类。比如:EJB、Servlet、JSP、XML、事务控制,也就是现在Java应用的主要方向,像一些银行或电信的系统大多基于此架构。Java ME(Java Micro Edition,微型版)前身是J2ME,2005年后更名为Java ME。用于消费类电子产品的软件开发。比如:传呼机、智能卡、手机、PDA、机顶盒。现在已经被Android开发所取代。
1.2 Java简介
- Java的特点
1.面向对象性相比传统的面向过程的设计语言能更真实地模拟现实世界。2.简洁性1.Java的语法与C++很接近2.Java省略了C++中很难理解的诸如操作符重载、多继承、自动强制类型转换等特性。3.Java丢弃了C++中的指针,从而彻底消除了安全隐患。4.Java提供了自动垃圾收集功能,使得程序员不必为内存管理而担忧。3.可移植性(平台无关性)指程序不经修改就能在不同的硬件或软件平台上运行的特性,即一次编写、处处运行。利用Java编写的程序,只需做少量修改或者不经过修改,就能够在Windows、MacOS、UNIX、Linux和Android等软件平台上运行。而C/C++针对当前源程序所在的特定平台对其源文件进行编译、链接、生成机器指令,即根据当前平台的机器指令生成可执行文件。不能保证C/C++源程序所产生的可执行文件在所有的平台上都能正确地被运行,其原因是不同平台可能具有不同的机器指令。4.解释型Java源程序被编译为字节码格式,在运行时,Java平台中的Java解释器对这些字节码进行解释执行。虽然这种解释性特征降低了程序的执行效率,但达到了平台无关性的目标,并且随着处理器运行速度的不断提高,其对表现在用户交互层面的运行效率的影响也逐渐减小。5.适合分布式计算Java支持Internet应用开发,它的网络应用编程接口(Java.net)提供了丰富的类库来支持TCP和UDP编程。6.较好的运行效率Java的运行效率与C/C++等编译型语言相比会相对较低,但高于JavaScript、VBScript、Perl、Python、Ruby、MATLAB等解释型语言。Java伪编译器将Java源程序转换为中间代码(字节码)后再解释执行。当对执行性能有更高的要求时,利用JIT(Just-In-Time)编译器技术可将字节码转换成机器码,然后将其缓冲下来,需要时可直接执行。随着JIT编译器技术的发展,Java的运行速度越来越接近于C++。7.较高的应用安全性Java通常被用在网络环境中。为了确保复杂网络环境下的应用安全,Java提供了安全防范机制,并提供安全管理机制让Java应用可以设置安全哨兵确保应用程序的安全。8.稳固性Java采用强类型机制、异常处理、垃圾自动收集、丢弃指针和安全检查机制等措施来保障Java程序的稳固性。9.多线程处理线程是一种轻量级的进程,是现代程序设计中非常重要的一种特性。Java提供了简洁的多线程处理机制,利用同步机制来确保同步线程的安全。10.动态语言Java程序需要的类(API)能够动态地被载入到运行环境,也可以通过网络来载入所需要的类,该特性使Java能适应环境的动态变化,并且便于软件升级;另外,通过反射机制可以简单、直观地查询Java程序运行时的状态信息。11.中性体系结构Java源程序(后缀为Java的文件)在Java平台上被编译为体系结构中里的字节码格式(后缀为class的文件),然后可以在拥有JVM的平台上运行,这种方法适合于异构网络环境和软件分发。
- Java程序的三种基本类型:
1.Application即Java应用程序,是可以独立运行的Java程序,由Java解释器控制执行,也是最常见的类型。2.Applet即Java小程序,主要应用于网页编程。不能独立运行(嵌入到Web页中)。由与Java兼容的浏览器控制执行。3.Serverlets即将Java技术用于CGI编程的解决方案。是运行于网络服务器上的、作为来自于网络浏览器或其他HTTP客户端的请求和在服务器上的数据库及其他应用程序之间的中间层程序。
1.3 Java程序运行机制
- Java虚拟机(Java Virtual Machine,JVM)
在一台计算机上由软件或硬件模拟的通过Java语言运行虚拟计算机。
- Java程序运行的主要环节:
1.Java源程序(.java)经过编译,生成与平台无关的字节码(.class)。 2.随后字节码被加载到不同平台中的JVM被解释执行。 3.确认安全后,JVM会把字节码转换成具体平台的机器指令,由该平台执行这些指令。
1.4 搭建Java开发环境
- Java基础环境
1.SDK(Softwore Development Kit)SDK(Softwore Development Kit,软件开发工具包)是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。用于Java的一系列开发工具与环境组合都属于SDK。2.JDK(Java Development Kit)JDK(Java Development Kit,Java开发工具包)是目前的主流Java开发环境。为了提高Java程序的开发效率,目前有很多集成开发环境(Integrated Development Environment,IDE),诸如Eclipse(主流)、MyEclipse、JBuilder、JDeveloper、JCreator等。使用这些集成开发环境能帮助开发者快速地开发应用系统。3.JRE(Java Runtime Environment)JRE(Java Runtime Environment,Java运行环境)是运行Java程序所必需的运行环境。JRE包括Java虚拟机(Java Virtual Machine,JVM),以及Java平台核心类和基础Java平台库。用户需要通过JVM才能在操作系统上执行Java应用程序(Java Application)。所以电脑上没有安装JVM,那么这些Java程序将不能够执行。4.JVM(Java Virtual Machine)JVM(Java Virtual Machine,Java虚拟机)是一种能够运行用Java语言编写的程序的编程语言虚拟机。是Java平台的一个重要环节。包含关系由大到小为:SDK、JDK、JRE、JVM
- 安装配置JDK的一般步骤(以Windows平台JDK1.8为例)
1.登录甲骨文官网(http://www.oracle.com)找到JDK1.8下载页面进行下载(注意:暂时不建议自行下载安装Java软件(即JRE)后再安装JDK,可能会出现兼容性问题。)2.根据JDK安装程序提示进行安装3.配置环境变量Windows 10系统可通过右键此电脑——属性——高级系统设置——高级——环境变量设置以下环境变量: Java环境变量(例如:C:\Program Files\Java\jdk1.8.0_05):为JDK安装目录路径。
Path环境变量(例如:%JAVA_HOME%\bin):JDK安装完成之后,还需要对一些操作命令进行配置,对于Java程序开发而言,主要会使用JDK的两个操作命令:javac.exe和java.exe。这两个程序所在的路径为:C:\Program Files\Java\jdk1.8.0_65\bin。由于这些命令不属于Windows操作系统,所以要想使用它们的话就需要配置Path环境变量。
CLASSPATH环境变量(例如:.;%JAVAHOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar)为操作系统指定Java类库的路径。在执行Java命令时,本地操作系统将启动一个JVM虚拟机,而JVM在运行时需要通过CLASSPATH路径加载所需要的类(.class文件),如果没有找到则在CLASSPATH目录下查找。默认情况下CLASSPATH是指当前目录(当前命令窗口所在的目录)。
4.测试JDK环境配置情况Win+R组合键调用运行窗口后输入cmd并回车启动Windows命令行(Powershell与CMD皆可),在命令行中分别输入javac与java后回车,若系统返回如下图所示的命令提示即为配置成功。
- JDK目录(JDK目录根据安装包版本的不同内容会有所删减)
1.binJDK包中命令及工具所在目录2.jre运行环境目录3.lib类库所在目录4.db附带数据库目录5.include包含本地代码的C头文件的目标6.src.zip源代码压缩头文件
- JDK常用工具(例如:C:\Program Files\Java\jdk-13.0.2\bin)
1.javac.exeJava语言编译器(将.java源文件编译成.class字节码文件)2.java.exeJava字节码解释器(运行字节码文件后由java虚拟机对字节码进行解释和运行。)3.javadoc.exe文档生成器4.javap.exeJava字节码分解程序5.javah.exeJNI(Java Native Interface,JNI)编程工具(JNI是Java平台的一部分,它允许Java代码和使用其他语言的代码进行交互,以确保代码在不同的平台上方便移植。)6.appletviewer.exe小程序(不是微信小程序)浏览工具7.jar.exe打包程序
1.5 第一个Java应用程序
- 编写案例程序
1.建立Java源程序文件利用记事本在桌面建立Java源程序文件,并命名为Hello.java。切记在键入代码时一定要遵守Java平台的严苛语法规则并区分大小写。
/**
* @Java Test Program
* @Version 1.0
*/
public class Hello {
public static void main(String[] args) {
System.out.println("Powered By JDK8u241");
System.out.println("Programmed for Windows 10");
}
}
2.编译Hello.javaWin+R组合键调出运行窗口后输入cmd并回车启动Windows命令行,输入cd desktop后回车挂载桌面目录,再输入javac Hello.java并回车以进行编译。编译完成后会在桌面(或同一目录)下生成Hello.class文件。
3.执行字节码文件
1.6 Eclipse入门
- Eclipse简介
Eclipse是著名的跨平台的自由集成开发环境(IDE)。是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse最初是由IBM公司开发的替代商业软件Visual Age For Java的下一代IDE开发环境,2001年11月贡献给开源社区。现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。微软已经加入了Eclipse基金会。
- Eclipse操作界面简介
透视图(Window/Perspective/Open Perspective):Eclipse工作台提供的附加组织层,它实现多个视图的布局和可用操作的集合,并为这个集合定义一个名称。例如,Eclipse提供的Java透视图组织了与Java程序设计有关的视图和操作的集合,而调试透视图负责组织与程序调试有关的视图和操作集。在Eclipse的Java开发环境中提供了几种常用的透视图,如Java透视图、资源透视图、调试透视图、小组同步透视图等。不同的透视图之间可以进行切换,但是同一时间内只能使用一种透视图。视图(Window/Show View):多用于浏览信息的层次结构和显示活动编辑器的属性。例如,控制台视图用于显示程序运行时的输出信息和异常错误,而包资源管理器视图可以浏览项目的文件组织结构。视图可以单独出现,也可以与其他视图以选项卡样式叠加在一起,它们可以有自己独立的菜单和工具栏,并且可以通过拖动随意改变布局位置。
- Eclipse常用快捷键
Ctrl+C:复制; Ctrl+V:粘贴; Ctrl+Z:撤销; Ctrl+X:剪切; Ctrl+D:删除当前行; Alt+上/下方向键:移动当前行; Ctrl+/:完成或取消单行或多个单行的注释; Ctrl+Shift+/:完成多行注释; Ctrl+Shift+\:取消多行注释; Ctrl+Shift+F:格式化代码。
- 利用Eclipse开发一个简单Java项目(使程序输出特定文字)
1.启动Eclipse
2.通过File/new/Java Project新建一个名为JSU的项目
3.通过File/New/Class新建一个类Hello
4.写入程序代码注意:入口方法的语法不止一种,比如: 1.”public static void main (String [] args)”(案例所用) 2.”static public void main (String [] args)”(public与static调换位置) 3.”public static void main (String args [])”([]与args调换位置)
5.通过Run/Run(或者快捷键Ctrl+F11)运行程序
- 利用Eclipse开发一个简单Java项目(程序利用用户输入值计算圆的周长与面积)
1.打开Eclipse
2.通过File/new/Java Project新建一个名为JSU的项目
3.通过File/New/Class新建一个类Circle
4.写入代码注意:第十行代码中引入了一行声明@SuppressWarnings(“resource”),此声明用于使编译器在编译过程中忽略Java源文件编程过程中因语法不严谨而导致以黄色高亮出现的resource leak资源溢出警告(此信息类型为警告而不是异常,不会影响代码的整体运行效果,但是不建议在实际应用中启用声明,因为这会使编译器忽略此警告,会给代码的后期维护与迭代更新留下隐患。)由于第十二行中名为sc的Scanner(扫描器)通过new Scanner(System.ini)创建后并未关闭input stream(输入流)(关于@SupressWarnings注解,可参考访问此博客以获取更多详细信息)。对于此警告,可使用更严谨正统的表述方法。很幸运的是,Eclipse提供了本身就提供了校正建议功能,可以得到用于解决此问题的一些预案与建议。点击行标处的黄色警告标识可以看到系统给出了预案之一Surround with try-with-resources,这个语句用法是JDK7中开始提供的一个新的异常处理机制,它能够使开发者很容易地关闭在 try-catch 语句块中使用的资源(在JDK7以前可能需要finally语句模块来关闭资源)。点击或回车后可以自动应用此语句并消除对应的警告提示。而当鼠标移至以黄色高亮形式标识的sc处后则会出现另一个包含了@SupressWarnings解决方案的提示窗,点击其列出的解决方案后也可以自动应用(关于try-with-resources语句,可以访问此博客以获取更多详细信息)。
5.通过Run/Run(或者快捷键Ctrl+F11)运行程序
2.1 Java符号集
- Java符号规范
Java采取了国际化的Unicode字符集,2个字节存储1个字符,可以标识65536个字符,包括拉丁字母、汉字、日文和其他许多语言中的字符。
- 常见字符编码
1.ASCII编码采用了一个字节编码,主要针对英文编码。用于显示现代英语和其它西欧语言。2.ISO-8859-1又称Latin-1,是国际化标准指定的,主要为了西欧语言中的字符编码,与ASCII兼容。3.GB2312/GBK/GB18030主要用于汉字编码,三种编码是包含关系。4.Unicode统一了全世界上所有文字的编码,Unicode有几种实现,例如UTF-8,UTF-16,UTF-32。
- 标识符简介
在Java程序中,包、常量、变量、方法、类和参数等成分都有一个唯一的名字以标识它的存在和唯一性,这个名字就是标识符。Java语言中的标识符由字母(英文字母,希腊字母,汉字等Unicode字符)、下划线、美元符号和数字组成,长度不受限制,但区分字母大小写。
- 标识符的格式要求
1.标识符的第一个字符不能是数字。 2.标识符不能是关键字。 3.标识符不能是true、false和null(尽管它们不是关键字)。 4.自定义标识符要见名如意。
- 标识符范例
1.good_luck 2.HelloWorld 3.dog$ 4.¥中国 5._abc\alpha6.listscore(非法) 7.computer1 8.123computer(非法) 9.abcdef 10.\Pi123\beta
- 标识符注意事项
在Java中,基本输入元素(分隔符,关键字等)都是采用ASCII编码,而自定义标识符、字符、字符串和注解则采用Unicode编码。 1.在Java中,基本输入元素(分隔符,关键字等)都是采用ASCII,而自定义标识符、字符、字符串和注解则采用Unicode编码。 2.Unicode只能用在Java内部,当设计打印、屏幕显示、键盘输入等外部操作时,仍由计算机的具体操作系统决定其表示方法。例如,简体中文Windows 10的默认字符集GBK。
- 关键字
也称为保留字,是Java语言中被赋予特定用途或被赋予特定意义的一些标识符,它们在程序中有着不同的预定作用,这些标识符不能当作自定义标识符使用。
- 关键字范例
1.abstracthttp://2.int3.break4.byte5.goto6.switch
2.2 Java程序结构
- 解构示例
public class Hello {
public static void main(String[] args){
System.out.println("Hello!Java!")
System.out.println("Structure")
System.out.println("Demostration")
public:访问权限控制符,用public class修饰的类名必须与程序源文件名相同。 class:类标识符 Hello:类名 public static void main(String[] args){:主方法,Java程序以main方法(主方法)作为运行起点,相当于C程序从main方法开始运行。 System.out.println…:方法体
2.3 编程规范与注释
- 编程风格
规定了代码的格式规范,优秀的编程风格易于阅读,并且易于后期维护。
- 部分编程风格类别
1.Allmans风格又称为独行风格,特点是左、右大括号各自独占一行,。当代码量较小时适合使用独行风格,代码布局清晰,可读性强。如以下代码:
public class Allmans {
public static void main(String args[])
{
int sum = 0;
for (int i = 1; i <= 100; i++ )
{
sum = sum + i;
}
System.out.println("sum="+ sum);
}
}
2.Kernighan风格又称行尾风格,特点是左大括号在上一行的行尾,而右大括号独占一行。当代码量较大时适合使用行尾风格,使代码层次更加简洁清晰。如以下代码:
public class Kernighan {
public static void main(String args[]) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
System.out.println("sum="+ sum)
}
}
- 注释
是程序中的说明性文字,主要作用是使程序更容易阅读和理解,提高程序的可读性,对于软件维护也具有重要的作用。
- Java注释类型
1.单行注释在注释内容前面加//2.多行注释在注释内容前面以/*开头,并在注释内容末尾以*/结束。多行注释无法嵌套使用。3.文档注释在注释内容前面以/**开头,并以*/结束。用文档注释方法注释的内容会被Java文档生成工具javadoc从中提取信息,并建立Web页面。
- Eclipse环境下注释方法演示
2.4 基本数据类型
- 数据类型
在计算机中,将数据占用存储单元的数量和对数据的操作方式这两方面的性质抽象为数据类型。
- 数据类型的作用
1.确定了该类型数据的取值范围2.确定了允许对这些数据所进行的操作
- Java数据类型
Java是一种强类型语言。制定了类型的变量,只能装对应(兼容)的类型的数据。每个变量在使用之前都必须声明类型。Java中所有数据类型的大小与具体的运行平台无关,如int类型不论在iOS上还是Windows上都是32位,数据类型平台无关性也是Java语言实现跨平台的重要因素。1.基本数据类型又称原始数据类型,包括boolean、char、byte、short、int、long、float、double等8种。2.引用数据类型是一种以特殊的方式指向变量的实体,类似于C/C++的指针,主要包括类、接口类型、数组类型、枚举类型、注解类型等。
- 部分数据类型信息
1.byte(字节型)大小8位,占用1个字节,可表示-128至127,默认值0。2.short(短整型)大小16位,占用2个字节,可表示-32768至32767,默认值0。http://3.int(整型)大小32位,占用4个字节,可表示-2147483648(-2^31)至2147483647,默认值0。4.long(长整型)大小64位,占用8个字节,可表示-9223372036854775808至9223372036854775807,默认值0。5.float(单精度)大小32位,占用4个字节,可表示-3.4E38(-3.4×1038)至3.4E38(3.4×1038),默认值0.0。6.double(双精度)大小64位,占用8个字节,可表示-1.7E308(-1.7×10308)至1.7E308(1.7×10308),默认值0.0。7.char(字符)大小16位,占用2个字节,可表示0至255,默认值\u0000。8.boolean(布尔)大小无规格,占用未指定(至少1个字节),可表示true和false,默认值false。
- Java数据类型代码演示
2.5 常量与变量
- 常量定义
常量是指在整个程序运行过程中值始终保持不变的量。
- Java中的两种常量基本分类
1.字面常量以字面形式给出值的常量。2.标识符常量以关键字final定义的常量。
- 整数常量(字面常量)
1.十进制整数由数字0~9范围内(包括0和9)的整数组成的数字序列。如198。如911、122、119等,是int(integer)类型。2.八进制整数以0开头并且其后由0~7范围内(包括0和7)的整数组成的数字序列,如0342、0611、0312、065等。3.十六进制整数以0x或者0X开头并且其后由0~9、A~F(包括0和9、A和F)组成的数字序列,如0x4e2d、0x56fd等。4.二进制由数字0和1组成的数字序列。目的是为了和十进制进行区分,如0b01101100、0B10110101。例如0B1101(在JDK1.7中以0B开头)。
- 整数常量的下划线标识功能
在Java 7中引入了一个新功能,程序员可以在数值中使用下划线,不管是整型数值,还是浮点型数值,都可以自由地使用下划线。通过使用下划线分隔,能更加直观地分辨数值的位数。例如:
long x=136_400_000L;
- 长整型(long)整数常量的后缀标注
在Java语言中,默认的字面常量整数为int类型,采用4个字节存储,如果要使用长整型(long)值,则应该在数据的末尾加上L即可(或者l)。例如:
1978 是int类型,占四个字节;
1978L 是long类型,占8个字节;
- 浮点型常量(字面常量)
Java的浮点型常量用于标识有小数部分的十进制数,有两种形式:1.小数点形式例如3.1415,2.71828等。2.指数形式例如6.3023096912e10指数表示为6.3023096912×1010;1.55e-2用指数表示为1.55×10-2等。
- 浮点型整数常量的后缀标注
在Java语言中,浮点型的字面常量默认值为double(后缀为D)类型。如果要表示float类型,则需要在常量后面加F或者f(即float类型)。例如3.14F表示这个字面常量在计算机内用4个字节存储,而3.14(3.14D)表示这个字面常量为double类型,在计算机内用8个字节存储。
- 字符型常量
1.用单引号括起的单个字符例如‘学’和‘\alpha’等(由于Java采用Unicode编码系统,所以每个字符占2个字节)。2.用单括号括起的转义字符ASCII字符集的前32个字符是控制字符,如换行(tab)、回车(enter)、退格(backspace)等等,这些字符是不可见字符,不能采用普通字符常量的表示方式,采用转义字符来表示这些不可见字符。
3.用单引号括起的八进制转义字符表示形式为‘\ddd’,这里d表示八进制数中的数字符号0-7。例如‘\101’表示字符‘A’,八进制101是十进制65,对应ASCII中的字符‘A’。而‘\012’表示换行符‘\n’。4.用单引号括起的Unicode转义字符。表示形式为‘\uxxxx’,这里xxxx表示十六进制数中的数字符号0-F。例如‘\u4e2d’代表‘中’,‘\u56fd’代表‘国’。
- 字符串常量
字符串常量使用双括号括起的0个或多个字符序列。字符串中可以包括转义字符,例如:”good luck”、”Day Day Up”、”\u601d\u8003″等等。Java要求一个字符串在一行内写完,若需要多于一行的字符串,就需要使用字符连接操作符+把两个或更多的字符串常量接在一起组成一个长字符串。例如:Java Development Kit+Java Virtual Machine。任何字符串和数值类型相连都会转换为字符串类型(使用+连接),例如:CHINA+2020转换成字符串CHINA2020、Q15637+1219转换成字符串Q156371219等等。
- 布尔型常量
在Java语言中,布尔型常量(名称源自英国数学家George Boole)有true和false两个值,true表示逻辑为真,false表示逻辑为假。
- 变量
在程序运行过程中其值可以被改变的量称为变量,变量包括变量名和变量值两个属性。变量名是用户自己定义的标识符,这个标识符代表着计算机中的一个内存块,定义了变量名后不能改变变量名。变量的值是这个变量在某一时刻的取值,它是变量名所表示的存储单元中存放的数据,该值随着程序的运行而不断变化。 Java语言的变量与C/C++语言的变量使用规则一样,必须遵照先声明后使用的原则。 声明变量的第一个目的是确定该变量的名称,自定义一个标识符。其次是为该变量指定数据类型,一边计算机为它分配足够的存储单元。声明变量包括给出变量的名称和指明变量的数据类型,必要时还可以指定变量的初始值。声明语法格式如下:
1.数据类型 变量名1[,变量名2];
int x,y,z;
2.数据类型 变量名=初始值;
int x=10,y=20,z=30;
声明变量之后就可以给变量赋值,赋值语法格式如下:
1.变量名=值;
int x,y,z;
x=10;
y=20;
z=30;
2.变量名=表达式;
int x,y,z;
x=10;
y=x+20;
z=x*y;
- 数据类型的转换
Java变量的数据类型在定义之时就已经确定,但在实际应用中常常根据需要进行转换。帮你如利用short类型标识一个城市的移动电话用户数量。然而随着社会的发展,移动电话用户数的规模不断扩大,现在需要利用int类型才能表示。
- 自动转换
Java会在下列条件都满足时自动进行数据类型的转换: 1.转换前的数值类型与转换后的类型兼容。 2.转换后类型的表示范围比转换前的类型大。类型转换可能会损失信息。下图给出了数值类型间的自动转换规则:
给出一个数值类型转换示例:
public class Demo {
public static void main (String[] args) {
long x=12345678_5678_56L;
float y=x;
System.out.println("y="+y);
}
}
2.6 表达式
- 表达式定义
表达式是用运算符把操作数(常量、变量及方法等)连接起来表达某种运算或含义的式子。表达式根据运算符规则计算后返回一个值,该值的类型称为表达式类型。根据表达式使用的运算符不同,将表达式分为算术表达式、关系表达式、逻辑表达式、赋值表达式等。例如表达式a+88有两个操作数a和88。
- 算数运算符
以下是Java语言中常见的算数运算符。
Java算术运算符与C语言算术运算符的含义和运算规则是相同的。
- 关系运算符
以下是Java语言中常见的关系运算符。
Java关系运算符与C语言关系运算符的运算规则是相同的。在进行关系运算过程中,对于精度较高的类型,如float和double,如果处理不当会出现预想不到的结果。比如:
publicclassDemo{publicstaticvoidmain(String[]args){doublex=3.57;doubley=12.1-8.53;if(x==y)System.out.println("x==y");elseSystem.out.println("x!=y");doublea=26.99;doubleb=6.99+20;if(a==b)System.out.println("a==b");elseSystem.out.println("a!=b");System.out.println("12.1+8.53");System.out.println("6.99+20");}}
偶尔会出现上述不同的运算结果。这并非是Java的BUG。由于计算机内部采用二进制存储浮点数,二进制与十进制浮点数的转化可能发生精度丢失,进而导致精度下降。
- 逻辑与算符
以下是Java语言中常见的关系运算符。
Java逻辑运算符与C语言的逻辑运算符的运算规则是相同的。
下面通过案例演示普通与运算符:
publicclassDemo{publicstaticvoidmain(String[]args){inta=5,b=6;booleanflag=false;if(a>b&99/0==0){//首先执行第一步a>b表达式为false,然后执行第二步发现除数为0,提示错误System.out.println("一个测试");}}}
下面通过案例演示短路与运算符:
publicclassDemo{publicstaticvoidmain(String[]args){inta=5,b=6;booleanflag=false;if(a>b&&99/0==0){//首先执行第一步a>b表达式为false,然后程序短路,执行下行代码。System.out.println(flag);}}}
下面通过案例演示普通或运算符:
publicclassDemo{publicstaticvoidmain(String[]args){inta=5,b=6;booleanflag=false;if(a<b|99/0==0){//首先执行第一步aSystem.out.println("一个测试");}}}
下面通过案例演示短路或运算符:
publicclassDemo{publicstaticvoidmain(String[]args){inta=5,b=6;booleanflag=false;if(a<b||99/0==0){//首先执行第一步aSystem.out.println(flag);}}}
- 赋值运算符
以下是Java语言中常见的赋值运算符。
Java赋值运算符=,以及扩展赋值运算符与C语言的赋值运算符的运算规则是相同的。
- 表达式语句
计算机程序是由若干语句构成的,最基本的语句是表达式语句。在Java语言中,在表达式的末尾加分号;就构成了表达式语句。例如x=3+2是一个表达式,而x=3+2;就是一个赋值型表达式语句。System.out.println(“表达式”)就是一条表达式语句,而System.out.println(“表达式”);就是一条表达式语句。
- 运算符优先级
运算符的优先级决定了表达式中不同运算符执行的先后次序,优先级高的先进行运算,优先级低的后进行运算。在优先级相同的情况下,由结合性决定运算符的运算顺序。
3.1 选择结构
- Java语言的五种语句
1.表达式语句在表达式结尾加上分号为表达式语句。
a=b*c; //赋值表达式
System.out.println("表达式"); //方法调用语句
2.复合语句由{}把若干条语句括起来所构成的语句。
{
int x=9,y=10;
int z=x+y;
System.out.println(z); //由3条语句构成的复合语句
}
3.空语句由一个分号构成的语句。
; //空语句
4.控制语句控制语句分为条件语句和循环语句。
if,if/else,if/else if/else,switch; //条件分支语句
while,do/while,for //循环语句
5.Package语句用于定义包,第一条有效语句。
package com.oracle.www.swk;
6.import语句引入包中的类,package之后的第一条有效语句。
import java.lang.*;
- if语句
if语句是单条件分支语句。在执行过程中,若判断条件为True,则执行语句块,否则执行后面的语句。
if(判断条件){
语句块; //语句主体
}
下面给出一个案例程序演示。输入一个整数a,如果a>0输出提示信息大于0;如果a==0输出提示信息等于0;若a<0输出提示信息小于0。
import java.util.Scanner;
/*
* 输入一个整数,输出该整数的符号
*/
public class Demo {
public static void main (String[] args) {
Scanner scan=new Scanner(System.in);
//使用Scanner的前提是在程序开头加入import语句
int aInt;
System.out.println("请输入一个整数:");
aInt=scan.nextInt();
if(aInt>0)
System.out.println(aInt+"大于0");
if(aInt==0)
System.out.println(aInt+"等于0");
if(aInt<0)
System.out.println(aInt+"小于0");
}
}
- if/else语句
if/else语句在判断条件为假时也会执行相应的语句。在执行过程中,当判断条件为True,执行语句块1,判断条件为False,执行语句块2,然后执行后面的语句。
if(判断语句){
语句块1;
}else{
语句块2;
}
下面给出一个案例程序演示。输入一个分数score,如果score>=60,输出提示信息成绩及格!,否则输出提示信息成绩不及格!。
/** 输入一个成绩值,如果>=60分,给出及格提示信息,否则给出不及格提示信息*/publicclassDemo{publicstaticvoidmain(String[]args){doublescore=80;if(score>=60)System.out.println("成绩及格!");elseSystem.out.println("成绩不及格!");}}
- if/else if/else语句
if/else if/else是多条件分支语句,通常应用在有多种选择情况下。执行过程特点是,根据多种不同条件来执行不同的语句块。若判断满足条件1,则执行语句块1,否则若满足条件2,执行语句块2。若前面的条件都不满足
if(判断条件1){
语句块1;
}else if(判断条件2){
语句块2;
}else if(判断条件3){
语句块3;
}
... //n个else if语句
else
语句块n+1;
}
下面给出一个案例程序演示。输入季节season,值1,2,3,4分别代表着春夏秋冬四季,然后输出季节盛产的主要水果。
/** 输入一个季节,输出该季节生产的主要水果* 用1,2,3,4分别表示一年中的四个季节*/publicclassDemo{//时令水果列表来自https://www.zhihu.com/question/21026884,作者为xichypublicstaticvoidmain(String[]args){intseason=2;if(season==1){//春季System.out.println("春季主要水果:柠檬、枇杷、圣女果、荔枝、枇杷、草莓、桑葚、山竹、樱桃、莲雾、嘉宝果、番石榴等");}elseif(season==2){//夏季System.out.println("夏季主要水果:菠萝、草莓、黑莓、火龙果、蓝莓、荔枝、榴莲、桑葚、桃、山竹、杏、西瓜、香瓜、樱桃、杨梅、椰子、苹果、哈密瓜、龙眼、李子、芒果、蟠桃、油桃、杨桃、百香果、黄桃、猕猴桃、木瓜、葡萄、青提、沙果、无花果、神秘果、释迦果、菠萝蜜、牛油果、莲雾、红毛丹、树莓、蛇皮果、火参果、嘉宝果、黑布林、西梅等");}elseif(season==3){//秋季System.out.println("秋季主要水果:苹果、百香果、菇娘、红提、黄桃、海棠果、火龙果、哈密瓜、龙眼、蓝莓、李子、蜜柑、猕猴桃、木瓜、芒果、葡萄、蟠桃、青提、蛇果、沙果、柿子、山竹、石榴、无花果、西柚、香梨、梨、西瓜、杨桃、枣、菠萝、橄榄、金橘、橘子、脐橙、山楂、香蕉、柚子、甘蔗、罗汉果、砂糖橘、神秘果、人参果、释迦果、菠萝蜜、牛油果、人心果、番石榴、蔓越莓、火参果、嘉宝果、西梅等");}elseif(season==4){//冬季System.out.println("冬季主要水果:菠萝、橄榄、甘蔗、罗汉果、橘子、砂糖橘、香蕉、柠檬、圣女果、蛋黄果、番石榴、嘉宝果等");}else{System.out.println("未能识别您输入的值");}}}
- switch开关语句
switch开关语句是一种分支语句。其中case常量表达式只相当于一个语句标号。当表达式的值和某标号相等则执行对应的语句块,直到break或者语句结束退出该switch语句。使用switch开关语句时应注意:1.表达式的值必须是byte,short,int,char,String和枚举(JDK7新增)。2.在每一个case语句之后需要加入break语句,如果没有该语句则程序会从符合条件的case语句开始一直执行到一个break语句或者switch语句结束为止。3.default语句放的位置是任意的。 4.case常量必须与switch表达式可用的类型相同。
switch(表达式){
case选择值1:语句块1;
break;
case选择值2:语句块2;
break;
......
case选择值n:语句块n;
break;
default:语句块;
}
下面给出一个案例程序演示。输入一个简单的四则运算表达式,输出计算结果。例如输入3+4,输出3+4=7。
publicclassDemo{publicstaticvoidmain(String[]args){intx=3,y=4;intresult=0;charoperator=+;switch(operator){case+:result=x+y;break;case-:result=x-y;break;}System.out.println(""+x+operator+y+"="+result);}}
扩充版源代码:
/** 利用switch语句计算四则运算表达式*例如:40+20=60*/publicclassDemo{publicstaticvoidmain(String[]args){doublex=40.0,y=20.0,result=0;charoperator=+;//运算符switch(operator){case+:result=x+y;System.out.println(x+"+"+y+"="+result);break;case-:result=x-y;System.out.println(x+"-"+y+"="+result);break;case*:result=x*y;System.out.println(x+"*"+y+"="+result);break;case/:result=x/y;System.out.println(x+"/"+y+"="+result);break;default:System.out.println("运算符有误,请查证后重新输入!");}}}
- 条件运算符
对于简单的if…else语句,在语句块只有一条语句时,可以采用条件运算符来代替它。条件运算符?:是一个三目运算符。如果布尔表达式为True,返回表达式1的结果;否则返回表达式2的结果。简单的if…else语句可以用条件运算符替代。
变量 = 布尔表达式?表达式1:表达式2
下面给出一个案例程序演示。输入3个整数,输出这3个数中的最大数。
publicclassDemo{publicstaticvoidmain(String[]args){inta=4,b=6,c=5;intmax=a>b?(a>c?a:c):(b>c?b:c);//若布尔表达式a>b为True,则返回(a>c?a:c);否则返回(b>c?b:c)//a小于b,因此布尔表达式为false,继续计算(b>c?b:c)//b>c成立,因此返回bSystem.out.println(max);}}
3.2 循环结构
- 循环语句
现实应用中,经常需要反复执行相同操作完成一个任务,例如统计字符串中国1978到2018中数字出现的次数,需要重复判断某个字符是否为数字。这种情况则需要利用循环语句。Java语言提供了while、do/while和for等三种循环结构语句。
- 循环语句分类
1.while语句常用于事先不知道循环次数的情况。当判断条件为True时执行循环体语句,为false时退出该while语句。
while (判断条件){
循环体语句块
}
下面给出一个案例程序演示。计算1-100之间所有奇数之和,并输出结果(2500)。
publicclassDemo{publicstaticvoidmain(String[]args){inta=1,sum=0;while(a<=99){//判断条件:当a<=99sum=sum+a;//sum记录存储累加和,结果依次为0+1+3+5+7+...+99a=a+2;//a+2为奇数表达式,结果依次为1,3,5,7,9...99}System.out.println("1+3+5+7+9+...+99="+sum);}}
2.do/while语句常用于事先不知道循环次数的情况。即使循环条件的值开始是假,do/while循环也会执行循环体。因此,do/while循环的循环体至少执行一次。
do{
循环体语句块;
}while(判断条件);
下面给出一个案例程序演示。计算2+22+222+…+2222222(7个2)的结果(2469134)。
publicclassDemo{publicstaticvoidmain(String[]args){longa=2,sum=0;do{sum=sum+a;//存储累加和a=a*10+2;//计算下一个需要累加的数}while(a<=2222222);//判断条件a<=2222222System.out.println("2+22+222+...+2222222="+sum);}}
3.for语句常用于事先知道循环次数的情况。for循环语句圆括号中必须要有两个分号,初值表达式、循环条件、循环过程表达式都可以省略。如果省略了循环条件,则这个循环条件默认为True,将会产生一个死循环。在for循环语句中,还可以把初值表达式放在循环体之外,把循环过程表达式放在循环体内,这种做法与前面的while循环结构类似。
for (初值表达式;循环条件;循环过程表达式){
循环体语句块;
}
下面给出一个案例程序演示。输入一个字符串,统计该字符串中有多少个数字字符。
publicclassDemo{publicstaticvoidmain(String[]args){Stringstr="中国1949年到2020年";intcount=0;//记录数字个数,起始值0for(inti=0;i<str.length();i++){//i为表示字符位置,起始值0//利用str.length()获取字符数量,作为循环条件则为字符的位置要小于字符串的长度13//i++作为循环过程表达式,使用后自增运算符,即i给另一变量赋值后再行自增1。修改字符位置,直到满足iif(str.charAt(i)>=0&&str.charAt(i)<=9)//利用短路与运算符划定数字范围为0至9,只要第一个条件为false则掠过对第二个条件的判断。也可更换为&普通与运算符//charAt() 方法用于返回指定索引处的字符。索引范围为从 0 (第一个字符)到 length() - 1(最后一个字符),此处表示取得字符串str中位置为i的字符count++;//数字字符增加1}System.out.println("总字符数量:"+str.length());System.out.println("数字字符个数:"+count);}}
下面给出另一个案例程序演示。使用for语句模拟输入手机密码,若密码输入正确,给出进入系统的提示信息;若密码输入错误3次,暂停五秒后退出系统。
importjava.util.Scanner;importjava.util.concurrent.*;publicclassDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{try(Scannerscan=newScanner(System.in)){intpwd=2020;for(inti=2;i>=0;i--){System.out.println("欢迎使用Festopia LSC系统!请输入登录密码:");if(scan.nextInt()==pwd){System.out.println("密码正确!欢迎使用!");break;}else{System.out.println("密码不正确,请重新输入!"+"你还有"+i+"次输入机会。");System.out.println();intsec=5;while(i==0)if(sec>0){System.out.println("密码输入错误次数已达上限!将在"+--sec+"秒内关闭登录!");System.out.println("");TimeUnit.SECONDS.sleep(1);}else{System.out.println("系统已关闭登录!");break;}}}}}}
- 死循环
在设计循环结构程序时,经常出现死循环的情况,即循环控制流程一直重复运行循环体语句,而无法退出循环。其原因可能是没有设置正确的循环退出条件。或是退出循环的条件不可能成立等。使用循环语句时,一定要有循环条件为false时的预案,如果循环条件永远为true,那就是死循环。下面给出一个案例程序演示。注意!此为死循环程序示例!一旦开启运行将会导致无限循环!这会占用大量的CPU运算能力!可能会导致系统出现未知的不稳定因素!
publicclassDemo{publicstaticvoidmain(String[]args){intflag=1;//循环标记while(flag>0){System.out.println("死循环");flag++;//循环标记加1,使循环标记不可能小于0}}}
- 嵌套循环
while、do/while和for是三种不同的循环结构语句。作为语句就能够用在任何可以使用语句的地方来使用它们。因此在循环结构语句内部也能够使用循环语句以及选择结构语句。while、do/while和for三种循环语句可以互相嵌套,也可以自己嵌套自己。嵌套循环是指一个循环体内包含另一个循环语句的情况,内嵌的循环中还可以嵌套循环,称为多层循环。
下面给出一个案例程序演示。输入一个整数n,计算1+(1+2)+(1+2+3+)+…+(1+2+3+…+n)
publicclassDemo{publicstaticvoidmain(String[]args){intn=4,sum=0;for(inti=1;i<=n;i++){//外层循环,i从1——n,控制需要累加的最大整数for(intj=1;j<=i;j++){//内层循环,j从1——i,控制从1到某个整数sum=sum+j;//累加和并输出结果}}System.out.println("sum="+sum);}}
- 使用嵌套循环的注意事项
1.三种循环语句可以作为外层循环,也可以作业内层循环。2.假设外层循环的循环次数n次,内层循环的循环次数m次,那么内层循环的循环体实际上需要执行n*m次。3.嵌套循环不仅可以是两层嵌套,还可以是三层嵌套、四层嵌套等。
3.3 跳转语句
- 跳转语句
Java语言中提供了3条跳转类型的语句来控制程序执行流程。根据结构化程序设计原则,在程序开发过程中并不鼓励使用break语句和continue语句,因为它们改变了程序的执行流程,增加了调试步骤与阅读困难度。1.break语句作为单独一条语句使用,用在switch开关语句和循环语句中。break语句在switch语句中使用时,当程序执行到break语句,使程序跳出switch语句,执行switch之后的语句。
switch(表达式){case1:break;case2:break;}
break语句在循环语句中使用时,当程序执行到break语句,中断当前循环语句,然后执行该循环语句的下一条语句,如果break语句出现在嵌套循环中的内层循环,则break语句只会跳出当前层的循环。
while(true){if(判断条件)break;}
下面给出一个案例程序演示。计算sum=1+2+3+…+n,当sum>=1949时,输出n的值。
publicclassDemo{publicstaticvoidmain(String[]args){intx=0,sum=0;while(true){//语句(1),此处为死循环x++;sum=sum+x;if(sum>=1949)//语句(2),当sum>=1949时,退出while循环break;//退出当前循环}System.out.println("x="+x+",sum="+sum);//语句(3)}}
另一种break语句会跳转至标签位置,从而跳出多层循环结构。
break标签;
下面给出一个案例程序演示。
publicclassDemo{publicstaticvoidmain(String[]args){outer:for(inti=0;i<10;i++){//第1行,标签在循环语句前System.out.println("开始内层循环");for(intj=20;j<30;j++){//第3行if(j%3==0)breakouter;//第5行,跳转到第1行标签位置,退出外层for语句if(j%5==0)break;//第7行,跳转到第3行,退出内层for语句}}}}
下面给出另一个案例程序演示。计算sum=1+(1+2)+(1+2+3+…+i),当sum>=2000时,输出i的值。
/** break:标签语句案例* sum=1+(1+2)+(1+2+3)+...+(1+2+3+...+i)* 如果sum>=2000时,输出i的值*/publicclassDemo{publicstaticvoidmain(String[]args){inti=1,sum=0;Outer:while(i<=Integer.MAX_VALUE){//外层循环,控制i可能存在的最大值for(intj=1;j<=i;j++){sum=sum+j;if(sum>=2000)//如果满足sum>=2000breakOuter;//跳转到while循环语句的结尾处(17行)}i++;}System.out.println("sum="+sum+",i="+i);}}
2.continue语句只能用在循环语句中。当程序执行continue语句时,程序流程跳转到循环的开始处继续下一轮循环。
continue;
下面给出一个案例程序演示。输出1-100之间不能被3整除的数,每行输出10个数。
/** continue跳转语句案例* 输出1-100之间不能被3整除的数,每行输出10个数*/publicclassDemo{publicstaticvoidmain(String[]args){intx=1,count=0;System.out.println("输出不能被3整除的数:");for(;x<=100;x++){if(x%3==0)//该数字能够被3整除,跳转到循环语句的开始处continue;if(count%10==0)//若果输出了10个整数System.out.println();//换行System.out.println(x+"");count++;//统计不能被3整除的数字的个数}}}
3.return语句用在方法中。是一种关键字。功能是结束一个方法,而不是改变循环语句的执行流程。当程序执行到一个return语句后,不论该return语句处于多少层循环之内,都会结束该方法。
return;return表达式;
下面给出一个案例程序演示。此程序暂无可用运行结果。
publicclassDemo{voidshow(){for(inti=0;i<100;i++)for(intj=1;j<100;j++)if(i*j>500){System.out.println(i+","+j);return;}}}
声明:本文部分素材转载自互联网,如有侵权立即删除 。
© 版权声明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!邮箱:cxysz1@tom.com
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
THE END
暂无评论内容