java入门
计算机语言发展史
计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言。
Java的核心优势
跨平台是Java语言的核心优势,赶上最初互联网的发展,并随着互联网的发展而发展,建立了强大的生态体系,目前已经覆盖IT各行业的“第一大语言”,是计算机界的“英语”。
虽然,目前也有很多跨平台的语言,但是已经失去先机,无法和Java强大的生态体系抗衡。Java仍将在未来几十年成为编程语言的主流语言。
JAVA虚拟机是JAVA实现跨平台的核心。事实上,基于JAVA虚拟机(JVM)的编程语言还有很多种。
Java各版本的含义
JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用。这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。在上世纪90年代末互联网上大放异彩的Applet也属于这个版本。Applet后来为Flash取代,Flash即将被HTML5取代。
JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用。
JavaEE是JavaSE的扩展,增加了用于服务器开发的类库。如:JDBC是让程序员能直接在Java内使用的SQL的语法来访问数据库内的数据;Servlet能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP是一种可以将Java程序代码内嵌在网页内的技术;
JavaME(Java Micro Edition):微型版,定位在消费性电子产品的应用上
JavaME是JavaSE的内伸,包含J2SE的一部分核心类,也有自己的扩展类,增加了适合微小装置的类库:javax.microedition.io.*等。该版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。
很多人开始会误解为安卓开发就是JavaME,这两个是完全不同的内容。
Java的特性和优势
跨平台/可移植性
这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
安全性
Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。
面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。
简单性
Java就是C++语法的简化版,我们也可以将Java称之为“C+±”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。
高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接待C++的效率。
因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
分布式
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
健壮性
Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
Java应用程序的运行机制
计算机高级语言的类型主要有编译型和解释型两种,而Java 语言是两种类型的结合。
Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class; 最后利用虚拟机(解释器,java)解释执行。
JVM、JRE和JDK
JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。
不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。 Java虚拟机是实现跨平台的核心机制。如图1-6所示。
Java Runtime Environment (JRE) 包含:Java虚拟机、库函数、运行Java应用程序所必须的文件。
Java Development Kit (JDK)包含:包含JRE,以及增加编译器和调试器等用于程序开发的文件。
JDK、JRE和JVM的关系如图1-7所示。
Java运行时环境(JRE)。它包括Java虚拟机(JVM)、Java核心类库和支持文件。
Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器)
老鸟建议:
**·**如果只是要运行Java程序,只需要JRE就可以。JRE通常非常小,其中包含了JVM。
**·**如果要开发Java程序,就需要安装JDK。
JDK下载和安装
地址:
www.oracle.com/technetwork/java/javase/downloads/index.html
JDK的安装目录C:\Program Files\Java\jdk1.8.0_131,可以看到如下的结构:
其中:
- bin目录是存储一些可执行的二进制文件;
- lib存储相关jar包;
- src.zip是JDK相关JAVA类的源代码。
环境变量Path的配置
环境变量是在操作系统中一个具有特定名字的对象, 它包含了一个或者多个应用程序所将使用到的信息。
Path是一个常见的环境变量,它告诉操作系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下寻找此程序外,还应到哪些目录下寻找。
具体看另一份文档。
开发java程序的一点小总结:
1.Java对大小写敏感,如果出现了大小写拼写错误,程序无法运行。
2.关键字public被称作访问修饰符(access modifier),用于控制程序的其它部分对这段代码的访问级别。
3.关键字class 的意思是类。Java是面向对象的语言,所有代码必须位于类里面。
4.一个源文件中至多只能声明一个public的类,其它类的个数不限,如果源文件中包含一个public 类,源文件名必须和其中定义的public的类名相同,且以“.java”为扩展名。
5.一个源文件可以包含多个类class。
6.正确编译后的源文件,会得到相应的字节码文件,编译器为每个类生成独立的字节码文件,且将字节码文件自动命名为类的名字且以“.class”为扩展名。
7.main方法是Java应用程序的入口方法,它有固定的书写格式:
8.public static void main(String[] args) {…}
9.在Java中,用花括号划分程序的各个部分,任何方法的代码都必须以“{”开始,以“}”结束, 由于编译器忽略空格,所以花括号风格不受限制。
10.Java中每个语句必须以分号结束,回车不是语句的结束标志,所以一个语句可以跨多行。
最常用DOS命令
1.cd 目录路径 | 进入一个目录 |
---|---|
2.cd … | 进入父目录 |
3.dir | 查看本目录下的文件和子目录列表 |
4.cls | 清楚屏幕命令 |
5.上下键 | 查找敲过的命令 |
6.Tab键 | 自动补齐命令 |
数据类型和运算符
注释
注释不会出现在字节码文件中,即Java编译器编译时会跳过注释语句。 在Java中根据注释的功能不同,主要分为单行注释、多行注释和文档注释。
- 单行注释: 使用“//”开头,“//”后面的单行内容均为注释。
- 多行注释: 以“/”开头以“/”结尾,在“/”和“/”之间的内容为注释,我们也可以使用多行注释作为行内注释。但是在使用时要注意,多行注释不能嵌套使用。
- 文档注释: 以“/**”开头以“*/”结尾,注释中包含一些说明性的文字及一些JavaDoc标签(后期写项目时,可以生成项目的API)
每个方法和类最好都加个注释。(好习惯)
多行注释可以用来做行内注释。
标识符
标识符是用来给变量、类、方法以及包进行命名的,如Welcome、main、System、age、name、gender等。
标识符需要遵守一定的规则:
- 标识符必须以字母、下划线_、美元符号$开头。
- 标识符其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。
- Java 标识符大小写敏感,且长度无限制。
- 标识符不可以是Java的关键字。
标识符的使用规范
- 表示类名的标识符:每个单词的首字母大写,如Man, GoodMan
- 表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如eat(), eatFood()
- 【注意】:Java不采用通常语言使用的ASCII字符集,而是采用Unicode这样标准的国际字符集。因此,这里字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!
其实也就是分为了三类:类名,常量,其他所有。
另外数据库的字段多为用下划线连接,这样反向工程生成的属性名才有驼峰。
Java中的关键字/保留字
Java关键字是Java语言保留供内部使用的,如class用于定义类。 关键字也可以称为保留字,它们的意思是一样的,我们不能使用关键字作为变量名或方法名。
abstract | assert | boolean | break | byte | case |
catch | char | class | const | continue | default |
do | double | else | extends | final | finally |
float | for | goto | if | implements | import |
instanceof | int | interface | long | native | new |
null | package | private | protected | public | return |
short | static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try | void |
volatile | while |
变量
变量的本质
变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。
Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3; 表示a变量的空间大小为4个字节。
变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。
变量的声明
格式为:
`type varName [=value][,varName[=value]...]; ``//[]中的内容为可选项,即可有可无``数据类型 变量名 [=初始值] [,变量名 [=初始值]…];`
注意事项
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,因此每一个声明都必须以分号结束
不提倡"一行声明多个变量"风格,逐一声明每一个变量可以提高程序可读性。
变量的分类
从整体上可将变量划分为局部变量、成员变量(也称为实例变量)和静态变量。
类型 | 声明位置 | 从属于 | 生命周期 |
局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语句块执行完毕,局部变量消失 |
成员变量(实例变量) | 类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建。对象消失,成员变量也跟着消失; |
静态变量(类变量) | 类内部,static修饰 | 类 | 类被加载,静态变量就有效;类被卸载,静态变量消失。 |
局部变量(local variable)
方法或语句块内部定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。
局部变量在使用前必须先声明、初始化(赋初值)再使用。
【示例】局部变量
public void test() {
int i; int j = i+5 ; // 编译出错,变量i还未被初始化 }
public void test() {
int i; i=10; int j = i+5 ; // 编译正确}
//易错点:
public class LocalValue {
public static void main(String[] args) {
int a = 10;
int b;
int c;
if (a>50){
b=9;
}
//还没写到这里的时候不会出错,写到下面一行的时候就会提示出错了
//因为 if(...){}其实不一定会为b赋值,所以编译也会检测出来,并报下面的错误
c=b+a; //Variable 'b' might not have been initialized
}
}
成员变量(也叫实例变量 member variable)
方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终。
如果不自行初始化,它会自动初始化成该类型的默认初始值。
数据类型 | 实始值 |
---|---|
int | 0 |
double | 0.0 |
char | ‘\u0000’ (空格,\u是Unicode码的意思) |
boolean | false |
【示例2-8】实例变量的声明
public class Test {
int i;
}
静态变量(类变量 static variable)
使用static定义。 从属于类,生命周期伴随类始终,从类加载到卸载。 (注:讲完内存分析后我们再深入!先放一放这个概念!)
如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值,如上表所示。
生命周期:静态变量>成员变量>局部变量
课堂练习1:变量的声明并赋值
public class LocalVariableTest {
public static void main(String[ ] args) {
boolean flag = true; // 声明boolean型变量并赋值
char c1, c2; // 声明char型变量
c1 = '\u0041'; // 为char型变量赋值
c2 = 'B'; // 为char型变量赋值
int x; // 声明int型变量
x = 9; //为int型变量赋值
int y = x; // 声明并初始化int型变量
float f = 3.15f; // 声明float型变量并赋值
double d = 3.1415926; //声明double型变量并赋值
}
}
课堂代码:
/**
* 测试变量
*/public class TestVariable {
int a;//成员变量, 从属于对象; 成员变量会自动被初始化
static int size;//静态变量,从属于类
public static void main(String[] args) {
{
int age; //局部变量,从属于语句块;
age = 18;
}
int salary = 3000; //局部变量,从属于方法
int gao = 13;
System.out.println(gao);
int i;//
int j = i + 5; // 编译出错,变量i还未被初始化
}
}
常量
常量通常指的是一个固定的值,例如:1、2、3、’a’、’b’、true、false、”helloWorld”等。
在Java语言中,主要是利用关键字final来定义一个常量。 常量一旦被初始化后不能再更改其值。
常量名为大写字母和下划线组成。
常量的声明及使用
//声明格式为:
final type varName = value;
public class TestConstants {
public static void main(String[] args) {
final double PI = 3.14;
// PI = 3.15; //编译错误,不能再被赋值!
double r = 4;
double area = PI * r * r;
double circle = 2 * PI * r;
System.out.println("area = " + area);
System.out.println("circle = " + circle);
}
}
一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量,
而使用final修饰的PI等称为符号常量。
基本数据类型
Java是一种强类型语言,每个变量都必须声明其数据类型。
Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。
引用数据类型是用来引用对象,为4个字节(32位)
布尔型大小为1位,与c语言不同,不可以使用0或者非0的整数来代替true和flase.
String是引用数据类型中的类。
整型变量/常量
整型数据类型
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节 | -27 ~ 27-1(-128~127) |
short | 2字节 | -215 ~ 215-1(-32768~32767) |
int | 4字节 | -231 ~ 231-1 (-2147483648~2147483647)约21亿 |
long | 8字节 | -263 ~ 263-1 |
//int型的数据可以直接给byte和short类型的变量赋值
byte a1 = 2, a2 = 4, a3;
short s =16;
//但是如下的语句会报错,因为byte型和short型在计算时会自动转换为int型,结果也是int型。
a3 = a1+a2; 要改为:a3 = (byte)(a1+a2);
s = a1+a2; 要改为:s = (short)(a1+a2);
s = s+a2; 要改为:s = (short)(s+a2);
//但是使用类似 += ,-=的符号,byte型和short型在计算时就不会自动转换为int型
a1 += 1;
s += 1;