Java概述
Java跨平台原理
- 在不同操作系统上运行Java程序,只需要安装与该操作系统对应的Java虚拟机(JVM),这样可以实现同一个Java程序在不同平台上运行,也就是Java的跨平台原理。
JRE与JDK
- JRE(Java Runtime Environment):Java程序运行时的环境,包含JVM和运行时所需的核心类库。
- JDK(Java Development Kit):Java程序开发工具包,包含JRE和开发人员所使用的工具,其中开发工具包括编译工具javac.exe和运行工具java.exe。
JDK的安装目录
目录名称 | 说明 |
---|---|
bin | 存放了JDK的各种工具命令javac和java在此目录中 |
conf | 存放了JDK的相关配置文件 |
include | 存放了一些平台特定的头文件 |
jmods | 存放了JDK的各种模块 |
legal | 存放了JDK各模块的授权文档 |
lib | 存放了JDK工具的一些补充JAR包 |
基础语法
注释
-
单行注释
格式://注释信息
-
多行注释
格式:/*注释信息*/
-
文档注释
格式:/**注释信息*/
关键字
- 关键字:Java语言中赋予了特殊含义的单词
- 关键字的特点
- 关键字的字母全部小写
- 常用的代码编辑器,针对关键字有特殊的颜色标记
常量
-
常量概述:在程序运行中,其值不可用发生改变的量。
-
常量的分类
常量类型 说明 字符串常量 用双引号括起来的内容 整数常量 不带小数的数字 小数常量 带小数的数字 字符常量 用单引号括起来的内容 布尔常量 布尔值(true,false),表示真假 空常量 一个特殊的值,空值(null)
数据类型
-
Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。
-
数据类型与内存占用
数据类型 内存占用 byte 1 short 2 int(整数默认) 4 long 8 float 4 double(浮点数默认) 8 char 2 boolean 1
变量
-
变量概述:在程序运行过程中,其值可以发生改变的量。
-
变量的定义
格式:数据类型 变量名 = 变量值;
范例:int a = 10;
-
变量使用的注意事项
- 变量不能重复定义
- 变量使用前必须初始化
- 在对float类型的变量进行赋值时,需要在浮点数后加F,因为浮点数默认是double类型,否则会提示超出数据范围。
标识符
- 标识符概述:就是给类,方法,变量等起名字的符号。
- 标识符定义规则
- 由数字、字母、下划线(_)和美元符($)组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
-
常见命名约定
-
小驼峰命名法:方法、变量
- 约定1:标识符是一个单词时,首字母小写
- 约定2:标识符由多个单词组成时,第一个单词首字母小写,其他单词首字母大写
-
大驼峰命名法:类
- 约定1:标识符是一个单词时,首字母大写
- 约定2:标识符由多个单词组成时,每个单词的首字母大写
-
类型转换
-
自动类型转换
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。
-
强制类型转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。
- 格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
- 范例:int k = (int)88.88;
运算符
算术运算符
运算符与表达式
-
运算符:对常量或变量进行操作的符号
-
表达式:用运算符把常量或变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。
符号 作用 + 加 - 减 * 乘 / 除 % 取余 - 整数相除只能得到整数,要得到小数,必须要有浮点数的参与。
字符的+操作
-
当字符之间进行 + 操作时,取字符所对应的ASCII码值进行运算。
-
算术表达式中包含多个基本数据类型的值的时候,整个算术表达式的类型会自动提升。此时与表达式对应的变量(比如a = b + c,a和b + c的类型需相同)要求与表达式同类型,否则会提示不兼容。
提升规则:
-
byte类型,short类型和char类型将被提升到int类型。
-
整个表达式的类型自动提升到表达式中最高等级操作数同样的类型。
等级顺序:byte,short,char -> int -> long -> float -> double
-
字符串的+操作
- 当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算术运算。
- 在“+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算符。(例如1+2+“abc”的结果为3abc),当连续进行“+”操作时,从左到右逐个执行。
赋值运算符
符号 | 作用 |
---|---|
= | 赋值 |
+= | 加后赋值 |
-= | 减后赋值 |
*= | 乘后赋值 |
/= | 除后赋值 |
%= | 取余后赋值 |
- 注意事项:扩展的赋值运算符隐含了强制类型转换。
逻辑运算符
符号 | 作用 |
---|---|
& | 逻辑与 |
| | 逻辑或 |
^ | 逻辑异或 |
! | 逻辑非 |
短路逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 作用和&相同,但是有短路效果 |
|| | 短路或 | 作用和|相同,但是有短路效果 |
注意事项:
-
逻辑与&:无论左边真假,右边都要执行。
短路与&&:如果左边为真,右边执行;如果左边为假,右边不执行。
-
逻辑或|:无论左边真假,右边也要执行。
短路或||:如果左边为假,右边执行;如果左边为真,右边不执行。
三元运算符
-
格式:关系表达式 ?表达式1:表达式2;
范例:a > b ? a : b;
-
计算规则:
- 首先计算关系表达式的值。
- 如果值为true,表达式1的值就是运算结果。
- 如果值为false,表达式2的值就是运算结果。
数据输入
-
使用Scanner进行数据输入
-
使用步骤
-
导包
import java.util.Scanner; //导包的动作必须出现在类定义之前
-
创建对象
Scanner sc = new Scanner(System.in);
-
接收数据
int i = sc.nextInt();
-
-
流程控制语句
- 流程控制语句分类:
- 顺序结构
- 分支结构(if,switch)
- 循环结构(for,while,do...while)
顺序结构
- 顺序结构是程序中最简单最基本的流程控制,没有特点的语法结构,按照代码的先后顺序,依次执行。
分支结构
if语句
-
if语句格式:
if(关系表达式){ 语句体1; } else if(关系表达式2){ 语句体2; } ... else{ 语句体n+1; }
switch语句
-
switch语句格式:
switch(表达式){ case 值1: 语句体1; break; case 值2 语句体2; break; ... default: 语句体n+1; [break;] }
-
格式说明
- 表达式的取值为byte,short,int,char,JDK5以后可以是枚举类型,JDK7以后可以是String。
- break:表示中断,用来结束switch语句。
-
注意事项:在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行,直到遇到break,或者整体switch语句结束。
循环语句
for循环语句
-
for循环语句格式:
for(初始化语句;条件判断语句;条件控制语句){ 循环语句; }
while循环语句
-
while循环语句格式:
初始化语句; while(条件判断语句){ 循环体语句; 条件控制语句; }
do...while循环语句
-
do...while循环语句格式
初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句);
跳转控制语句
- continue:用在循环中,基于条件控制,跳过某次循环内容的执行,继续下一次的执行。
- break:用在循环中,基于条件判断,终止循环体内容的执行,也就是结束当前的整个循环。
Random
-
作用:产生一个随机数。
-
使用步骤:
-
导包
import java.util.Random;
-
创建对象
Random r = new Random();
-
获取随机数
int number = r.nextInt(10); //获取数据的范围为(0,10),包括0,不包括10
-
数组
数组概述
什么是数组
- 数组(array)是一种用于存储多个相同类型数据的存储模型。
数组的定义格式
-
数组的定义格式
- 格式一:数据类型[ ] 变量名
- 定义了一个int类型的数组,数组名是arr。
- 格式二:数据类型 变量名[ ]
- 定义了一个int类型的变量,变量名为arr[ ]。
-
一般情况下使用格式一进行数组定义。
数组初始化
动态初始化
- 初始化时只指定数组长度,由相同为数组分配初始值。
- 初始化格式
- 格式:数据类型[ ] 变量名 = new 数据类型[数组长度];
- 范例:int [] arr = new int [3];(new为数组申请内存空间)
静态初始化
- 初始化时指定每个数组元素的初始值,由系统决定数组长度。
- 初始化格式
- 格式:数据类型[ ] 变量名 = new 数据类型[ ]{数据1,数据2,数据3,....};
- 范例:int [] arr = new int[]{1,2,3};
数组元素访问
-
数组变量访问方式
- 格式:数组名
-
数组内部保存的数据的访问方式
- 格式:数组名[索引] (索引从0开始)
-
数组在初始化时,会为存储空间添加默认值
- 整数:默认值0
- 浮点数:默认值0.0
- 布尔值:默认值false
- 字符:默认值是空字符
- 引用数据类型:默认值是null
内存分配
-
栈内存:存储局部变量(定义在方法中的变量,使用完毕后立即消失)
-
堆内存:存储new出来的内容(实体、对象)
每一个new出来的东西都有一个地址值,使用完毕后会在垃圾回收器空闲时被回收。
数组操作常见问题
- 索引越界:访问了数组中不存在的索引对应的元素,造成索引越界的问题。
- 空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常。
- null:空值,引用数据类型的默认值,表示不指向任何有效对象。
方法
方法概述
-
什么是方法
- 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集。
-
注意:
- 方法必须先创建才可以使用,该过程称为方法定义。
- 方法创建后并不是直接运行的,需要手动使用后才执行,,该过程称为方法调用。
方法的定义和调用
-
方法定义
-
格式:
public [static] 返回值类型 方法名(数据类型1 变量名1,数据类型2 变量名2,...){ //方法体 return 数据; }
-
注意:方法定义时后面的返回值与方法定义上的返回值类型要匹配,否则程序将报错。
-
-
方法调用
-
格式:
数据类型 变量名 = 方法名(变量名/常量值);
-
注意:方法调用时,参数的数量和类型必须与方法定义中设置相匹配,否则程序将报错。
-
方法注意事项
- 方法不能嵌套定义。
- void表示无返回值,可以省略return,也可以单独的写return,后面不加数据。
方法重载
-
概述:方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载。
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
-
注意:
- 重载与返回值无关
- 在调用的时候,Java虚拟机会通过参数的不同来区分同名的方法
字符串
API
API概述
- API(Application Programming Interface):应用程序接口
- Java API:指的是JDK中提供的各种功能的Java类
- java.lang下的类是不需要导包的。
API练习
- 调用方法时,如果方法有明确的返回值,我们用变量接收可以手动完成,也可以使用快捷键的方式完成(Ctrl+Alt+V)。
String
String概述
- String类在java.lang包下,所以使用的时候不需要导包。
- String类代表字符串,Java程序中所有字符文字(例如“abc”)都被实现为此类的实例,也就是说,Java程序中所有的双引号字符串,都是String类的对象。
字符串的特点
- 字符串不可变,它们的值在创建后不能被更改。
- 虽然String的值是不可变的,但是它们可以被共享。
- 字符串效果上相当于字符组(char[]),但是底层原理是字节数组(byte[])。
String构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = "abc"; | 直接赋值的方式创建字符串对象,内容就是abc |
String对象的特点
- 通过new创建字符串对象,每一次new都会申请一个内存空间。
- 以 “ ” 方式给出的字符串,字符串存储于常量池中,String对象指向字符串常量,只要字符串序列相同(顺序和大小写),无论在程序代码中出现几次,JVM建立的String对象始终指向同个常量,并在字符串池中维护。
字符串的比较
-
使用 == 做比较
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
-
字符串是对象,要比较内容是否相同,可以通过方法**equals()**来实现。
public boolean equals(Object anObject)
:通过String对象调用此方法与指定字符串进行比较,使用时需要传入字符串参数。
遍历字符串
-
获取字符串长度的方法:
字符串对象.length();
-
返回字符串中指定索引值的某个字符:
字符串对象.charAt(索引值);
-
拼接字符串的方法:
字符串对象1 + 字符串对象2
-
常用的String方法:
方法名 说明 public boolean equals(Object anObject) 比较字符串的内容,严格区分大小写 public char charAt(int index) 返回指定索引处的char值 public int length() 返回此字符串的长度
String Builder
概述
-
String内存存储方式:
-
StringBuilder是一个可变的字符串类,这里的可变指的是StringBuilder对象的内容是可变的。
-
String和StringBuilder的区别:
- String:内容是不可变的
- StringBuilder:内容是可变的
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
StringBuilder成员方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身,自身已发生改变 |
public StringBuilder reverse() | 反转字符序列,并返回对象本身,自身已发生改变 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
StringBuilder和String相互转换
-
StringBuilder转换为String
public String toString():通过toString()就可以实现把StringBuilder转换为String
-
String转换为StringBuilder
public StringBuilder(String s):通过构造方法可以实现把String转换为StringBuilder
package
包
-
概述:包其实就是文件夹
-
作用:对类进行分类管理
-
包的定义格式:
package 包名; (多级包用.分开)
-
带包的Java类编译和执行
-
手动建包
- cmd里编译java文件(javac xxx.java)
- 手动创建包(建立包相应的文件夹)
- 把class放在包的最里面
- 带包执行(java 包名.xxx)
-
自动建包
javac -d . xxx.java
- 带包执行(java 包名.xxx)
-
导包
-
概述:使用不同包下的类时,使用时要写类的全路径,为了简化带包操作,Java提供了导包功能。
-
格式:
import 包名.类名;
修饰符
权限修饰符
修饰符 | 同一个类中 | 同一个包中子类、无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
private | ✔ | |||
默认 | ✔ | ✔ | ||
protected | ✔ | ✔ | ✔ | |
public | ✔ | ✔ | ✔ | ✔ |
状态修饰符
final
-
概述:final关键字是最终的意思,可以修饰成员方法,成员变量,类。
-
final修饰的特点
- 修饰方法:表明该方法是最终方法,不能被重写
- 修饰变量:表明该变量是常量,不能再次被赋值
- 修饰类:表明该类是最终类,不能被继承
-
final修饰局部变量
- 变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
- 变量是引用类型:final修饰指的是引用类型的地址值不能发生改变
static
-
概述:static关键字是静态的意思,可以修饰成员方法,成员变量。
-
static修饰的特点
- 被类的所有对象共享
- 可以通过类名调用,也可以通过对象名调用
-
static访问特点
- 非静态的成员方法
- 能访问静态的成员变量
- 能访问非静态的成员变量
- 能访问静态的成员方法
- 能访问非静态的成员方法
- 静态的成员方法
- 能访问静态的成员变量
- 能访问静态的成员方法
- 非静态的成员方法