Java 基础语法

Java 是 SUN (Stanford University Network, 斯坦福大学网络公司) 于 1995 年推出的一门高级语言。Java 是一种面向 Internet 的编程语言,也是一种完全面向对象,安全可靠,与平台无关的编程语言。

Java5.0 之后的三大技术框架

  • J2EE (Java 2 Platform Enterprise Edition) 企业版

在 Jdk5.0 版本后称为 JAVAEE,是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如 Servlet Jsp 等,主要针对于 Web 应用程序开发。

  • J2SE (Java 2 Platform Standard Edition) 标准版

在 Jdk5.0 版本后称为 JAVASE,这是在 Java 基础阶段主要学习的内容,也是 Java 的基础,以后不管从事 Android 开发或者是物联网 + 云计算的开发等,是建立在 JSE 基础上的,因此该技术是 Java 的最核心技术。

  • J2ME (Java 2 Platform Micro Edition) 小型版

在 Jdk5.0 版本以后称为 JAVAME,该技术多应用于一些电子产品的嵌入式开发,以前在手机开发上应用的也比较多,但是随着智能手机的发展,现在手机应用程序 (比如 Android 程序) 的开发已经不再使用该技术。

JRE (Java Runtime Environment),Java 运行环境。包括 Java 虚拟机 (JVM Java Virtual Machine) 和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

JDK (Java Development Kit Java),开发工具包。JDK 是提供给 Java 开发人员使用的,其中 包含了 Java 的开发工具,也包括了 JRE。所以安装了 JDK,就不用在单独安装 JRE 了。

JVM (Java Virtual Machine),是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,是 Java 最具吸引力的特性之一。JVM 读取并处理编译过的与平台无关的字节码 (class) 文件。


  1. 单行注释
1
// 单行注释
  1. 多行注释
1
2
3
4
5
/* 多
 */
  1. 文档注释
1
2
3
/**
 * 文档注释
 */

标识符命名规则:

  • 由字母、数字、下划线、$ 组成,不能以数字开头
  • 区分大小写
  • 不能使用关键字和保留字
  • 不能使用 Java API 的类名

变量:占据着内存中的某一个存储区域,该区域有名称 (变量名) 和类型 (数据类型),数据在同一类型范围内不断变化。

定义变量的格式:

数据类型 变量名 = 初始化值

作用范围:定义开始到定义它的代码块结束

警告
注意同一作用域内,不允许定义多个同名局部变量!
  1. 局部变量
  • 定义在方法内的变量
  • 没有默认初始值,使用前必须初始化
  • 作用域是从定义开始到定义它的代码块结束
  1. 成员变量
  • 定义在方法内的变量
  • 作用域是在整个类中

Java 语言有 8 种基本数据类型,按用途分为以下 4 种类别:

类别 数据类型
整数型 byte、short、int、long
小数型 float、double
字符型 char
布尔型 boolean

容量小的类型可自动转换为容量大的数据类型!

容量大的类型不会转换为容量小的数据类型!

技巧

小转大,自动!自动类型转换 (也叫隐式类型转换)

大转小,强转!强制类型转换 (也叫显式类型转换)

类别 运算符
算术运算符 +、-、*、/、%
复制运算符 =、+=、-=、*=、/=、%=
关系运算符 >、>=、<、<=、!=
条件运算符 &&、||、!、&、|、^
位运算符 &、|、^、~、>>、<<、>>>、<<<
注意

“&”和“&&”的区别:单与时,左边无论真假,右边都进行运算。双与时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

“|”和“||”的区别:同理,双或时,左边为真,右边不参与运算。

表达式是由数字、运算符和括号等组合能够计算数值的序列,按从高到低优先级依次计算。

三目运算符的格式:

1
x ? y : z;

其中 x 为 boolean 类型表达式,若 x 为 true,则三目运算符的结果为 y 的值,否则为 z 的值。

  1. 顺序结构

程序从上至下依次执行,直到程序的最后。

  1. 分支结构
  • if-else 语句
  • switch-case 语句
注意
switch 语句只能使用 byte、char、short、int 四种基本类型以及它们的包装类和枚举!
  1. 循环结构
  • while: 不知道循环次数
  • do-while: 不知道循环次数但是至少执行一次
  • for: 知道循环次数
1
2
3
for (1; 2; 3) {
    4;
}

执行顺序:1 -> 2 -> 4 -> 3 -> 2 -> 4 -> 3

无限循环格式

1
2
3
4
5
6
7
while (true) {
    // do something
}
// or
for (;;) {
    // do something
}
  1. 控制循环结构
  • break: 终止本层循环
  • continue: 跳过本次循环

方法是一组为了实现特定功能的代码块的集合。

1
2
3
4
[修饰符] 返回值类型 方法名([参数类型 形式参数1, 参数类型 形式参数2, ...]) {
    执行语句;
    [return 返回值;]
}

