Java程序设计基础(修改)
Java最早是由SUN公司(2009年4月被Oracle收购)的James Gosling(詹姆斯·高斯林Java之父)在上个世纪90年代初开发的一种编程语言,最初被命名为Oak,在1995年以Java的名称正式发布,1995年5月23日Java语言诞生。
1999年6月Java又分出了三个不同版本:
Java SE:Standard Edition
Java EE:Enterprise Edition
Java ME:Micro Edition
Java SE就是标准版,包含标准的JVM和标准库,而Java EE是企业版,它只是在Java SE的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE的应用使用的虚拟机和Java SE完全相同。
Java ME就和Java SE不同,它是一个针对嵌入式设备的“瘦身版”,Java SE的标准库无法在Java ME上使用,Java ME的虚拟机也是“瘦身版”,不幸的是,Java ME从来没有真正流行起来。
Java SE是整个Java平台的核心,而Java EE是进一步学习Web应用所必须的。学习Java 应从Java SE入手。2018年9月25日,Java SE 11这个重要版本发布,现在学习应从它开始。JDK 11 官方文档 JDK 11 Documentation - Home
Java 入门-Oracle 技术网 技术资源 | Oracle 中国
编写Java程序注意事项
编写Java程序前应注意以下几点:
大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。
源文件名:如果代码文件中若没有public class,则文件名可以与类名不同,若有保存文件时,应使用类名保存它(记住Java区分大小写)并在名称的末尾使用扩展名称.java,否则会导致编译错误。假设是public class,类名是MyProgram,那么该文件应保存为:MyProgram.java。
主(main)方法入口:所有的Java程序由public static void main(String[] args)方法开始执行。
建议类名的首字母大写,方法名以小写字母开头。
Java 语言是区分大小写的
Java 语言是区分大小写的,也称为大小写敏感,不管是命名变量还是使用关键字。在 Java 中,关键字都是小写的。对于变量名,函数名、函数参数等,需要区分大小写,区分大小写,如A和a是两个不同的变量。
标识符(identifier)
标识符指的是用来识别各种值的合法名称。最常见的标识符有:变量名,函数名。在Java中对象,变量、函数名都是区分大小写的。
标识符命名规则
第一个字符可以是任意 Unicode 字母(运算符、数字除外),以及美元符号($)和下划线(_)。后面的字符可以用数字。Unicode字符包含汉字,故Java标志符可以是中文,但不提倡。关于Unicode 参见https://liyucang-git.github.io/2019/06/17/彻底弄懂Unicode编码/
关键字不能用作标识符,Java关键字是Java语言保留供内部使用的,如class用于定义类。关键字也称作保留字。组成关键字的字母全部小写。注:goto和const作为保留字存在,目前并不使用。main并不是关键字。
Java标识符命名一般遵守如下规范:
类名:通常使用名词,所有单词首字母大写。例如:StudentFamily。
方法名:通常使用动词,首单词字母小写,后续单词首字母大写。例如:openGrade()。
变量名:首单词字母小写,后续单词首字母大写。例如:studentName。
常量名:所有字母都大写。例如:PI
Java中的标点符号
Java使用的标点符号,如()"" '' + - * /:,等等是半角英文的,字符串中(字符串内部)的除外。新手要特别注意这点。
【全角和半角
☆全角:是一种电脑字符,占两个字节。
在全角中,字母和数字等与汉字一样占据着等宽的位置。
☆半角:是指一个字符占一个字节。
半角是ASCII方式的字符。
】
注释
Java 支持以下三种注释方式:一行注释以双斜杠“//”标识;多行注释包含在“/*”和“*/”之间;文档注释包含在“/**”和“*/”之间。
1)单行注释
以双斜杠“//”标识,只能注释一行内容,用在注释信息内容少的地方。
2)多行注释
包含在“/*”和“*/”之间,能注释很多行的内容。为了可读性比较好,一般首行和尾行不写注释信息(这样也比较美观好看),如图 2 所示。
注意:多行注释可以嵌套单行注释,但是不能嵌套多行注释和文档注释。
3)文档注释
包含在“/**”和“*/”之间,也能注释多行内容,一般用在类、方法和变量上面,用来描述其作用。注释后,鼠标放在类和变量上面会自动显示出我们注释的内容
注意:文档注释能嵌套单行注释,不能嵌套多行注释和文档注释,一般首行和尾行也不写注释信息。
如:
/**
文档注释的描述。
@作者(你的名字)
@版本(一个版本号或者一个日期)
*/
public class HelloWorld {
/* 这是一个Java程序
这是一个多行注释的示例
*/
public static void main(String[] args){
// 这是单行注释的示例
System.out.println("Hello World");
}
}
表达式、语句和语句块
Java表达式(Expression)是变量、常量、运算符、方法调用的序列,它执zhi行指定的计算并返回某个确定的值。
按操作数的数目可分为:有一元运算符(++、--)、二元运算符(+、-、>等等)和三元运算符(?:),它们分别对应一到三个操作数。
按运算结果可分为:算术表达式(12.1f+8.3f、i++)、关系表达式(3>7、3<7)、布尔逻辑表达式((5>4)&&true、!false)、位运算表达式(a=34^3)等。
语句(Statement)构成一个完整的执行单元。简单语句用分号(;)终止,如:
iValue = 10; // 赋值语句
double aValue = 8933.234; // 声明语句
System.out.println("Hello World!"); // 方法调用语句
Bicycle myBike = new Bicycle(); // 对象创建语句
控制流语句用于调节语句执行的顺序, 控制流语句包括条件语句、 循环结构 、条件语句、 switch case,后续介绍。
块(Blocks)也称为复合语句,由位于两个大括号之间的0个或者多个语句的组合,可以用于单个语句允许使用的任何地方。语法格式如下:
{
statement-list // 语句列表
}
statement-list 是由一个或者多个语句组成的列表,如果不存在 statement-list,则称该语句块是空的。
关于达式(Expression)、语句(Statement)和语句块(Blocks),可参见Expressions, Statements, and Blocks https://docs.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html
变量
变量指在程序执行的过程中,在某个范围内其值可以发生改变的量。
【A variable is a storage location and has an associated type, sometimes called its compile-time type, that is either a primitive type (§4.2) or a reference type (§4.3).【变量是一种存储位置,并与一种类型相关联,有时也称为编译时类型,该类型要么是基本类型(§4.2),要么是引用类型(§4.3)。】Chapter 4. Types, Values, and Variables】
变量定义格式:数据类型 变量名 = 初始化值;
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。变量按数据类型划分:
引用类型中还有一种特殊的null类型。
【基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构。基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为。Java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。】
变量按被声明的位置划分:
局部变量:方法或语句块内部定义的变量成员变量:方法外部、类的内部定义的变量。
注意:在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。参见 Java学习总结--字符串String类和基本的数据类型有什么区别_string 类型与基本数据类型的区别?_lhj_sjtu的博客-CSDN博客
创建字符串最简单的方式如下:
String greeting = "我的教程";
String类型是不可变的,其内容是不可修改的;如以下代码片段:
String s = "java";
s = "abc123"; //编译时报错
变量的作用域和生存期,在此简单一说,后续还将介绍:
变量的作用域:
作用域从变量定义的位置开始,到该变量所在的那对大括号结束。
生命周期:
变量从定义的位置开始就在内存中活了;
变量到达它所在的作用域的时候就在内存中消失了。
语句太长如何换行
Java默认自动换行功能,只要你不把标识符关键字断开就行,字串肯定不能直接断开写,可分成几部分用+运算符连接, 例如:
public class HelloWorld {
public static void //故意在此换行
main(String[] args) {
String str ="Java 可运行于多个平台," +
"Windows, Mac OS 及其他多种 UNIX 版本的系统。"; //字符串的换行
System.out.println(str);
}
}
使用BlueJ建立新类,名称为:HelloWorld,输入上述的代码,参见下图:
运行之,参见下图:
Java程序的组织结构
下面介绍Java程序的组织结构,对于这一部分,有个总体上的大体了解即可,先不必深究,随着学习的深入,将会逐步理解。
Java程序是由类和接口组成的。
一个简单的java程序,有一个类即可。
一个简单的类,可以仅包含一个入口方法public static void main(String[] args),如下:
public class类名{
…
publicstatic void main(String[] args){
…
}
}
一个比较完整java程序包括下列部分
package语句;
import语句;
publicClassDefinition; // 公共的类定义部分,至多只有一个公共类的定义
// java语言规定该java源程序的文件名必须与该公共类名完全一致
classDefinition;// 类定义部分,可以有0个或多个
interfaceDefinition;// 接口定义部分,可以有0个或多个
一般地,具有相同功能的类放在一个package中。
一个java源程序至多只能有一个公共类(public类)的定义。
若java源程序有一个公共类的定义,则该源文件名字必须与该公共类的名字完全相同。
若源程序中不包含公共类的定义,则源该文件名可以任意取名。
若一个源程序中有多个类定义,则在编译时将为每个类生成一个.class文件(以类名为文件名,以.class作为扩展名,扩展名也称为后缀)。
java源文件又称为编译单元。一个java文件可以包含多个类,但至多包含一个公共类(public类),作为该java文件的公用接口,公共类的名字和源文件的名字要相同,但后缀为.java。
一个java文件中,在不同类中,是可以有多个public static voidmain(String[] args)。
【public static voidmain(String[] args),这是 Java 程序的入口地址,Java 虚拟机运行程序的时候首先找的就是 main 方法。跟 C 语言里面的 main() 函数的作用是一样的。只有有 main() 方法的 Java 程序才能够被 Java 虚拟机运行,可理解为规定的格式。在前一篇中已介绍。】
示例如下:
package lc01;
public class cs {
cs(){
System.out.println("你好啊! world!");
}
public static void main(String[] args) {
new cs();
}
}
class a{
public static void main(String[] args){
}
}
但是,对于一个Java程序而言,往往只需要一个入口,也就是只需要有一个类包含main方法,而其他类都是用于被main方法直接或间接调用的。
如果一个java源程序中含有public的类,则文件名必须与类名一致,如果没有public类,则文件可以随意命名。一个文件中,public的类可以有零个或一个,非public的类可以有零个或多个。
又,public static void main()不是必须要放在public类中,如
package lc01;
class Dog{
Dog(){
System.out.println("I'm a dog.");
}
public static void main(String[] args){
new Dog();
new Cat();
}
}
class Cat{
Cat(){
System.out.println("I'm a cat.");
}
}
文件中没有一个public类,程序也能正常运行。
Java包、公共类与Java源码文件的关系
包(package)是一个为了方便管理组织java文件的组织和管理方式。包内包含有一组类。可以使用import关键字来导入一个包。例如使用import java.util.*就可以导入java.util包里面的所有类。所谓导入这个包里面的所有类,就是在import声明这个包名以后,在接下来的程序中可以直接使用该包中的类。
一个Java源代码文件必须有一个后缀名.java,此文件通常被称为编译单元。在编译单元内有且仅有一个public类,否则编译器就不会接受。该public类的名称必须与文件的名称相同(包括大小写,但不包括后缀名.java)。
当编译一个.java文件(即一个编译单元)时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。因此在编译少量.java文件之后,会得到大量的.class文件。每个.java文件都是一个构件,如果希望许许多多的这样的构件从属于同一个群组,就可以在每一个.java文件中使用关键字package。而这个群组就是一个包。
例如,假设文件的名称是Apple.java,这就意味着在该文件中有且仅有一个public类,该类的名称必须是Apple(注意大小写):
package fruit;
public class Apple
{
//...
}
上面的代码已经将Apple类包含在了fruit包中,现在如果有人想使用Apple或者是fruit中的任何其他public类,就必须使用关键字import来使fruit中的名称可用。
import fruit.*;
public class ImportApple
{
public static void main(String[] args)
{
Apple a=new Apple();
}
}
或者使用带包名的限定名称:
public class QualifiedApple
{
public static void main(String[] args)
{
fruit.Apple a=new fruit.Apple();
}
}
显然使用关键字import使代码更加简洁。
一个项目(Project)可以有几个包,包是为了更好的规划整理你写的各个类,将相关的类放在一个包中。包是为了更好的规划整理你写的各个类。
包(package)的作用
1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
在Java源文件中,如果使用package语句,则package语句应作为第一条可执行语句(它的前面只能有注释或空行),指明该源文件定义的类所在的包。package语句的一般格式为:
package 包名;
包名可以是一个合法的标识符,也可以是若干个标识符加“.”分割而成,包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同。例如 packageaaa.bb.image
则此文件必须存放在aaa\bb\image目录下
如果源程序中省略了package语句,源文件中所定义命名的类被隐含地认为是无名包,即源文件中定义命名的类在同一个包中,但该包没有名字。
包(package)分为无名包和有名包,无名包的好处是无需对包作任何声明,可以拿来方便快捷使用,但也因为无名包没有名字,所以其它包无法用import语句导入访问无名包中的类,所以说无名包只适合在局部应用。而有名包就可以被其它包所访问,先用import语句导入,再用“包名.类名”方式访问指定包中指定的类。
Import语句
在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如:import java.io.*;
导入包的方式:
①、单类型导入(single-type-import),例如import java.util.Date
②、按需类型导入(type-import-on-demand),例如import java.util.*
单类型导入比较好理解,我们编程所使用的各种工具默认都是按照单类型导包的,需要什么类便导入什么类,这种方式是导入指定的public类或者接口;
③、按需类型导入,比如 import java.util.*,可能看到后面的 *,大家会以为是导入java.util包下的所有类,其实并不是这样,我们根据名字按需导入要知道他是按照需求导入,并不是导入整个包下的所有类。按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。
系统包
Java SE 提供了一些系统包,其中包含了 Java 开发中常用的基础类。在 Java 语言中,开发人员可以自定义包,也可以使用系统包,常用的系统包如下表:
包 | 说明 |
java.lang | Java 的核心类库,包含运行 Java 程序必不可少的系统类,如基本数据类型、基本数学函数、 |
java.io | Java 语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出、过滤输入/输出流等 |
java.util | 包含如处理时间的 Date 类,处理动态数组的 Vector 类,以及 Stack 和 HashTable 类 |
java.awt | 构建图形用户界面(GUI)的类库,低级绘图操作 Graphics 类、图形界面组件和布局管理 |
java.awt.image | 处理和操纵来自网上的图片的 Java 工具类库 |
java.wat.peer | 很少在程序中直接用到,使得同一个 Java 程序在不同的软硬件平台上运行 |
java.net | 实现网络功能的类库有 Socket 类、ServerSocket 类 |
java.lang.reflect | 提供用于反射对象的工具 |
java.util.zip | 实现文件压缩功能 |
java.awt.datatransfer | 处理数据传输的工具类,包括剪贴板、字符串发送器等 |
java.sql | 实现 JDBC 的类库 |
java.rmi | 提供远程连接与载入的支持 |
java. security | 提供安全性方面的有关支持 |
附录、
关于public static void main(String[] args) , 参见public static void main(String[] args) 是什么意思? https://www.cnblogs.com/guankelei/p/11327360.html
关于System.out.println(), 参见 你了解System.out.println()的真正含义吗?https://www.cnblogs.com/eniac12/p/5143160.html