一.Java概述与环境配置
1.java由来
1995年推出的面向对象的编程语言。三个平台Java SE、Java EE、Java ME, 2014年发布的JDK8是商用主流版本。
2.java语言特点
- 面向对象
- 简单性
- 跨平台性
3.java执行机制
先编译再解释:
- 将源文件(.java文件)编译成字节码文件(.class文件);
- 然后将字节码文件解释执行
名词解释:
Jdk: java develop kit ,Java开发工具包:包含了jre以及相关工具;
Jre: java runtime environment:Java运行环境:包含Jvm以及Java所有需要的核心类库rt.jar;
JVM(Java Virtual Machine)虚拟机:使用软件在不同操作系统中,模拟相同的环境。
4.配置环境变量两种方式
1)将jdk安装目录的bin目录路径作为path变量中的某个变量直接引用;
2)系统变量:
变量名:JAVA_HOME ;
变量值:Jdk的安装目录
在path:引入JAVA_HOME变量 :%JAVA_HOME%\bin
5.类的阐述
- 同一个源文件中可以定义多个类。
- 编译后,每个类都会生成独立的.class文件。
- 一个类中,只能有一一个主方法,每个类都可以有自己的主方法。
- public修饰的类称为公开类,要求类名必须与文件名称完全相同,包括大小写。
- 一个源文件中,只能有一个公开类
6.Package(包)
- 作用:类似于文件夹,用于管理字节码(.class) 文件
- 语法:package包名; 位置:必须写在源文件的第一行
- 带包编译:javac -d .源文件名称.java (自动生成目录结构)
- 带包运行: java包名.类名 (包名+类名又称全限定名)
- 采用域名倒置的规则: www.baidu.com.cn -> cn.com.baidu.xxx
7.编码规范
(1)书写格式 :
- 层级之间必须缩进 (Tab:一个指标位)
- 一行写一句代码
package Test
class Test1{
public static void main (String[] args){
System.out.println("hello world");
}
}
(2)代码注释 :
单行注释: // 第一天上java课
多行注释: /* 不难很难艰难 */
文档注释: /* * *如果不知道明天的路该往那走 */
注:文档注释生成外部文档,注释不参与编译
(2)标识符命名 :
语法规定:
- 可以由:字母、数字、. 、$组成,但不能以数字开头。
- 不能与关键字、保留字重名。
约定俗成:
- 望文生义、见名知义。
- 类名由一个或多个单词组成,每个单词首字母大写(pascal) 。
- 函数名、变量名由一个或多个单词组成,首单词首字母小写,拼接词首字母大写(camel) 。
- 包名全小写,只可以使用特殊字符“."并且不以“."开头或结尾。
- 常量全大写,多个单词用_ 连接。
8.关键字和标识符
关键字:被java赋予特定含义的单词(小写字母);
关键字 | 含义 |
private | 一种访问控制方式: 私用模式 |
public | 一种访问控制方式: 共用模式 |
protected | 一种访问控制方式: 保护模式 |
abstract | 表明类或者成员方法具有抽象属性 |
class | 类 |
if | 条件语句引导词 |
else | 条件语句,不成立时关键词 |
import | 表明访问包或类 |
break | 跳出语句,结束选择 |
package | 包名 |
二.常量
1.常量定义与分类
- 定义:在程序运行过程中,其值不发生改变
- 分类:字面值常量,自定义常量
字面值常量包括:
- 整数常量:所有的整数;
- 小数常量:所有的小数
- 字符常量:将一个字符用单引号引起来,必须有内容
‘a’ ,‘A’,‘0’:单独使用输出的字符本身
参与运算:找ASCII码表的值
‘A’:65
‘a’:97
‘0’:48- 字符串常量:双引号引起来的内容,可以写多个字符,也可以不写
- 布尔常量 只有两个值:true,false 空常量:只有一个值(null)
2.进制概述与转换
- 进制:就是进位制,是人们规定的一种进位方法。 运算时是逢X进一位。
2.1任意进制转换
- 间接转换:x进制–>十进制–>y进制
(1)将x进制通过按权展开法则(把系数乘以基数权次幂之积求和)转换为十进制;
(2)然后将十进制得到的数除以进制数逆序取余即可得到y进制; - 直接转换:利用8421码可解决
2.2有符号的数据表示法
在计算机内,有符号数有3种表示法:原码、反码和补码。所有数据的运算都是采用补码进行的。
- 原码:二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小
- 反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
- 补码 正数的补码与其原码相同;负数的补码是在其反码的末位加1。
三.变量
1.变量概述
在程序运行过程中,其值不断发生变化;
2.数据类型
Java的数据类型分为两大类:
- 基本数据类型:包括 整数、浮点数、字符、布尔。
- 引用数据类型:包括 类、数组、接口。
基本数据类型:
- 整数类型:byte,int(默认),short,long(建议数据后加L表示);
- 浮点数类型:float(建议数据后加F表示),double
- 字符类型:char
- 布尔类型:boolean
3.变量定义
三要素:变量名(见名知意),数据类型,初始化值
格式
数据类型 变量名 = 数据值;
3.4 注意事项
- 变量名称:在同一个大括号范围内,变量的名字不可用相同
- 变量赋值:定义的变量,不赋值不能使用。
四.数据类型转换
1.隐式转换
定义:默认类型提升,将取值范围小的类型自动提升为 取值类型大的范围。
转换规则:
byte、 short 、 char – >int – >long – >float – >double注: byte,short,char三者之间不转换,一旦运算,先转换为int类型进行计算!
2.显示转换
强制类型转换:将取值范围大的类型 强制转换成 取值范围小的类型。
格式:
目标数据类型(目前基本类型) 变量名 = (目标数据类型)初始化值;
问题:如果byte的值超出了范围,如何解决这个问题
解决:强制类型转换
原,反,补-----补码进行截取---->反码---->原码
强烈注意
- 浮点转成整数,直接取消小数点,可能造成数据损失精度。
- int 强制转成 short 砍掉2个字节,可能造成数据丢失。
五.运算符
分类:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
1.算数运算符
- +,-,/都是比较简单的操作
- +的几种作用: 加法 正数 字符串连接符
- ++和–的应用 单独使用效果相同 参与运算使用,在操作数的前后效果不同
- ++/–在变量前面:先进行自增或者自减,然后参与运算
- ++/–在后面:先运算,在自增或者自减
2.赋值运算符
+=,*=,-=,/=,%=… (隐藏了强制类型转换)
3.关系运算符
==,!=,<,>,>=,<=,instanceof,
注1:比较运算符的结果都是boolean型,也就是要么是true,要么是fals
注2:比较运算符“==”不能误写成“=”
4.逻辑运算符
&(与),|(或),^(异或),!(非),&&(双与),||(双或)
- 逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
- “&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算。
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算(短路效果,一般建议使用)。 - “|”和“||”的区别同理,双或时,左边为真,右边不参与运算
- 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
5.位运算符
位运算是直接对二进制进行运算。
位异或的特点以及<<,>>的特点
位异或:^ 一个数据被另一个数据位异或两次,其值是该数据本身!
<<: 将<<左边的数据值乘以2的移动次幂 2<<3 2*2^3
6.三目运算符
格式: (关系表达式)?表达式1:表达式2;
- 如果条件为true,运算后的结果是表达式1;
- 如果条件为false,运算后的结果是表达式2;
六.键盘录入数据
实现步骤:
- 导包(位置放到class定义的上面)
import java.util.Scanner; - 创建对象
Scanner sc = new Scanner(System.in); - 接收数据
int x = sc.nextInt();
七.流程控制语句
流程控制语句的分类:
- 顺序结构语句
- 选择结构语句
- 循环结构语句
1.顺序结构语句:
- 是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
- 总的来说:写在前面的先执行,写在后面的后执行
2.选择结构语句:
2.1 if语句
if语句格式1
if(关系表达式){
语句体;
}执行流程:
- 首先判断关系表达式看其结果是true还是false
- 如果是true就执行语句体
- 如果是false就不执行语句体
if语句格式2
if(表达式){
语句1;
}else{
语句2;
}
执行流程:
- 表达式是否成立,如果成立,执行语句1,否则,执行语句2;
注意事项 :
- 关系表达式无论简单还是复杂,结果必须是boolean类型
- if语句控制的语句体如果是一条语句,大括号可以省略;
- 如果是多条语句,就不能省略。建议永远不要省略
- 一般来说:有左大括号就没有分号,有分号就没有左大括号
if语句格式2它和三元运算符的区别?
if语句格式2范围更大一些:推荐使用if语句格式2
if语句格式2:既可以操作具体的数据值/也可以操作输出语句
三元运算符:仅仅是作为一个运算符,一般都是操作具体的数据值!
int a = 10 ; int b =20 ; (a>b) ? a: b ;
如果能够使用三元运算符的就一定能够使用if…else… 但是如果能够使用if…else…,不一定能够使用三元运算符!if语句格式3
if(关系表达式1) {
语句体1;
}else if (关系表达式2) {
语句体2;
} … else {
语句体n+1;
}
执行流程
- 首先判断关系表达式1看其结果是true还是false
- 如果是true就执行语句体1
- 如果是false就继续判断关系表达式2看其结果是true还是false
- 如果是true就执行语句体2
- 如果是false就继续判断关系表达式…看其结果是true还是false
- …
- 如果没有任何关系表达式为true,就执行语句体n+1。
2.2 switch语句
switch语句格式:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break; …
default:
语句体n+1;
break; }
执行流程:
- 首先计算出表达式的值
- 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,
- 在执行的过程中,遇到break就会结束。
- 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),jdk7以后可以接收字符串。
注意事项:
- case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
- default可以省略吗?可以省略。一般不建议。除非判断的值是固定的。(单选题)
- break可以省略吗?可以省略,一般不建议。
- default的位置一定要在最后吗?可以出现在switch语句任意位置。
- switch语句的结束条件: 遇到break 执行到程序的末尾
case穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
public static void main(String[] args) {
int i = 5;
switch (i){
case 0:
System.out.println("执行case0");
break;
case 5:
System.out.println("执行case5");
case 6:
System.out.println("执行case6");
default:
System.out.println("执行default");
}
}
上述程序中,执行case5后,由于没有break语句,程序会一直向后走,
不会在判断case,也不会理会break,直接运行完整体switch。
if语句和switch语句的区别:
if语句使用场景:
- 针对结果是boolean类型的判断
- 针对一个范围的判断
- 针对几个常量值的判断
switch语句使用场景:
- 针对几个常量值的判断
3.循环结构语句:
3.1 循环概述
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环语句的组成
- 初始化语句:一条或者多条语句,这些语句完成一些初始化操作。
- 判断条件语句:这是一个boolean = 表达式,这个表达式能决定是否执行循环体。
- 循环体语句:这个部分是循环体语句,也就是我们要多次做的事情。
- 控制条件语句:这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。
3.2 循环语句for
for循环语句格式:
for(初始化表达式①; 布尔表达式②; 步进表达式④){
循环体③
}执行流程 执行顺序:①②③④>②③④>②③④…②不满足为止。
①负责完成循环变量初始化
②负责判断是否满足循环条件,不满足则跳出循环
③具体执行的语句
④循环后,循环条件所涉及变量的变化情况
求水仙花数案例:
class Test{
public static void main (String[] args){
for(int x=100;x<1000;x++){
int ge =x % 10;
int shi= x/10 % 10;
int bai= x/100% 10;
if(x==ge*ge*ge+shi*shi*shi+bai*bai*bai){
System.out.println("水仙花数为:"+x);
}
}
}
}