一、Java入门
1. JAVA特性与优势
1.1 Java特性
(1) 跨平台/可移植性
这是Java的核心优势。Java程序的跨平台主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。“一次编译,随处执行”:“write once,run anywhere”
(2) 安全性
Java取消了强大但又危险的指针。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据 或者是其他程序运行所占用的, 并且使用指针也容易数组越界。
Java提供了自动内存管理机制,由垃圾回收器在后台自动回收,
Java在字节码的传输过程中使用了公开密钥加密机制(PKC)。
而在运行环境提供了四级安全性保障机制:字节码校验器 -类装载器 -运行时内存布局 -文件访问限制
(3) 简单性
是C++语法的纯净版,没有头文件,指针运算,结构,联合,操作符重载,虚基类等等。语法基于C,因此学起来完全不费力。
(4) 面向对象
面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。
Java和C++都是面向对象语言,即,它们都能实现面向对象思想(封装,继承,多态);
由于C++为了照顾大量C语言使用者而兼容C,使得自身仅仅成为了带类的C语言,影响了面向对象的彻底性
Java是完全的面向对象语言,句法清晰,规模更小,易学,它是在对多种程序设计语言进行了深入细致研究的基础上,摒弃了其他语言的不足,从根本上解决了C++的固有缺陷
(5) 高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。
Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。
将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接待C++的效率。
因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
(6) 分布式
Java具有支持分布式计算的特征,Java 语言支持 Internet 应用的开发,在 Java
的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
(7) 多线程
多线程的使用可以带来更好的交互响应和实时行为。多线程的简单性是JAVA成为主流服务器端开发语言的主要原因之一。
(8) 健壮性
JAVA是一种健壮的语言,吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如:指针,内存的申请与释放等)。JAVA程序不可能造成计算机崩溃.JAVA系统仔细检测对内存的每次访问,确认它是合法的,而且不致引起任何问题。不过,即使JAVA程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该例外抛弃。再通过异常处理机制,程序就会发现这类例外,并加以处理。
1.2 Java优势
跨平台是Java语言的核心优势,赶上最初互联网的发展,并随着互联网的发展而发展,建立了强大的生态体系,目前已经覆盖IT各行业的“第一大语言”,是计算机界的“英语”。
虽然,目前也有很多跨平台的语言,但是已经失去先机,无法和Java强大的生态体系抗衡。Java仍将在未来几十年成为编程语言的主流语言。
基于JAVA生态建立的产品将会越来越多;基于JAVA虚拟机的编程语言也将会越来越多;生态系统的强大,是JAVA能长盛不衰的根本。
2. JDK、JRE、JVM
JDK: Java Development Kit (Java开发者工具, 包括JRE和JVM)
JRE: Java Runtime Environment (Java运行时环境, 包括JVM)
JVM: Java Virtual Machine (Java虚拟机, 跨平台的核心技术)
3. Java运行机制
- 编译型: 使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
- 解释型: 使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。
- 程序运行机制
二、Java基础语法
1. 注释、标识符、关键字
1.1 Java中三种注释
(1) 单行注释
// 注释
(2) 多行注释
/* 注释 */
(3) 文档注释
/** */ (可加入注解@,一般少用,大公司常用)
1.2 标识符、关键字
(1) 关键字
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。
(2) 标识符
Java的所有组成部分都需要名字。类名、变量名以及方法名都被成为标识符
标识符的注意点:
2. 数据类型
2.1 强类型语言
要求变量的使用要严格符合规定, 所有变量都必须先定义后才能使用。
比弱类型更加安全 !!!
2.2 Java的数据类型
基本类型 ( primitive type)
引用类型 ( reference type)
2.3 什么是字节(延伸)
- 位 (bit): 是计算机 内部数据 储存的最小单位, 11001100是一个八位二进制
- 字节 (byte): 是计算机中 数据处理 的基本单位, 习惯上用大写 B 来表示
- 1 B (byte, 字节) = 8 bit (位)
- 字符: 是指计算机中使用的字母、数字、字和符号
1 bit 表示 1 位
1 Byte 表示一个字节 1B = 8 b
1024 B = 1 KB
1024 KB = 1 M
1024 M = 1 G
2.4 数据类型拓展
public class Demo {
public static void main(String[] args) {
// 整数拓展 进制 二进制 0b 十进制 八进制0 十六进制 0x
int i1 = 10;
int i2 = 010; //八进制 0
int i3 = 0x10; //十六进制 0x
System.out.println(i1); // 10
System.out.println(i2); // 8
System.out.println(i3); // 16
System.out.println("==========================");
//===============================================================
// 浮点数拓展
// 银行业务 BigDecimal 数学工具类
//===============================================================
//float 有限 离散 舍入误差 大约数 接近但不等于
//double
// 最好完全避免使用浮点数进行比较
float f = 0.1f; //0.1
double d = 1.0/10; //0.1
System.out.println(f == d); //false
float d1 = 211111111111111111122f;
float d2 = d1 + 1;
System.out.println(d1 == d2); //true
System.out.println("==========================");
//===============================================================
// 字符拓展
//===============================================================
char c1 = 'a';
char c2 = '中';
System.out.println( c1 ); // a
System.out.println( (int)c1 ); //强制转换 97
System.out.println( c2 ); // 中
System.out.println( (int)c2 ); //强制转换 20013
//所有字符本质还是数字
//编码 Unicode 表: ( 97 = a 65 = A ) 2字节 0 - 65536 Excel 2^16 = 65536
//U0000 UFFFF
char c3 = '\u0061'; // 0061 为十六进制,十进制数为 97 \u 转义字符输出 Unicode 表
System.out.println(c3); // a
//转义字符
// \t 制表符
// \n 换行符
System.out.println("==========================");
String sa = new String("hello world");
String sb = new String("hello world");
System.out.println(sa==sb); //false
/*
* 上边比较的是地址, new String() 新建了地址, 字符存储在不同地址中, 应该用 equals()方法进行比较
* 下边比较的是常量, 字符都存放在常量池中
*/
String sc = "hello world";
String sd = "hello world";
System.out.println(sc==sd); //true
}
}
3. 类型转换
3.1 类型转换
不同数据类型转化为同一类型,然后进行运算。
- 低------------------------------------------------------------->高
- byte,short,char —> int —> long —> float —> double
低转高自动转换
高转低强转会内存溢出,数据丢失
数字之间可以用下划线分割 ——> 10_0000_0000
3.2 类型强制转换
(数据类型) 变量或数值 ——> (int) a
4. 变量、常量
4.1 变量
形如: 数据类型 变量名 = 数值;——-> int a = 10;
(1) 局部变量
局部变量在方法里面有效期在方法里面,必须声明和初始化值。
(2) 实例变量
从属于对象在类里面方法外边,不需要初始化值也可以使用但是需要声明。
下面是使用方法:
- 变量类型 变量名字 = new 类名字();
- Student student = new Student();
- student.变量
- 如果没有初始化数值变量默认为0,0.0。布尔值默认为false。其他的类型为null。
(3) 类变量
在实例变量前面加上static就变成类变量了,类变量在类里面可以直接调用。
4.2 常量
常量在初始化后就不能再改变!
final 常量名 = 值;——> final double PI = 3.14;
一般来说常量名使用大写字符。
5. 运算符
加减乘除+-*/
除余% ——> 12%5 == 2
自增自减++ --
a++是先赋值再自增,++a是先自增再赋值。
a=10; b = a++; b == 10;
a=10; b = ++a; b == 11;
赋值 = ———> a = 10;
大于,小于,大于等于,小于等于 >,<,>=,<=
等于,不等于 ==,!=
与或非 &&,||,!
a+=1 == a=a+1
位运算符:&,|,^,~,>>,<<,>>>
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~B = 1111 0010
三元运算符:x ? y : z ——-> 如果x == true,则结果为y,否则结果为z。