(1)JVM:保证Java语言的跨平台特性,针对不同的操作系统提供不同的JVM;
问题:Java语言跨平台吗?JVM跨平台吗?
Java语言是跨平台的,依赖于JVM来实现;但是JVM本身不跨平台。
(2)JRE:Java程序的运行时环境,其包含了JVM和Java核心类库。
(3)JDK:Java开发工具包,为Java开发人员提供的工具,包含了JRE和开发工具。
(1)下载安装JDK
(2)配置环境变量
问题:为什么要配置环境变量?如何配置? 1)path环境变量 为了让javac和java等命令可以在任意的文件目录之下可以使用
配置方法: 新建JAVA_HOME:JDK的安装目录 修改path:在path中添加:%JAVA_HOME%\bin;
2)classpath环境变量(JDK1.5之后不用配置) 为了让class文件可以在任意的文件目录之下可以使用 配置方法:
新建classpath:JDK的安装目录 修改path:在path中添加:%JAVA_HOME%\bin;
总结:配置环境变量就是告诉系统到相应的位置去找需要的文件或者数据
(1)写程序
class HelloWorld{
public static void main(String[] args){
System.out.println("hello, world")
}
}
(2)解释该程序
A:calss 是用来定义类的,格式:class 类名{}
B:程序要独立运行,必须要有主方法作为程序的入口,格式:
public static void main(String[] agrs){}
C:程序要输出类容,必须有输出语句,格式:
System.out.println("hello, world");
(3)程序的编译和运行
A:javac命令编译程序,后面跟上文件全名
javac HelloWorld.java
B:java命令执行程序,后接文件名
java HelloWorld
(4)一个Java程序的开发流程
1)编写源程序代码
2)通过javac命令编译源程序文件,生成字节码文件
3)通过java命令运行字节码文件
(1)注释:用于解释说明程序的文字
(2)分类:
单行://注释内容
多行:/*注释内容*/
文档:/**注释内容*/
(3)案例:
public class HelloWorld{ //一个java入门程序,打印hello, world public
static void main(String[] agrs){ /程序的入口方法 /
System.out.println(“hello, world”);
/*调用println()方法,向控制台输出字符/ } }
(4)注释的作用:
A:解释说明程序,提高程序的阅读性
B:可以协助我们调试程序
(1)关键:被Java赋予特定含义的单词
(2)特点:全文小写
(3)注意事项:
A:goto和const作为保留关键字存在,目前不使用
B:false、true、null不是关键字,但是在编写程序不能作为标识符
(1)标识符:给类、接口、变量、常量、方法所起的名字
(2)命名规则:
A:Java严格区分大小写,并且长度无限制
B:由字母、数字、下划线_、美元符$的任意组合
C:不能以数字开头
D:不能是Java关键字和保留字
(3)常见命名规范
A:包名:全文小写,多级之间用.来分割:com.zero.test
B:类名:驼峰式命名:HelloWorld、MyName、YourWork
C:方法名或变量名:
单个单词全文小写:name、age、show()
多个单词第一个单词全文小写,此后每个单词首字母大写myName、showAllStudentName()
D:常量:
单个单词全文大写:AGE
多个单词全文大写,每个之间用下划线连接:STUDENT_MAX_AGE
F:见文知意
(1)常量:在程序运行过程中,其值没有发生变化的量
(2)分类:
A:字面值常量
B:自定义常量(见后文)
(3)字面值常量
A:字符串常量:用""括起来的内容。"hello,world"
B:整数常量:1,200,300
C:小叔常量:12.5,3.1415926,13.14
D:字符常量:用''括起来的内容。'a','b','0'
E:布尔常量:只有true和false两个
F:空常量:null
(4)整数常量在Java中的表现形式
A:二进制,由0,1组成,并使用0b开头;
B:八进制,由0,1,2,3,4,5,6,7组成,使用0开头;
C:十进制,由0,1,2,3,4,5,6,7,8,9组成,默认是十进制
D:十六进制,由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成,使用0x开头
注意:字母不区分大小写
(1)变量:在程序运行过程中其值发生变化的量,其本质是内存中的一块内存区域,通过变量类型和变量名访问这一块区域
(2)定义格式:
A: 数据类型 变量名 = 初始化值
B: 数据类型 变量名;
变量名 = 初始化值;
(3)注意:作用区域:一对{}之间
(4)分类:
A:基本数据类型变量,4类8种
B:引用数据类型变量,类、接口、数组
1)基本数据类型
整数 占用内存空间(单位:bit)
byte 1 x8
short 2 x8
int 4 x8
long 8 x8
小数
float 4 x8
double 8 x8
字符
char 2 x8
布尔
boolean 1
注意事项:
A:整数默认int类型,小数默认double类型;
B:定义long类型数据时末尾建议加上L或者l,推荐L
定义float类型数据时末尾建议加上F或者f,推荐F
C:引用数据类型大小统一为4个字节,记录的是其引用对象的地址
D:小数float和double不适合用于不允许有舍入误差的金融计算领域;如果要进行不产生舍入误差的精确计算需要使用BigDecimal类。
面试题:Java中的字符可以存储一个汉字吗?为什么?
可以;char型变量是用来存储Unicode编码的字符,Unicode编码包含了汉字,所以char可以存储任何一个包含在Unicode编码中的汉字。另外Unicode编码占两个字节。
2)类型转换
a)自动数据类型提升从:小到大
byte,short,char-->int-->long-->float-->double
b)强制数据类型转换:从大到小
格式: 目标数据类型 变量名 = (目标数据类型)(被转换的数据)
注意事项:
a:boolean不参与类型转换;
b:一般不建议使用强制数据类型转换,因为可能损失精度;
c:int-->float,long-->float,long-->double可损失精度;
d:为byte,short,char等类型变量赋值,只要不超过其范围可以直接赋值;
f:byte,short,char之间不会进行转换,三者在进行计算时会先转换为int类型。
(1)运算: 对常量和变量进行的操作过程
(2)运算符: 对常量和变量进行操作的符号
(3)表达式: 由运算符把常量和变量连接起来的式子,另外,表达式是有结果的
(4)分类:
a: 算术运算符
1)+,-,*,/,++,--
2)整数相除结果是整数,想要得到整数,可以乘以1.0或者除以1.0
3)取于的结果的符号和前面的数一致
4)++,--;在数据之前表示数据先变化,再运算;在数据之前表示先运算,再数据变化;
b: 赋值运算符
1)=,+=,-=,/=,*=,/=,%=
2)+=,-=,/=,*=,/=,%=表示把左边和右边运算的结果赋值给左边,并强制转换为右边的类型
c: 关系运算符
1)==,!=,>,>=,<,<=
2)结果为boolean类型
d: 逻辑运算符
1)&,|,^,!,&&,||
2)单用法
& 有false则为false
| 有true则为true
^ 相同为false,不同为true
! 偶数个,值不变,奇数个,值相反
3)&&左边为false,右边不再执行;||左边为true,右边不再执行
4)优先级:逻辑非!--逻辑与&&--逻辑或||
f: 位运算符
1)&,|,^,~,>>,<<,>>>
2)做位运算,需要将数据转换为二进制
3)^的特点:针对同一个数据异或两次,值不变;
面试题:
1,下面表达式中那一个不能通过编译
(A):short s = 1;s = s + 1;
(B):short s = 1;s +=1;
答案:B,+=表示把左边和右边运算的结果赋值给左边,并强制转换为右边的类型
2,请使用最有效率的方式计算2乘以8的结果
答案:2<<3;
3,请交换变量的值:
int a = 10;
int b = 20;
答案:
a:方式一,引用第三方变量
int temp = a;
a = b;
b = temp;
b:方式二,采用^来实现
a = a ^ b;
b = a ^ b;
a = a ^ b;
g:三目运算符(条件运算符)
格式: 关系表达式?表达式1:表达式2;
计算流程:计算关系表达式的值,如果值为true,表达式1就是结果;如果值为false,表达式2就是结果;
练习题:
A:获取两个数中较大的值
a>b ? a : b;
B:获取三个数中较大的值
a>b ? (a>c ? a :c) : (b>c ? b : c);
C:判断两个数是否相等
a==b ? true : false;
(1)顺序结构: 程序从上之下,依次执行;
(2)选择结构: 根据条件跳转,进行依次执行;
(3)循环结构: 重复执行某一些过程。
**选择结构:if语句**
(1)三种格式
A:格式1:
if(关系表达式){
语句体;
}
执行流程:
a:先判断关系表达式的值
b:如果为true,就执行语句体,否则不执行;
c:执行玩完,之后继续向下执行
B:格式2:
if(关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
a:先判断关系表达式的值
b:如果为true,就执行语句体1,否则执行语句体2;
c:执行玩完,之后继续向下执行
C:格式3:
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}else if(关系表达式3){
语句体3;
}…
else{
语句体n+1;
}
执行流程:
a:先判断关系表达式1的值
b:如果为true,就执行语句体1,否则判断关系表达式2的值;
c:判断关系表达式2的值,如果为true,就执行语句体2,否则判断关系表达式3的值;
d:如果所有的关系表达式都不成立,就执行else里面的语句体n+1;
f:执行玩完,之后继续向下执行。
(2)注意事项
A:关系表达式不论复杂与否,结果必须是boolean类型;
B:if语句的语句体如果是一条语句,{}是可以省略的,如果是多条则不能省略,但是不建议省略;
(3)练习题
A:获取两个数据中较大的值
if(a>b){
System.out.println(a); }else{
System.out.println(b); }
B:获取三个数中较大的值
if(a>b){
if(a>c){
System.out.println(a);
}else{
System.out.println(c);
} }else{
if(b>c){
System.out.println(b);
}else{
System.out.println(c);
} }
c:比较两个数是否相等
if(a==b){
System.out.println("true")
}else{
System.out.println("false")
}
D:跟据键盘录入的x值,计算y=x+1的结果(参考知识点十)
E:根据学生的成绩,输出对应的等级评价(参考知识点十)
F:根据键盘录入的月份,输出对应的季节(参考知识点十)
**选择结构:switch语句**
(1)格式:
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
…
default:
语句体n+1;
break; }
格式说明:
A:看到switch说明这是switch语句
B:表达式的取值
byte,short,int,char
JDK5之后可以是枚举类型
JDK7之后可以是String
面试题:switch的表达式可以是byte吗?可以是long吗?可以是String吗?
C:case后面的值是和表达式进行匹配的
D:break说明语句中断了
E:default和if语句里面的else相似,用于处理所有不匹配的情况。
(2)执行流程
A:计算表达式的值
B:使用表达式的值进行匹配,如果有对应的就执行对应的语句体
C:如果没有对应的就执行default语句之后的语句体
(3)注意事项
A:case后面只能是常量,并且不能重复
B:break可以省略吗?
可以,最后一个肯定可以,中间的也可以,但是不建议省略,因为结果可能不是所需要的,并且会产生case穿透;
C:default不一定要写在语句最后,但是要注意加上break
E:switch语句结束的条件,遇到break或者执行到程序的末尾
(4)if语句和switch语句各自的应用场景
A:if语句
可以对几个常量值进行判断
可以对表达式是boolean类型的进行判断
可以对一个数据范围进行判断
B:switch语句
适合几个常量值的判断
(5)练习题
1、表达式是整数的情况
2、表达式是字符的情况
3、表达式是字符串的情况
4、根据键盘录入的月份,输出相应的季节
**循环结构:for循环**
格式:
for(单次表达式;条件表达式;末尾循环体){
中间循环体; }
执行流程:
A:执行单次表达式
B:判断条件表达式的值,如果为true则执行下一步,否则结束
C:执行中间循环体
D:执行末尾循环体
E:回到B继续执行
循环结构:while循环
格式:
while(条件表达式){
中间循环体;
末尾循环体; }
单次表达式;
while(条件表达式){
中间循环体;
末尾循环体; }
执行流程:
A:判断条件表达式的值,如果为true则执行下一步,否则结束
B:执行循环体
C:回到A继续执行
**循环结构:do…while循环**
格式:
do{
中间循环体;
末尾循环体; }while(条件表达式);
单次表达式;
do{
中间循环体;
末尾循环体; }while(条件表达式);
执行流程:
A:执行中间循环体
B:执行末尾循环体
C:判断条件表达式的值,如果为true则执行下一步,否则结束
注意事项:
A:三种循环的比较
for循环和while循环可以一次都不执行,do…while循环至少执行一次
B:三种循环的使用
a:可以相互转换、相互改写
b:for循环适用于知道循环范围的循环,while循环常用于不知道循环次数的循环
c:当循环中变量的变量需要保留下来供以后计算,则使用while
练习题
A:输出十次"HelloWorld"
B:打印1-10
C:打印10-1
D:计算1-100的和
E:计算1-100中偶数的和
F:打印九九乘法表
G:打印斐波拉其数表
控制跳转语句:break、continue、return
break应用场景:
A:在选择结构switch语句中
B:在循环语句中
continue应用场景:
A:在循环语句中
return:用于结束方法
break和continue的区别
break表示退出整个循环,continue表示退出本次循环
记忆格式:
(1)导包:import java.util.Scanner;
(2)创建键盘录入对象:
Scanner sc = new Scanner(System.in);
(3)获取数据
int i = sc.nextInt();
(4)关闭数据输入
sc.close();
(5)练习题
A:输入两个数并求和
B:输入两个数求最大值
C:输入三个数,求最大值
D:输入两个数,并判断他们是否相等
(1)在同一个类中,方法名相同,参数列表不同的方法。
参数列表不同:个数不同,数据类型不同与返回值无关。
面试题:Java是怎么区分方法的?
首先依照方法名区分,若方法名相同则依照参数列表来区分
(2)练习题:采用方法重载,构造一组比较数据是否相等的方法。
(1)数组:存储同一种数据类型的多个元素的容器
每一个元素都有编号,从0开始编号,最大号数长度-1
(2)格式:
A:数据类型[] 数组名;
B:数据类型 数组名[];
(3)数组的初始化
A:动态初始化:只给长度,不给元素
int[] arr = new int[3];
B:静态初始化:不给长度,直接给元素
int[] arr = new int[]{1,2,3}
简化版:int[] arr = {1,2,3}
(4)Java中内存的分配
A:栈 存储局部变量
B:堆 new出来的东西
C:方法区
D:本地方法区
E:寄存器
(5)两个常见问题
A:数组角标越界
B:空指针异常
(6)数组常见操作
A:获取数组长度 数组名.length
B:数组遍历
C:获取最值
D:数组反转
E:查表法
F:查找指定元素第一次出现的位置
(1)二维数组:元素是一维数组。
(2)格式:
A:数据类型[][] 变量名 = new 数据类型[m][n];
B:数据类型[][] 变量名 = new 数据类型[m][];
C:数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}…};
简化版:数据类型[][] 变量名 = {{元素…},{元素…},{元素…}…};
(3)常见操作:
A:数组遍历
B:元素求和
(1)Java参数传递问题
基本数据类型:形式参数的改变不影响实际参数;
引用数据类型:形式参数的改变直接影响实际参数;
Java中只有值的传递,地址也是一个值。
(2)数据加密问题