Java基础语法
- 第一个Java程序(HelloWorld.java)
1 | public class HelloWorld { // 公开类 |
- 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。
- 类、对象、方法和实例
- 类:类是一个模板,它描述一类对象的行为和状态。
- 对象:对象是类的一个实例,有状态和行为。
- 方法:方法就是行为。
- 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
- 基本语法
- 大小写敏感
- 类名大写
- 方法名小写
- 源文件名必须和类名相同
- 主方法入口:所有的Java 程序由
public static void main(String []args)
方法开始执行
标识符
- 字母、美元符和下划线开始
- 首字符之后可以是任何字符的组合
- 不能使用关键字
- 大小写敏感
修饰符
- 可访问:default, public , protected, private
- 不可访问:final, abstract, strictfp
变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
数组
- 数组可以存储多个同类型的变量。
枚举
- 枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。
注释
- 单行注释:
//
- 多行注释:
/*....*/
- 单行注释:
继承
- 一个类可以由其他类派生。利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。超类→子类。
接口
- 对象间相互通信的协议。
- 接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
关键字
关键字 | 描述 |
---|---|
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支持以下概念:
- 多态
- 继承
- 封装
- 抽象
- 类:类是一个模板,它描述一类对象的行为和状态。
- 对象:对象是类的一个实例,有状态和行为。
- 实例
- 方法
- 重载
举例:定义类
1 | public class Dog{ // Dog类(模板) |
类变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
构造方法
- 构造方法的名称必须与类同名。
- 一个类可以有多个构造方法。
- 如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
创建对象
- 使用关键字new来创建一个新的对象。
- 创建对象的步骤:
- 声明:包括名称和类型。
- 实例化:用new创建对象。
- 初始化:调用构造方法初始化对象。
访问实例的变量和方法
- 运算符:.
1 | /* 实例化对象 */ |
源文件声明规则
- 一个源文件中只能有一个public类
- 一个源文件可以有多个非public类
- 源文件的名称应该和public类的类名保持
- 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
- mport语句放在package语句和类定义之间。
- import语句和package语句对源文件中定义的所有类都有效。
Java包:用于对类和接口分类。
- Import语句是用来提供一个合理的路径,使得编译器可以找到某个类。
基本数据类型
Java两大数据类型:
- 内置数据类型
- 引用数据类型
内置数据类型
- Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
- 四种整数类型:byte、short、int、long。
- 两种浮点型:float、double。
- 一个布尔型:boolean (true、false)
- 一个字符型:char (16 bits Unicode字符)
引用类型
- 类似于C++指针。
- 引用类型指向一个对象,指向对象的变量是引用变量。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用与任何与之兼容的类型。
- 例子:
Site site = new Site("Runoob")
常量
- 使用final关键字修饰常量。
- 一般用大写字母表示。
- 常量前缀:八进制(0)和十六进制(0x)。
- 字符串常量:
"...."
- 字符串常量和字符常量都可以包含任何Unicode字符。
String a = "\u0001";
。
Java变量类型
- 声明变量格式:
type identifier [ = value][, identifier [= value] ...] ;
。 - Java变量类型:
- 局部变量
- 声明在方法、构造方法或者语句块中;
- 用完即毁;
- 只在声明它的方法、构造方法或者语句块中可见;
- 在栈上分配;
- 没有默认值,需要初始化。
- 成员变量(实例变量)
- 声明在一个类中,但在方法、构造方法和语句块之外;
- 可以声明在使用前或者使用后;
- 在对象创建的时候创建,在对象被销毁的时候销毁;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
- 类变量(静态变量)
- 在类中以static关键字声明,但必须在方法构造方法和语句块之外。
- 类只拥有类变量的一份拷贝。
- 静态变量储存在静态存储区。
- 静态变量在程序开始时创建,在程序结束时销毁。
- 静态变量具有默认值。
- 类变量被声明为public static final类型时,类变量名称必须使用大写字母。
- 局部变量
Java修饰符
分为2类:
- 访问修饰符
- 非访问修饰符
访问修饰符
- default,默认的,同一包内可见,不使用修饰符。
- private,私有的,同一类内可见。
- public,公有的,对所有类可见。
- protected,受保护的,同一包和所有子类可见。
基本知识
- 类和接口不能声明为private。
- Private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
- 私有访问类型的变量只能通过类中公共的getter方法被外部类访问。
- public的类、方法、构造方法和接口能够被任何其他类访问。
- 如果几个相互访问的public类分布在不同的包中,则需要导入相应public类所在的包。
- Java程序的main() 方法必须设置成公有的,否则,Java解释器将不能运行该类。
- protected的变量、方法和构造器能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。
方法继承规则:
- 父类中声明为public的方法在子类中也必须为public。
- 父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。
- 父类中声明为private的方法,不能够被继承。
非访问修饰符
- static,创建类方法和类变量。
- final,inal修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
- abstract,创建抽象类和抽象方法。
- synchronized和volatile,用于线程编程。
基本知识:
- 抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
- 如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
- 抽象类可以包含抽象方法和非抽象方法。
- 抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
Java运算符
运算符分类:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
算术运算符
+、-、*、/、%、++、--
- 关系运算符
==/!=、>、<、>=、<=
位运算符
- 应用对象:字节型(byte)、字符型(char)、短整型(short)、整型、长整型。
- &,按位与
- |,按位或
- ^,按位异或
- ~,按位补,翻转每一位
- <<,按位左移
,按位右移
,按位右移补零
逻辑运算符
&&、||、!
赋值运算符
=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
条件运算符(?:)
variable x = (expression) ? value if true : value if false
instanceOf
- 检查该对象是否是一个特定类型(类类型或接口类型)
运算符优先级
Java循环结构
- 三种循环结构:
- while
- do…while
- for(主要用于数组)
- while
- 最基本循环
1 | while( 布尔表达式 ) { |
- do…while
- 至少执行一次
1 | do { |
- for
- for循环执行的次数是在执行前就确定的
1 | for(初始化; 布尔表达式; 更新) { |
- 增强for循环
- 主要用于数组
1 | for(声明语句 : 表达式) |
break
- 跳出一层循环和switch语句块
continue
- 跳过一次循环
Java分支结构
2种分支结构:
- if…else…
- switch
if
1 | if(布尔表达式) |
- if…else…
1 | if(布尔表达式){ |
- if…else if…else
1 | if(布尔表达式 1){ |
- 嵌套的if…else
1 | if(布尔表达式 1){ |
- switch
- 判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
- switch语句中的变量类型只能为byte、short、int或者char。
1 | switch(expression){ |
Number类
- Java语言为每一个内置数据类型提供了对应的包装类。
- 所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类Number的子类。
- 由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。Number类属于java.lang包。
- 区分:内置数据类型和对象?
1 | Integer x = 5; |
Character类
- 用于对单个字符进行操作。
- Character 类在对象中包装一个基本类型 char 的值。
- 需要使用对象,而不是内置数据类型的情况。
- 注意:String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了。 如果需要对字符串做很多修改,那么应该选择使用StringBuffer & StringBuilder 类。
- 用于获取有关对象的信息的方法称为访问器方法。
1 | Character ch = 'a'; |
String类
- 在Java中,String属于对象。
- 创建字符串:
String greeting = "Hello world!";
- 方法:
- 字符串长度:str.length()
- 连接字符串:str.concat()、str1+str2
- 创建格式化字符串
- printf()
- format()
- String类的静态方法format()能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
1 | System.out.printf("浮点型变量的的值为 " + |
StringBuffer和StringBuilder
- 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。
- StringBuilder的方法不是线程安全的(不能同步访问),这一点和StringBuffer不同。
- StringBuilder有速度优势,一般使用它。当程序要求线程安全时,必须使用StringBuffer。
1 | public class Test{ |
Java数组
- Java数组是用来存储固定大小的同类型元素。
- 声明数组变量:
1 | dataType[] arrayRefVar; // 首选的方法 |
- 创建数组(new)
1 | arrayRefVar = new dataType[arraySize]; |
- 创建数组和声明数组变量
1 | dataType[] arrayRefVar = new dataType[arraySize]; |
- 处理数组
- 数组元素类型和大小都是确定的,通常使用基本循环或foreach循环。
- foreach循环或者加强型循环,它能在不使用下标的情况下遍历数组。
- 数组可以作为参数传递给方法。
- 数组作为函数的返回值。
Java日期时间
- java.util包提供了Date类来封装当前的日期和时间。
- Date类提供两个构造函数来实例化Date对象。
- 第一个构造函数使用当前日期和时间来初始化对象。
- 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Java正则表达式
Java正则表达式
- 正则表达式定义了字符串的模式。
- 正则表达式可以用来搜索、编辑或处理文本。
- Java正则表达式和Perl的是最为相似的。
- java.util.regex包主要包括以下三个类:
- Pattern类:pattern对象是一个正则表达式的编译表示。
- Matcher类:Matcher对象是对输入字符串进行解释和匹配操作的引擎。
- PatternSyntaxException类:PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
捕获组
- 捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
Java方法
- System.out.println()
- System:系统类
- out:标准输出对象
- println():方法
- 方法的定义:
1 | 修饰符 返回值类型 方法名 (参数类型 参数名){ |
- 方法调用:
- 根据是否返回值,分为2种:
- 方法返回一个值的时候,方法调用通常被当做一个值。
- 如果方法返回值是void,方法调用一定是一条语句。
- 根据是否返回值,分为2种:
Java Stream、File、IO
- Java.io包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
- Java.io包中的流支持很多种格式。
- 一个流可以理解为一个数据的序列。
- 读取控制台输入
1 | BufferedReader br = new BufferedReader(new |
- 控制台输出
- 控制台的输出由 print( ) 和println( )完成。这些方法都由类PrintStream 定义,System.out是该类对象的一个引用。
- PrintStream 继承了OutputStream类,并且实现了方法write()。这样,write()也可以用来往控制台写操作。