访问控制符是限定方法的可见范围。按可见范围从大到小依次是:publicprotected、无、private,其中默认为无访问控制符。

属性 含义
形式参数 方法调用时接收输入的数据
实际参数 方法调用时实际传入的数据
返回值 方法执行完后返回的数据
返回值类型 返回值的数据类型
方法签名 方法名和方法的参数列表

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或者参数顺序不同即可。

函数重载与返回值类型无关,只与参数列表有关。

1
2
3
4
// eg.
public void func(int a);
public int func();
public void func(int a, String s);

从 java5 开始出现了可变参数,这是对 java 方法及数组的拓展!

可变参数定义格式:

1
2
3
返回值类型 方法名(参数类型 ... 形式参数) {
    // do something
}
注意
可变参数只能出现在参数列表的最后!

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。


数组 (Array) 是 Java 语言中内置的一种基本数据存储结构,通俗的理解,就是一组数的集合。

  • 数组的元素编号从 0 开始,依次递增,方便访问。
  • 必须先声明数组,再给数组分配内存。
  • 数组对应内存中的一段连续空间。
  • 数组元素是同一类数据类型。
  1. 声明
1
2
3
type varName[];
// or
type[] varName[];  // 推荐
  1. 初始化
  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
1
2
3
数组名 = new 数组类型[]{元素1,元素2...};
// or
数组名 = {元素1,元素2...};  // 简化
  • 动态初始化:初始化时指定数组长度,由系统为数组元素分配初始值。
1
数组名 = new 数组类型[数组长度];
注意
静态初始化和动态初始化不能同时使用!
  1. 数组的使用
1
2
3
4
5
6
7
8
public class Demo {
    public static void main(String[] args) {
        int[] age = {1, 2, 3, 4, 5};
        for (int i = 0; i < age.length - 1; ++i) {
            System.out.println("age[" + i + "] = " + age[i]);
        }
    }
}

二维数组其实是一个大的一维数组,它的每一个元素都是一个一维数组,可以看作是一张表格。

1
2
int[][] arr = {{1, 2}, {3, 4}};  // 静态初始化
int[][] arr = new int[2][2];     // 动态初始化
注意
使用数组工具类可以节省时间,提高效率,注意常查阅 api!
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
static int binarySearch(type[] a, type key);  // 二分搜索法
static int binarySearch(type[] a, int fromIndex, int toIndex, type key);  // 二分搜索法
static boolean[] copyOf(type[] original, int newLength);  // 复制指定的数组
static byte[] copyOfRange(type[] original, int from, int to);  // 将数组的指定范围复制到一个新数组
static boolean equals(type[] a, type[] a2);  // 判断数组元素相等
static void fill(type[] a, type val);  // 数组所有元素都赋为 val
static void fill(type[] a, int fromIndex, int toIndex, type val);  // 数组元素都赋为 val
static void sort(type[] a);  // 按升序排序
static void sort(type[] a, int fromIndex, int toIndex);  // 按升序排序
static String toString(type[] a);  // 返回字符串表示形式
1
2
3
for (type varName : arrName) {
    // do something
}

面向对象 (Object-Oriented,简称 OO) 就是一种常见的程序结构设计方法。面向对象思想的基础是将相关的数据和方法放在一起,形成一种新的复合数据类型。

面向对象的三个特征:

  • 封装
  • 继承
  • 多态

面向过程强调的是具体的功能实现,面向对象强调的是具备功能的对象。

类 (class) 是Java 语言的最小编程单位,也是设计和实现Java 程序的基础。

类是一组事物共有特征和功能的描述。类是抽象的,对象是具体的。

类的定义格式:

1
2
3
4
5
[修饰符] class 类名 {
    构造方法;
    字段;
    方法;
}
  • 构造方法是用来构造类的实例,每一个类都有默认的无参构造方法。
  • 字段是类或对象所包含的数据,对类状态的一种描述。
  • 方法是类或对象的特征或行为。

作用:给类中的字段初始化,可以用来创建对象。

注意
构造方法与类名相同,没有返回值。多个构造方法以重载的形式存在。

static 的特点:

  • 随着类的加载而加载
  • 优先于对象存在
  • 被所有对象所共享
  • 可以直接被类名调用
注意
  1. 静态方法只能访问静态成员,但是非静态方法可以访问静态成员。
  2. 静态方法中不可以使用 thissuper 关键字
  3. 利用类名调用静态 main 方法会陷入死循环,导致内存溢出,jvm 自动停止!

static 修饰的字段和方法表示属于类共用,而不属于单个实例。既可以通过类调用,也可以通过实例调用。

匿名对象是指一个没有名字的对象,只能调用一次。

this 表示当前对象。

在类的构造器中相互调用,this 只能写在构造方法的第一行!

TODO