![image](http://www.zoncare.com/images/index_r2_c.jpg)
---
# Java入门系列(一)
## 主要内容
* 基础语法
* 基本数据类型
* 修饰符
## 基础语法
第一个例子
```java
public class HelloWorld {
/* 第一个Java程序
* 它将打印字符串 Hello World
*/
public static void main(String []args) {
System.out.println("Hello World"); // 打印 Hello World
}
}
```
### 基本语法
- 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。
- 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。
- 主方法入口:所有的Java 程序由public static void main(String []args)方法开始执行。
### 标识符
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
关于Java标识符,有以下几点需要注意:
- 所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
- 首字符之后可以是任何字符的组合
- 关键字不能用作标识符
- 标识符是大小写敏感的
- 合法标识符举例:age、$salary、_value、__1_value
- 非法标识符举例:123abc、-salary
### 修饰符
像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
- 可访问修饰符 : default, public , protected, private
- 不可访问修饰符 : final, abstract, strictfp
### 变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
### 枚举
Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。
例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。
```java
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDUIM, LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String []args){
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice. FreshJuiceSize.MEDUIM ;
}
}
```
### 关键字
关键字 | 描述
---|---
abstract | 抽象方法,抽象类的修饰符
assert | 断言条件是否满足
boolean | 布尔数据类型
break | 跳出循环或者label代码段
byte | 8-bit 有符号数据类型
case | switch语句的一个条件
catch | 和try搭配扑捉异常信息
char | 16-bit Unicode字符数据类型
class | 定义类
const | 未使用
continue | 不执行循环体剩余部分
default | switch语句中的默认分支
do | 循环语句,循环体至少会执行一次
double | 64-bit双精度浮点数
else | if条件不成立时执行的分支
enum | 枚举类型
extends | 表示一个类是另一个类的子类
final | 表示一个值在初始化之后就不能再改变了,表示方法不能被重写,或者一个类不能有子类
finally | 为了完成执行的代码而设计的,主要是为了程序的健壮性和完整性,无论有没有异常发生都执行代码。
float | 32-bit单精度浮点数
for | for循环语句
goto | 未使用
if | 条件语句
implements | 表示一个类实现了接口
import | 导入类
instanceof | 测试一个对象是否是某个类的实例
int | 32位整型数
interface | 接口,一种抽象的类型,仅有方法和常量的定义
long | 64位整型数
native | 表示方法用非java代码实现
new | 分配新的类实例
package | 一系列相关类组成一个包
private | 表示私有字段,或者方法等,只能从类内部访问
protected | 表示字段只能通过类或者其子类访问,子类或者在同一个包内的其他类
public | 表示共有属性或者方法
return | 方法返回值
short | 16位数字
static | 表示在类级别定义,所有实例共享的
strictfp | 浮点数比较使用严格的规则
super | 表示基类
switch | 选择语句
synchronized | 表示同一时间只能由一个线程访问的代码块
this | 表示调用当前实例或者调用另一个构造函数
throw | 抛出异常
throws | 定义方法可能抛出的异常
transient | 修饰不要序列化的字段
try | 表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码
void | 标记方法不返回任何值
volatile | 标记字段可能会被多个线程同时访问,而不做同步
while | while循环
## 基本数据类型
Java的两大数据类型:
- 内置数据类型
- 引用数据类型
### 内置数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
#### byte:
- byte数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是-128(-2^7);
- 最大值是127(2^7-1);
- 默认值是0;
- byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
- 例子:byte a = 100,byte b = -50。
#### short:
- short数据类型是16位、有符号的以二进制补码表示的整数
- 最小值是-32768(-2^15);
- 最大值是32767(2^15 - 1);
- Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是0;
- 例子:short s = 1000,short r = -20000。
#### int:
- int数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是-2,147,483,648(-2^31);
- 最大值是2,147,483,647(2^31 - 1);
- 一般地整型变量默认为int类型;
- 默认值是0;
- 例子:int a = 100000, int b = -200000。
#### long:
- long数据类型是64位、有符号的以二进制补码表示的整数;
- 最小值是-9,223,372,036,854,775,808(-2^63);
- 最大值是9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是0L;
- 例子: long a = 100000L,Long b = -200000L。
#### float:
- float数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float在储存大型浮点数组的时候可节省内存空间;
- 默认值是0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
#### double:
- double数据类型是双精度、64位、符合IEEE 754标准的浮点数;
- 浮点数的默认类型为double类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是0.0d;
- 例子:double d1 = 123.4。
#### boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true和false;
- 这种类型只作为一种标志来记录true/false情况;
- 默认值是false;
- 例子:boolean one = true。
#### char:
- char类型是一个单一的16位Unicode字符;
- 最小值是’\u0000’(即为0);
- 最大值是’\uffff’(即为65,535);
- char数据类型可以储存任何字符;
- 例子:char letter = ‘A’。
### 引用类型
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Employee、Pubby等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用与任何与之兼容的类型。
- 例子:Site site = new Site("Runoob")。
### Java常量
常量在程序运行时,不会被修改的量。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:
```java
final double PI = 3.1415927;
```
虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。
字面量可以赋给任何内置类型的变量。例如:
```java
byte a = 68;
char a = 'A'
```
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
当使用常量的时候,前缀0�表示8进制,而前缀0x代表16进制。例如:
```java
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
```
和其他语言一样,Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:
```java
"Hello World"
"two\nlines"
"\"This is in quotes\""
```
字符串常量和字符常量都可以包含任何Unicode字符。例如:
```java
char a = '\u0001';
String a = "\u0001";
```
Java语言支持一些特殊的转义字符序列。
符号 | 字符含义
--- | ---
\n | 换行 (0x0a)
\r | 回车 (0x0d)
\f | 换页符(0x0c)
\b | 退格 (0x08)
\s | 空格 (0x20)
\t | 制表符
\" | 双引号
\' | 单引号
\\ | 反斜杠
\ddd | 八进制字符 (ddd)
\uxxxx | 16进制Unicode字符 (xxxx)
## 修饰符
Java语言提供了很多修饰符,主要分为以下两类:
- 访问修饰符
- 非访问修饰符
-
修饰符用来定义类、方法或者变量,通常放在语句的最前端。我们通过下面的例子来说明:
```java
public class className {
// ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// 方法体
}
```
### 访问控制修饰符
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。
- 默认的,也称为 default,在同一包内可见,不使用任何修饰符。
- 私有的,以 private 修饰符指定,在同一类内可见。
- 共有的,以 public 修饰符指定,对所有类可见。
- 受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。
#### 访问控制和继承
请注意以下方法继承的规则:
- 父类中声明为public的方法在子类中也必须为public。
- 父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。
- 父类中声明为private的方法,不能够被继承。
### 非访问修饰符
为了实现一些其他的功能,Java也提供了许多非访问修饰符。
- static修饰符,用来创建类方法和类变量。
- Final修饰符,用来修饰类、方法和变量,final修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
- Abstract修饰符,用来创建抽象类和抽象方法。
- Synchronized和volatile修饰符,主要用于线程的编程。
#### Static修饰符
- 静态变量:
Static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被成为类变量。局部变量不能被声明为static变量。
- 静态方法:
Static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
#### Final修饰符
##### Final变量:
Final变量能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是final对象里的数据可以被改变。也就是说final对象的引用不能改变,但是里面的值可以改变。
Final修饰符通常和static修饰符一起使用来创建类常量。
实例:
```java
public class Test{
final int value = 10;
// 下面是声明常量的实例
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue(){
value = 12; //将输出一个错误
}
}
```
##### Final方法
类中的Final方法可以被子类继承,但是不能被子类修改。
声明final方法的主要目的是防止该方法的内容被修改。
如下所示,使用final修饰符声明方法。
```java
public class Test{
public final void changeName(){
// 方法体
}
}
```
##### Final类
Final类不能被继承,没有类能够继承final类的任何特性。
实例:
```java
public final class Test {
// 类体
}
```
#### Abstract修饰符
##### 抽象类:
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被abstract和final修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
实例:
```java
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}
```
##### 抽象方法
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。抽象方法不能被声明成final和strict。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract sample();
实例:
```java
public abstract class SuperClass{
abstract void m(); //抽象方法
}
class SubClass extends SuperClass{
//实现抽象方法
void m(){
.........
}
}
```
#### Synchronized修饰符
Synchronized关键字声明的方法同一时间只能被一个线程访问。Synchronized修饰符可以应用于四个访问修饰符。
实例:
```java
public synchronized void showDetails(){
.......
}
```
#### Transient修饰符
序列化的对象包含被transient修饰的实例变量时,java虚拟机(JVM)跳过该特定的变量。
该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。
实例:
```java
public transient int limit = 55; // will not persist
public int b; // will persist
```
#### Volatile修饰符
Volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
一个volatile对象引用可能是null。
实例:
```java
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代码
}
}
public void stop()
{
active = false; // 第二行
}
}
```
通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行 中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止。
但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。