一. Java概述
1. 背景
Java 语言是美国 Sun 公司(Stanford University Network)在 1995 年推出的计算机语言。
Java 之父:詹姆斯·高斯林 James Gosling
2. 版本
Java SE : Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础。
Java ME : Java 语言的(小型版),用于嵌入式消费类电子设备。
Java EE : Java 语言的(企业版),用于 Web 方向的网站开发。
网站:通过跟后台服务器的交互,将查询到的真实数据再通过网页展示出来。
网站 = 网页 + 后台服务器
3. Java的跨平台原理
跨平台:Java 程序可以在任意操作系统上运行。只需要运行 Java 应用程序的操作系统上,安装一个与操作系统对应的Java虚拟机(JVM Java Virtual Machine)即可。
问:JVM 本身是否可以跨平台?
答:JVM 虚拟机本身不允许跨平台,允许跨平台的是 Java 程序
4. JDK、JRE 和 JVM 的关系
类 :java 文件在代码中的集合体现
类库:存放多个 java 文件的仓库
JRE : JRE是 Java Runtime Environment 缩写,指Java运行环境,包含 JVM 虚拟机及 Java 核心类库。
5. 开发 Java 程序三个步骤
编写代码,编译代码,运行代码
1.编写代码的过程中,需要使用 JRE 中 Java 已经写好的代码。
2.编译代码的过程中,需要使用 JDK 中的翻译工具。
3.运行代码的过程中,需要使用 JDK 中的运行工具,且代码需要运行在 JVM 当中。
6. JDK的下载
通过官方网站获取 JDK Oracle | Cloud Applications and Cloud Platform
注意:针对不同操作系统,下载对应的 JDK。
7. JDK的安装目录
目录名称 | 说明 |
bin | 该路径下存放了JDK的各种工具命令。包括JACAC和JAVA。 |
conf | 该路径下存放了JDK的相关配置文件。 |
include | 该路径下存放了一些平台特定的头文件。 |
jmods | 该路径下存放了JDK的各种模块。 |
legal | 该路径下存放了JDK的各种模块的授权文档。 |
lib | 该路径下存放了JDK工具的一些补充jar包。 |
其余文件为说明性文档。
二. Java基础语法
1. 关键字
⚫ 关键字的字母全部小写。
⚫ 常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观。
问:main是关键字吗?
答:不是,比关键字更为关键的一个单词,因为JVM在执行代码的时候,只会识别该单词
2. 常量
3. 变量
变量就是内存中的存储空间,空间中存储着经常发生改变的量(数据)
格式:数据类型 变量名 = 数据值;
4. 数据类型
需要new的都是引用数据类型
计算机存储设备的最小信息单元叫“位(bit)” ,又称之为“比特位”,通常用小写的字母”b”表示。
计算机中最小的存储单元叫“字节(byte)”, 通常用大写字母”B”表示,由连续的8个位组成。
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
5. 键盘录入
6. 标识符
⚫ 定义规则:
1.由数字、字母、下划线(_)和美元符($)组成 2.不能以数字开头 3.不能是关键字 4. 区分大小写
⚫ 常见命名约定:
1.小驼峰命名法:第一个单词首字母小写,其他单词首字母大写。如:firstName
2.大驼峰命名法:标识符由多个单词组成的时候,每个单词的首字母大写。 如:GoodStudent
7.类型转换
(1)隐式转换
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量 。
4升的油,倒入8升的桶,可以直接倒入 ==》小的给大的,可以直接给。
一个表达式中有多种类型 最终转为最高的类型 统一了类型 再进行运算
特殊关注:
byte short char 三种数据在运算时,不管是否有更高的数据类型,都会提升为int再运算。
(2)强制转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量 。
格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
注意:强制类型转换,有可能会发生精度损失
简单理解:将容积为8升的容器中的水,倒入容积为4升的容器中,如果水超出了4升,就洒了。
java的常量优化机制 byte sum = 3 + 4; 会先计算3 + 4 的和 7 是否在byte取值范围之内
在:编译成功 否:编译报错
三. 运算符
1. 运算符和表达式
运算符:对常量或者变量进行操作的符号
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
举例说明:+:是运算符,并且是算术运算符
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式
2. 字符的 + 操作
⚫ ASCII码表 (American Standard Code for Information Interchange)美国信息交换标准代码
是计算机中字节到字符的一套对应关系。
⚫char提升为int的过程,就是查找码表中,字符所对应的数值表示形式
'a' = 97 'A' = 65 '0' = 48
3. 数值拆分
个位 :数值 % 10
十位 :数值 / 10 % 10
百位 :数值 / 100
千位 :数值 / 1000
4.运算符
自增自减运算符
i++ 和 ++i 单独使用效果一样 i = i + 1;
i++ : 先拿原值参与运算 再自增 ++i : 先自增然后再拿自增后的新值参与运算
算数运算符 = - * / %
/ 整数相除 结果为 整数 sout(10 / 3) ==> 3 将10.0 这样最高类型为double ==> 3.333335
赋值运算符 = += -= *= /= %=
扩展的赋值运算符 隐含包含了 强制类型转换 byte b = 12; b += 5; ==> byte b = (byte)(b + 5);
关系运算符 ( 比较运算符 )
注意事项:
-
关系运算符的结果都是boolean类型,要么是true,要么是false。
-
千万不要把“==”误写成“=”。
==号作比较:
◆基本数据类型:比较的是具体的值(byte,short,int,long,float,double,char,boolean)
◆引用数据类型:比较的是地址值(类,接口,数组)
逻辑运算符
“3 < x < 6” 在Java中表示为 “x>3 & & x<6” & : 一假既假 | : 一真既真 ^ : 不同为true,相同为false。异性恋才为真爱 ! : 取反 短路 && 和 || (可以提高百分之50效率)
注意事项:
◆逻辑与&,无论左边真假,右边都要执行。
短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
◆ 逻辑或|,无论左边真假,右边都要执行。
短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
三元运算符
a > b ? a : b;
计算规则: 首先计算关系表达式的值
如果值为true,a的值就是运算结果
如果值为false,b的值就是运算结果
5.例题
⚫键盘录入三个数,判断三个数中的最大值并且打印
例如:20 40 30 打印结果:40是最大值
package com.itheima.homework; import java.util.Scanner; public class homework01 { public static void main(String[] args) { System.out.println("请输入三个整数"); Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int better = a > b ? a : b; int best = better > c ? better : c; System.out.println(best+"是最大值"); } }
⚫ 键盘录入两个整数,判断这两个整数的和是否在10到200之间(包含10和200),且是奇数
如果是输出:符合要求 如果不是是输出:不符合要求
import java.util.Scanner; public class class1 { public static void main(String[] args) { System.out.println("请录入两个整数"); Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int sum = a + b; if(sum % 2 == 1 & sum>= 10 & sum <= 100){ System.out.println("符合要求"); }else{ System.out.println("不符合要求");} } }
⚫键盘录入学生考试成绩, 根据成绩程序给出不同的奖励。
95~100分 : 自行车一辆 90~94分 : 游乐场一次 80~89分 : 变形金刚一个 80分以下 : 挨顿揍, 这座城市又多了一个伤心的人~
import java.util.Scanner; public class class1 { public static void main(String[] args) { System.out.println("请输入考试成绩"); Scanner sc = new Scanner(System.in); int score = sc.nextInt(); if(score >= 95 & score <= 100){ System.out.println("自行车一辆");} else if(score >= 94 & score <= 90) { System.out.println("游乐场一次");} else if(score >= 80 & score <= 89) { System.out.println("变形金刚一个");} else if(score <= 80) { System.out.println("挨顿揍, 这座城市又多了一个伤心的人~");} } }
⚫根据工龄(整数)给员工涨工资(整数),工龄和基本工资通过键盘录入
(1) 涨工资的条件如下: 工龄 工资涨幅 [10-15) +5000 [5-10) +2500 [3~5) +1000 [1~3) +500 [0~1) +200 (2) 如果用户输入的工龄为10,基本工资为3000,程序运行后打印格式"您目前工作了10年,基本工资为 3000元, 应涨工资 5000元,涨后工资 8000元"
import java.util.Scanner; public class class1 { public static void main(String[] args) { System.out.println("请输入工龄"); Scanner sc1 = new Scanner(System.in); int year = sc1.nextInt(); System.out.println("请输入基本工资"); Scanner sc2 = new Scanner(System.in); int money = sc2.nextInt(); System.out.println("您目前工作了"+ year +"年," + "基本工资为 "+ money +"元," ); if(year >= 0 & year < 1){ int up = 200; int all = up + money; System.out.println("应涨工资" + up +"元,涨后工资"+ all +"元"); } else if(year >= 1 & year < 3) { int up = 500; int all = up + money; System.out.println("应涨工资" + up +"元,涨后工资"+ all +"元"); } else if(year >= 3 & year < 5) { int up = 1000; int all = up + money; System.out.println("应涨工资" + up +"元,涨后工资"+ all +"元"); } else if(year >= 5 & year < 10) { int up = 2500; int all = up + money; System.out.println("应涨工资" + up +"元,涨后工资"+ all +"元"); } else if(year >= 10 & year < 15) { int up =5000; int all = up + money; System.out.println("应涨工资" + up +"元,涨后工资"+ all +"元");} } }
四. 分支语句
1. 顺序结构
程序在main()从上到下依次执行
表达式: 从左到右依次执行
()可以改变优先级
2. 分支结构 (if , switch)
(1) if语句
if语句格式1 if(条件表达式){} ==> 条件表达式 = true 才会执行{}中的逻辑 if语句格式2 if()else{}; ==> 奇偶数的案例 if语句格式3 多条件分支 if...else if....else{}
(2) switch条件分支
表达式取值为:byte short char int 没有long JDK1.7之后的版本有String "1" "2" "a" 等值匹配的时候可以与 if else if 进行转换 switch存在case穿透现象: 穿透到第一个break 或者 switch程序结束 优点: 可以对重复的逻辑进行优化 只写一边即可
3. 循环结构 (for,while,do…while)
(1)for循环
循环的四要素 初始化值 结束条件判断 重复做的事 自增/自减
for(int i = 1;i <= 5; i++){ sout("重复的逻辑"); }
for循环的快捷键:fori + Tab
复制的快捷键:鼠标放在system上,Ctrl+D
快捷键ctrl+alt+L 调整格式
⚫需求:求1-100之间的偶数和,并把求和结果在控制台输出
public class demo1{ public static void main(String[] args) { int sum = 0; for (int i = 1; i <= 100 ; i++) { if(i%2==0){ sum+=i; } } System.out.println(sum); } }
⚫现有如下代码 , 统计 1 ~ 20 之间, 5的倍数有几个, 但是代码存在错误, 请说明错误原因, 并更正代码
public class Demo { public static void main(String[] args) { for (int i = 1; i <= 20; i++) { int count = 0; if(i % 5 == 0){ count++; } System.out.println(count); } } }
原因:
int count = 0应该在for循环前面,不然count会一直归零。 sout应该在for循环外面,不然会一直重复打印。
更正:
public class Demo { public static void main(String[] args){ int count = 0; for (int i = 1; i <= 20; i++) { if(i % 5 == 0){ count++; } } System.out.println(count); } }
案例:水仙花数问题
什么是“水仙花数”?
① 水仙花数是一个三位数 111 222 333 370 371 520 999
② 水仙花数的个位、十位、百位的数字立方和等于原数
123: 不是水仙花数 371:是水仙花数
⚫在控制台输出所有的“水仙花数”
public class demo1{ public static void main(String[] args) { int sum = 0; for (int i = 100; i < 1000; i++) { int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100; if(ge*ge*ge+shi*shi*shi+bai*bai*bai==i){ System.out.println(i); } } } }
⚫需求:在控制台输出所有的“水仙花数”,要求每行打印2个
public class demo1{ public static void main(String[] args) { int count = 0; for (int i = 100; i < 1000; i++) { int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100; if(ge*ge*ge+shi*shi*shi+bai*bai*bai==i){ count ++; System.out.print(i+" "); if(count%2==0){ System.out.println( );} } } } }
(2)while循环
int i = 1; while(比较表达式){ sout("重复的逻辑"); i++; }
问:什么时候使用for循环 什么时候使用while循环? for: 明确循环次数 使用for while: 不明确循环次数 死循环
⚫ 打印所有的水仙花数
public class demo6 { public static void main(String[] args) { int i = 100; while( i <= 999){ int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100; if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i){ System.out.println(i); } i++; } } }
⚫案例:珠穆朗玛峰
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。 请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public class demo1{ public static void main(String[] args) { double paper = 0.1; double mountain = 8844430; int count = 0; while (paper<=mountain){ paper*=2; count++; } System.out.println(count); } }
(3)do...while循环
int i = 1; do{ sout("重复的逻辑"); i++; }while(条件表达式);
特点:
1.不管条件表达式是否为 true 至少执行一次逻辑
2.狗都不用(哈哈哈哈哈我东哥说的)
(4)三种循环的区别
1.执行判断顺序不同 do while 不管条件表达式是否为 true 至少执行一次逻辑 先执行再判断 for / while 条件表达式 必须为 true 才会执行 先判断再执行
2.作用域不同: for 里面的初始化语句 i 只能在for循环的{}内被访问 while/do while 由于初始化语句定义在循环外 main{}内 作用域 为main{}之内可以被访问
(5) 三种死循环
for(;;){} while(true){} do{}while(true)
死循环后面不要书写代码,因为执行不到会报错。
(6)循环的嵌套 双重for循环
外层循环执行一次 内层循环执行全部
public class demo11 { public static void main(String[] args) { for(int i = 1; i <= 10 ; i++){ System.out.println("i="+i); for(int j = 1 ; j <= 5 ; j++){ System.out.print(j+" "); } System.out.println( ); } } }
⚫使用嵌套循环完成99乘法表的打印
public class demo7 { public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(j+"*"+i+"="+j*i+" "); } System.out.println(); } } }
(7)跳转控制语句
break: 终止循环 continue: 跳过本次循环去执行下一次循环
⚫分析以下需求并实现:
1.想在控制台输出2次:"Java基础班" 括号( )里面应该填写什么? break; 2.想在控制台输出7次:"Java基础班" 括号( )里面应该填写什么? continue;
public class Test11 { public static void main(String[] args) { for(int x=1; x<=10; x++) { if(x%3==0) { //在此处填写代码 } System.out.println("Java基础班"); } } }
⚫打印1到100之内的整数,要求如下:
1.数字中包含9的要跳过 9 19 91 92 个位是9或者十位是9的数要跳过
2.每行输出5个满足条件的数,之间用空格分隔
如: 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16
public class demo3 { public static void main(String[] args) { int num = 0; for (int i = 1; i <=100 ; i++) { if (i % 10 == 9 | i / 10 == 9 ) { continue;} System.out.print(i + " "); num++; if(num % 5 == 0) { System.out.println(); } } } }
(8)跳出双重循环
方法一:加标号(给循环起名字,指定跳出) lo:while(true) ==> break lo; 方法二: boolean flag = true; flag = false; break;
⚫键盘录入一个数字, 请计算1~该数字之间, 所有的奇数和, 并将结果打印到控制台上。
例如: 录入: 10, 则打印: 1~10之间的奇数和为 25 录入: -10, 则打印: 您录入的数字无效, 请重新录入. 注意: 如果用户录入错误数字, 则一直录入. 直到用户录入正确的数字, 打印完结果后, 程序结束.
import java.util.Scanner; public class demo5 { public static void main(String[] args) { boolean flag = true; while (flag) { System.out.println("请输入一个数字"); Scanner sc = new Scanner(System.in); int i = sc.nextInt(); if (i < 1) { System.out.println("您输入的数字无效,请重新录入");} else {int sum = 0; for (int j = 1; j <= i; j++) { if (j % 2 == 1) { sum += j;} } System.out.println(sum); break;} } } }
(9)随机数Random
使用步骤: ① 导包 import java.util.Random; //导的动作必须出现在类定义的上面 ② 创建对象 Random r = new Random(); //r 是变量名,可以变,其他的都不允许变 ③ 获取随机数 int number = r.nextInt(10); //获取数据的范围:[0,10) 包括0,不包括10
⚫程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?
import java.util.Random; import java.util.Scanner; public class demo16 { public static void main(String[] args) { Random r = new Random(); int num = r.nextInt(100)+1; while(true) { System.out.println("你猜多少"); Scanner sc = new Scanner(System.in); int j = sc.nextInt(); if (j > num) { System.out.println("你猜的数据大了"); } else if (j < num) { System.out.println("你猜的数据小了"); } else { System.out.println("恭喜你猜中了"); break; } } } }
补充:
IDEA中创建项目的书写规范
项目名+模块名+包名(包名:公司域名倒写+功能)