A

126 阅读39分钟

第一章 Java概述

1.1 JavaSE课程体系介绍

JavaSE知识图解

JavaSE课程内容介绍

JavaSE知识模块介绍

  • 第一部分:计算机编程语言核心结构: 数据类型运算符流程控制数组、…
  • 第二部分:Java面向对象核心逻辑: 类和对象封装继承多态抽象接口、…
  • 第三部分:JavaSE核心高级应用: 集合I/O多线程网络编程反射机制、…
  • 第四部分:Java新特性: Lambda表达式函数式编程新Date/Time API接口的默认、静态和私有方法、…
  • 第五部分:MySQL/JDBC核心技术: SQL语句数据库连接池DBUtils事务管理批处理、…

1.2 计算机语言介绍(了解)

计算机编程语言是什么

所谓计算机编程语言,就是人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。

计算机语言发展

  • 第一代:机器语言(计算机很庞大,都是0和1组成的指令,而且需要同时按下多个键才能完成一个指令,而且用0和1组成的一个一个指令,所以工程师们就要记住0和1的各种组合以及对应的指令)
  • 第二代:汇编语言(面向机器的语言,因为直接面对机器需要记一些 0 和1 的指令,很痛苦,所以就出现了很多助记词,比如:add.汇编语言现在还在使用,接近于机器语言,越接近机器语言,速度越快,而且最终还是转成0和1存储)
  • 第三代:高级语言(更接近我们人类语言,常见的有很多,比如C语言,java等)
 但是不管是什么语言,最后都要向机器语言靠近,因为CPU只认识0和1

1.3 Java语言概述(了解)

Java生态圈

Java是目前应用最为广泛的软件开发平台之一。 随着Java以及Java社区的不断壮大,Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

作为一个平台, Java虚拟机扮演着举足轻重的作用。除了 Java语言,任何一种能够被编译成字节码的计算机语言都属于Java这个平台。Groovy、Scala、 JRuby、Kotlin等都是Java平台的一部分,它们依赖于Java虚拟机,同时,Java平台也因为它们变得更加丰富多彩。而且Java还可以跨平台

作为一种文化, Java几乎成为了 “开源”的代名词。在Java程序中,有着数不清的开源软件和框架。如Tomcat、Struts, Hibernate, Spring,MyBatis等。就连JDK和JVM自身也有不少开源的实现,如OpenJDK、Apache Harmony。可以说,“共享”的精神在Java世界里体现得淋漓尽致。

作为一个社区, Java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之众多也令人咋舌。可以说,Java社区已经俨然成为了一个良好而庞大的生态系统。其实这才是Java最大的优势和财富。

Java 是最好的语言吗?

不是,因为在每个领域都有更合适的编程语言。

  • C 语言无疑是现代计算机软件编程语言的王者,几乎所有的操作系统都是 C 语言写成的。C里面有一个编译器,会将系统软件变成机器语言,让硬件识别,和硬件做交互.C++ 是面向对象的 C 语言,一直在不断的改进。
  • JavaScript 是能运行在浏览器中的语言,丰富的前端界面离不开 Javascript 的功劳。近年来的 Node.js 又在后端占有一席之地。
  • Python 用于系统管理,并通过高性能预编译的库,提供 API 来进行科学计算,文本处理等,是 Linux 必选的解释性语言。现在Python也被用于web开发、科学计算和统计、人工智能、网络爬虫等
  • Ruby 强于 DSL(领域特定语言),程序员可以定义丰富的语义来充分表达自己的思想。
  • Erlang 就是为分布式计算设计的,能保证在大规模并发访问的情况下,保持强壮和稳定性。
  • Go 语言内置了并发能力,可以编译成本地代码。当前新的网络相关项目,很大比例是由 Go 语言编写的,如 Docker、Kubernetes 等。
  • 编写网页用 PHP,函数式编程有 Lisp,编写 iOS 程序有 Swift/Objective-C。
  • R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法
  • SQL 是用于访问和处理数据库的标准的计算机语言, 这类数据库包括:MySQL,Oracle, Sybase, SQL Server, DB2, Access 等等

一句话概括,能留在排行榜之上的语言,都是好的语言,在其所在的领域能做到最好。

Java语言发展历史

Java诞生于SUN(Stanford University Network),09年SUN被Oracle(甲骨文)收购。

Java之父是詹姆斯.高斯林(James Gosling)。

1615793633189

詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

1996年发布JDK1.0版。

目前公司主流是Java8。

发行版本发行时间备注
Java1995.05.23Sun公司在Sun world会议上正式发布Java和HotJava浏览器
Java 1.01996.01.23Sun公司发布了Java的第一个开发工具包
Java 1.11997.02.19
Java 1.21998.12.08拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版)
Java 1.32000.05.08
Java1.42004.02.06
Java 5.02004.09.30①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaEE、JavaME
Java 6.02006.12.112009.04.20 Oracle宣布收购SUN公司
Java 7.02011.07.02
Java 8.02014.03.18
Java 9.02017.09.22①每半年更新一次;②Java 9.0开始不再支持windows 32位系统
Java 10.02018.03.21
Java 11.02018.09.25JDK安装包取消独立JRE安装包,长期支持版本
Java 12.02019.03.19
······
 Google和Oracle的侵权事件:
 ​
 Google 和 Oracle 纠缠多年的“Java 侵权案”又有了新的判决结果。Google 在此次对决中败诉,并可能需要支付高达88亿美元的赔偿金。这个案件还引发关于 API(应用程序编程接口)是否应该受版权保护的争议。
 ​
 其实早在2010年8月,Oracle 就已经向法院起诉 Google 侵权,声称 Google 在开发 Android 平台时未经授权就使用了 Oracle 的 Java 应用编程接口数据包。
 ​
 另外,虽然 Google 当年为避免版权问题而重写了 Java API,却意外地使用了和 Oracle JDK 相同的一小段代码,这使得 Google 陷入不利的局面。
 ​
 正是由于 Google 在 Android 平台上使用 Java 时并未和 Sun 公司达成授权协议,造成了巨大的隐患,尤其是在 Oracle 收购 Sun 公司之后。

1615793545482

Java技术体系平台

  • JavaSE(Java Platform, Standard Edition标准版):允许您在桌面和服务器上开发和部署Java应用程序。Java提供了丰富的用户界面、性能、多功能性、可移植性和当今应用程序所需的安全性。

  • JavaEE(Java Platform, Enterprise Edition企业版):是为开发企业环境下的应用程序提供的一套解决方案,主要针对于Web应用程序开发。

  • JavaME(Java Platform, Micro Edition 小型版):为互联网上的嵌入式和移动设备上运行的应用提供了一个健壮、灵活的环境:微控制器、传感器、网关、移动电话、个人数字助理(PDA)、电视机顶盒、打印机等等。JavaME包括灵活的用户界面、健壮的安全性、内置的网络协议,以及支持动态下载的网络和离线应用程序。基于JavaME的应用程序在许多设备上都是可移植的,但是利用了每个设备的本机功能。

    • Java Embedded(Im'bedId): 用于解锁物联网的智能设备的价值: 通过远程市场更新和刷新功能延长产品生命周期和价值; 利用Java的可伸缩性、健壮性、可移植性和全套功能,提高生产效率,降低成本,缩短上市时间; 在边缘启用快速数据功能;
    • Java Card:使安全元件(如智能卡和其他防篡改安全芯片)能够承载采用Java技术的应用程序。Java card提供了一个安全的、可互操作的执行平台,它可以在一个资源受限的设备上存储和更新多个应用程序,同时保持最高的认证级别和与标准的兼容性。
    • Java TV:是一种基于JavaME的技术,它为开发在tv和机顶盒设备上运行的java应用程序提供了一个性能良好、安全且易于实现的解决方案。使用Java TV运行时,开发人员可以轻松创建应用程序,例如电子节目指南(EPG)、视频点播(VOD)客户端、游戏和教育应用程序、用于访问Internet数据的应用程序(例如天气、新闻播报器、社交网络)以及大多数蓝光光盘标题上的用户界面和奖金内容。

第二章.Java语言前言

1.Java的介绍

 1.计算机编程语言:计算机能看懂的语言(指令),我们可以通过计算机编程语言让计算机帮我们去做事
 2.Java之父:詹姆斯.高斯林
 3.Java涉及的范围:应用于互联网领域
   银行  电商  物流等服务端应用程序
 4.目前使用的jdk版本:java8或者java11

2.字节

 1.概述:计算机中最小的存储单元(存储单位),用byte或者B表示
       8个二进制(bit)代表一个字节
 2.存储单位的换算:
   8bit = 1byte或者1B
   1024B = 1KB
   1024KB = 1MB
   1024MB = 1GB
   1024GB = 1TB

image-20220213103319504

3.常用的dos命令

 1.调出dos命令窗口:win+r->输入cmd

image-20220213104625610

说明命令
切换盘符盘符名:->回车
查看当前目录下内容dir
进入到指定目录cd 文件夹名
进入多级文件夹cd 文件夹名\文件夹名
退到上一级目录cd..或者cd ..
退到根目录cd\或者cd \
清屏cls
退出黑窗口exit
创建文件夹mkdir 文件夹名
创建多级文件夹mkdir 文件夹名\文件夹名
删除文件夹rd 文件夹名;注意:删除的文件夹必须是空的,不走回收站
删除文件del 文件名;注意:不走回收站
批量删除文件del *.后缀名

第三章.Java所需要的环境

1.jvm和跨平台

 1.jvm:java虚拟机,是运行所有Java程序的假想计算机,是Java程序的运行环境之一,也是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM之上。
     
 2.跨平台:java程序可以在不同的操作系统上运行
   跨:跨越
   平台:操作系统
       
 3.jvm和跨平台之间的关系:
   java程序想要在不同的操作系统上运行实现跨平台,必须要有不同版本的jvm的支持

2.JDK和JRE

 1.JRE(Java Runtime Environment):java程序运行时所需要的环境,包含`JVM` 和运行时所需要的`核心类库
 2.JDK(Java Development's Kit):是Java程序开发工具包,包含`JRE` 和开发人员使用的工具(javadoc)   
 3.jvm和jre以及jdk的关系:
   jdk包含jre,jre包含jvm

1.如果要是直接运行一个已有的java程序,只安装jre即可

2.如果要是开发,到运行 安装jdk

3.jdk包含jre,jre包含jvm-> 只安装jdk即可

2.1.JDK安装

 1.双击jdk安装包->点下一步
 2.修改jdk安装路径->路径上不要有中文,不要有空格
 3.将"独立jre"叉掉
 4.点击"安装"

测试jdk是否安装好了:

1.进入到bin路径下,执行两个命令:javac java

2.javac->编译命令

java->运行命令

2.2.环境变量的配置

1.配置环境变量的目的:为了在任意位置都可以使用javac和java命令
打开配置环境变量的位置:
  1.右键"此电脑"->属性->高级系统设置->高级->环境变量

常见的配置环境变量的2种方式
  1.直接配置jdk的bin路径
      
  2.JAVA_HOME:
    a.在环境变量的系统变量中设置
    b.新建:
      变量名:JAVA_HOME
      变量值:jdk安装路径中bin路径的上一级路径
    c.找到path:
      编辑->新建->%JAVA_HOME%\bin

第四章.Java第一个程序的开发

1.开发三步骤

1.编写
  a.创建文本文档,将后缀名改成.java
  b.注意:将文件后缀名显示出来
2.编译:
  javac命令编译java文件->生成一个对应的.class文件(字节码文件)
  
  javac 文件名.java
      
3.运行:
  java命令运行java程序->jvm运行的就是这个编译生成的class文件
  
  java class文件的文件名

2.编写HelloWorld

public class Demo01HelloWorld{
	public static void main(String[] args){
		System.out.println("HelloWorld");
	}
}

3.注释

1.概述:对代码进行的一个解释说明,不参与编译和运行
2.分类:
  单行注释:  // 注释内容
  多行注释:  /*注释内容*/

  文档注释:  /**注释内容*/
        文档注释中注释的内容可以被jdk提供的工具javadoc所解析,生成一套以网页文件形式体现的程序的说明
        命令:javadoc -d 要生成的文件夹名字 -author -version 文件名.java
        注意:这里的-author和-version是参数生成的时候需要加,加什么就会输出什么
/**
 * 文档演示
 * 这是一个入门程序
 * @author tian
 * @version v1.0
 */
public class HelloWorld{
	/**
	 * 下面是一个main入口
	 */
	public static void main(String[] args) {
		System.out.println("HelloWorld");
	}
}

image-20221013155715122

image-20220213153423727

4.第一个Java程序中每一句话的解释以及注意事项

/*
   定义一个类:类(class)是java代码的最基本的单元,所以的代码都要在类中写
              class 代表的就是类
			  class后面的单词是类名,此名要求和java文件名保持一致
			    
*/
public class Demo01HelloWorld{
	/*
	  下面一句话叫方法:main方法或者叫主方法,是程序的入口
	  java代码的运行都是从main方法开始运行
	*/
	public static void main(String[] args){
		
		//输出语句(打印语句),可以将结果打印到控制台上,输出来
		System.out.println("HelloWorld");
	}
}
注意事项:
  1.class后面的类型要和java文件名保持一致
  2.java中的所有的标点符号都是英文的
  3.不要将main写成mian
  4.String和System的首字母S要大写
  5.写完一个单词,可以用空格来增加代码的可读性
  6.写代码时,写括号要成对出现
  7.一句话结束,用;结束

6.关键字

1.概述:java提前定义好的具有特殊含义的小写单词
2.怎么记:不用单独去记,关键字在高级记事本中颜色特殊,所以我们学到哪里记到哪里

7.编写HelloWorld时要注意的问题

7.1字符编码问题

当cmd命令行窗口的字符编码与.java源文件的字符编码不一致,会出现乱码,如何解决?

解决方式1:在notepad++中将字符编码选择成ANSI的

解决方式2:利用javac -encoding utf-8 文件名.java  -> 不建议使用

1629449543929

7.2源文件名与类名一致问题?

1)源文件名是否必须与类名一致?

如果这个类不是public,那么源文件名可以和类名不一致。

如果这个类是public,那么要求源文件名必须与类名一致。

我们建议大家,不管是否是public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。


(2)一个源文件中是否可以有多个类?

一个源文件中可以有多个类,编译后会生成多个.class字节码文件。

但是一个源文件只能有一个public的类。


(3)main必须在public的类中吗?

    不是。

但是后面写代码时,基本上main习惯上都在public类中。

小结:

1.一个java文件中尽量只写一个类,而且是带public的

2.不管类带不带public,类名尽量和文件名保持一致

9.println和print区别

1.相同点:
  都是输出语句(打印语句)
2.不同点:
  println:输出之后自动换行
  print:输出之后不换行

第五章.常量

1.概述:在代码的运行过程中,值不会发生改变的数据
2.分类:
  整数常量:所有整数
  小数常量:带小数点的  2.5  2.0
  字符常量:带单引号的 '' ->   单引号中必须有,且只能有一个内容
          'a''a1'不是
          '11'不是
          '中'' ' 是->一个空格也是内容
          '  '不是->两个空格不是字符常量
          ''不是->单引号中没内容
          'tab键'->是
  字符串常量:带双引号的 ""  内容随意
  布尔常量:true false
  空常量:null  代表数据不存在,不能直接使用   null ""
public class Demo04ChangLiang{
	public static void main(String[] args){
		//整数常量
		System.out.println(1);
		//小数常量
		System.out.println(2.5);
		//字符常量
		//System.out.println('');//错误,单引号中必须有且只能有一个内容
		System.out.println(' ');
		//System.out.println('11');//错误,单引号中必须有且只能有一个内容
		System.out.println('a');
		System.out.println('中');
		
		//字符串常量
		System.out.println("helloworld");
		System.out.println("加油");
		
		//布尔常量
		System.out.println(true);
		System.out.println(false);
		
		/*
		空常量
		null代表数据不存在,不能直接使用
		*/
		System.out.println(null);
	}                                      
}       
public class Demo05ChangLiang{
	public static void main(String[] args){
		System.out.println(10+3);
		System.out.println(10-3);
		System.out.println(10*3);
		System.out.println(10/3);//在java中两个整数相除,取整数部分
		System.out.println(10/3.0);//在java中除号前后一旦有一个为小数,结果就是带小数点的
	}                                      
}

第六章.变量

数据类型关键字内存占用取值范围
字节型byte1个字节-128 至 127 定义byte变量时超出范围,废了
短整型short2个字节-32768 至 32767
整型int(默认)4个字节-2^31 至 2^31-1 正负21个亿
长整型long8个字节-2^63 至 2^63-1 19位数字
单精度浮点数float4个字节1.4013E-45 至 3.4028E+38
双精度浮点数double(默认)8个字节4.9E-324 至 1.7977E+308
字符型char2个字节0 至 2^16-1
布尔类型boolean1个字节true,false

1.变量的介绍以及使用

1.概述:在代码的运行过程中,值可以发生改变的数据
2.作用:一次存储一个数据
      数据可以在不同的情况下,随时改变
3.定义格式:
  数据类型 变量名 = 值;  //先看等号右边-> 将等号右边的值赋值给等号左边的变量
  
  数据类型 变量名;
  变量名 = 值;

4.数据类型分类:
  基本数据类型:48种
      整型:byte short int long
      浮点型:float double
      字符型:char
      布尔型:boolean
          
  引用数据类型:
      类 接口 枚举 注解 数组
  
5.注意:
  a.floatdouble有什么区别:
    float 的小数位只有 23 位,即二进制的 23 位,能表示的最大的十进制数为 223 次方,即 8388608,即十进制的 7 位,严格点,精度能百分百保证十进制的 6 位运算。
    double 的小数位有 52 位,对应十进制最大值为 4 503 599 627 370 496,这个数有 16 位,所以计算精度能百分百保证十进制的 15 位运算。
        
  b.变量中整数默认类型为:int
         小数默认类型为:double
  c.首先浮点类型分单精度float和双精度double

	而他们的底层存储结构不同:他们是由符号位,指数位,尾数位组成。
	种类-------符号位-------------指数位----------------尾数位---- 
	float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit) 
	double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit) 

	c.1.符号位:表示浮点数的正负,0为正,1为负;
	c.2.指数位:占的位数代表着该类型的范围,例如:
	float指数位范围:第30-23位(占8bit),则范围为2^8-1等同于-128~128
	double的指数范围:第62-52位(占11bit),范围:2^11-1等同于-1024~1024
	c.3.尾数位:占的位数代表着精度,也就是小数点后面的尾数。
	float的尾数:23位,其范围为:0~2^23,而2^23=8388608,所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的,8位就不一定了(但不是说8位就绝对不对了)
	double的尾数:52位,2^52=2.220446049250313E-16,最小是16位,但最小不是1.0E-16,所以精度是15~16,能保证15,一般16位。
             
6.按照取值范围为基本类型进行一个排序:从小到大
  byte->short->char->int->long->float->double
    
7.字符串型的变量:  String  -> String不属于基本数据类型,属于引用数据类型
  String 变量名 = "";
public class Demo01Var{
	public static void main(String[] args){
	   //byte
	   byte num1 = 10;
	   System.out.println(num1);
	   
	   //short
	   short num2 = 100;
	   System.out.println(num2);
	   
	   //int
	   int num3 = 100;
	   num3 = 200;
	   System.out.println(num3);
	   
	   /*
	   long
	     定义long的变量时,值后面需要加上L或者l
	   */
	   long num4 = 20000L;
	   num4 = 1L;
	   System.out.println(num4);
	   
	   /*
	   float
	     定义float的变量时,值后面需要加上F或者f
	   */
	   float num5 = 2.5F;
	   System.out.println(num5);
	   
	   //double
	   double num6 = 3.5;
	   System.out.println(num6);
	   
	   //char
	   char num7 = '中';
	   System.out.println(num7);
	   
	   
	   //boolean
	   boolean num8 = true;
	   boolean num9 = false;
	   System.out.println(num8);//true
	   System.out.println(num9);//false
	   
	   /*
	     num8 = num9-> 相当于将num9这个变量的值赋值给num8这个变量
		 num8 = false;
	   */
	   num8 = num9;
	   System.out.println(num8);//false
	}
}
public class Demo02Var{
	public static void main(String[] args){
	   /*
	    常量和常量之间的运算
	   */
	   
	   System.out.println(10+3);
	   System.out.println(10-3);
	   System.out.println(10*3);
	   System.out.println(10/3);//取整数部分
	   
	   System.out.println("============================");
	   
	   /*
	      变量和常量之间的运算
       */
	   int num1 = 10;
	   /*
	     先看等号右边:num1+3->10+3 = 13
		 再将13赋值给等号左边的变量result
		 此时result就是13
	   */
	   int result = num1+3;
	   System.out.println(result);//13
	   
	   
	   int result02 = num1-3;
	   System.out.println(result02);//7
	   
	   int result03 = num1*3;
	   System.out.println(result03);//30
	   
	   
	   /*
	     /前后都是整数,结果取整数部分
		 /前后有一个是小数,结果就是带小数点的
	   */
	   double result04 = num1/3.0;
	   System.out.println(result04);
	   
	   System.out.println("============================");
		
	   /*
	     变量和变量之间运算
	   */
	   int a = 10;
	   int b = 3;
	   int sum1 = a+b;
	   System.out.println(sum1);
	}
}
public class Demo03Var{
	public static void main(String[] args){
	  /*
	    定义3个int型的变量,分别赋值为10  20  30
	  */
	  int a = 10;
	  int b = 20;
	  int c = 30;
	  System.out.println(a);
	  System.out.println(b);
	  System.out.println(c);
	  
	  System.out.println("========================");
	  
	  int i,j,k;
	  i = 10;
	  j = 20;
	  k = 30;
	  System.out.println(i);
	  System.out.println(j);
	  System.out.println(k);
	  
	  System.out.println("========================");
	  
	  int x = 10,y = 20,z = 30;
	  System.out.println(x);
	  System.out.println(y);
	  System.out.println(z);
	}
}
//变量中的转移字符

public class Demo04Var{
	public static void main(String[] args){
	   /*
	     转义字符:  \
	   */
	   
	   /*
	     \n  换行符
	   */
	   System.out.print("床前明月光");
	   System.out.print("\n");
	   System.out.print("疑是地上霜");
	   System.out.print("\n");
	   System.out.print("举头望明月");
	   System.out.print("\n");
	   System.out.print("低头思故乡");
	   System.out.print("\n");
	   
	   /*
	    t
		\t  制表符 相当于tab
	   */
	   System.out.println("柳岩和涛哥"+"\t"+"的故事");
	   
	   /*
	     使用java代码表示'
	   */
	   char data1 = ''';
	   System.out.println(data1);
	   
	   /*
	     使用java代码表示路径
		 在java中两个\代表一个\
	   */
	   String path = "E:\java\bin";
	   System.out.println(path);
	}
}

2.变量使用时的注意事项

1.在同一个作用域(一对大括号就是一个作用域)中不能定义重名的变量
2.变量没有初始化(第一次赋值),不能直接使用
3.不同的作用域中的变量尽量不要随意的互相使用
  在小作用域可以访问大作用域中提前定义好的数据
  在大作用域中不能直接访问小作用域中的数据  
public class Demo05VarNotice{
	public static void main(String[] args){
	   int i = 10;
	   i = 20;
	   
	   int j;
	   j = 1000;
	   System.out.println(j);
	   
	   int k = 200000;
	   {
		 int x = 100000;
          System.out.println(k);		 
	   }
	   //访问不到小作用域中的数据
	   System.out.println(x);
	}
}

第七章.标识符

1.概述:我们自己给类,方法,变量取得名字
2.硬性规定(必须遵守)
  - 标识符可以包含`英文字母26个`、`0-9数字` 、`$(美元符号)`和`_(下划线)`。
  - 标识符不能以数字开头。  int i1 = 10   int 1i = 10(错误)
  - 标识符不能是关键字。  public class static{}(错误)
                      public class staticpublic{}
  
3.软性建议(建议遵守规则):
  给类取名:每一个单词首字母都大写(大驼峰式)  -> 从第一个单词开始往后每一个单词首字母大写
          public class StaticPublic{}
  给方法取名字:  从第二个单词开始往后(包括第二个单词)首字母大写(小驼峰式)  
  给变量取名字:  从第二个单词开始往后(包括第二个单词)首字母大写(小驼峰式)
               int test = 10
               int testDemo = 10
               String personNameAge = 10   

第八章.数据类型转换

1.整数默认类型:int
  小数默认类型:double
2.基本类型按照取值范围从小到大排列:
  byte->short->char->int->long->float->double
3.什么时候发生类型转换:
  当等号左右两边类型不一致时
  自动类型转换
  强制类型转换

1.自动类型转换

1.什么时候发生自动类型转换
  取值范围大的数据类型 变量名 = 取值范围小的数据类型    -> 小类型自动提升为大类型
2.注意:
  当取值范围小的类型和取值范围大的类型做运算,也会发生自动类型转换,小的转大的
public class Demo01DataType{
  public static void main(String[] args){
	  /*
	    等号右边:100->默认类型int
		等号左边:long型的变量
		
		将取值范围小的int型数据赋值给取值范围大的long型,发生了自动类型转换
	  */
	  long num1 = 100L;
	  System.out.println(num1);
	  
	  
	  /*
	    等号右边:10->默认类型int
		等号左边:double型的num2
		
		将取值范围小的类型赋值给了取值范围大的类型->发生了自动类型转换
		
	  */
	  double num2 = 10;
	  System.out.println(num2);
	  
	  /*
	    当取值范围小的类型和取值范围大的类型做运算,也会发生自动类型转换,小的转大的
	  */
	  double a = 2.5;
	  /*
	    double = double+int
		double = double+double
	  */
	  double result = a+10;
	  System.out.println(result);
  }
}

2.强制类型转换

1.什么时候需要强制类型转换
  取值范围小的数据类型 变量名 = 取值范围大的数据类型    -> 报错
2.怎么强转
  取值范围小的数据类型 变量名 = (取值范围小的数据类型)取值范围大的数据类型
public class Demo02DataType{
  public static void main(String[] args){
	  /*
	    等号右边:2.5 默认类型为double
		等号左边:int型的num1
		
		将取值范围大的类型赋值给了取值范围小的类型->需要强转
	  */
	  //int num1 = 2.5;
	  int num1 = (int)2.9;
	  System.out.println(num1);
	  
	  int num2 = (int)100L;
	  System.out.println(num2);
	  
	  float num3 = 2.5F;
	  System.out.println(num3);
  }
}

3.强转的注意事项

1.不要随意强转,强转容易导致,数据精度损失,或者数据溢出
2.byte,short如果等号右边是常量,只要是不超出范围,不用强转,因为jvm自动给转了
  byte,short如果等号右边有变量参与,结果再赋值给byte,short的变量,会自动提升为int型,需要手动强转
3.char类型的数据一旦参与运算,会自动提升为int型;
  char类型一旦被变成int型,字符会自动去编码表中查询字符对应的int值->ASCII码表
      
  如果字符在ASCII码表中找不到对应的int值,会去unicode码表(万国码)中查询
public class Demo03DataType{
  public static void main(String[] args){
	  /*
	    等号右边:2.5 默认类型为double
		等号左边:int型的num1
		
		将取值范围大的类型赋值给了取值范围小的类型->需要强转
	  */
	  //int num1 = 2.5;
	  int num1 = (int)2.9;
	  System.out.println(num1);
	  
	  /*
	  数据溢出现象
	  
	  int占4个字节  1个字节是8个二进制位
	  
	  int型数据最多能用32位二进制表示
	  
	  100亿换成二进制:36位
	  
	  多出来4位二进制,会把最前面的4位二进制干掉,剩下的就是最终结果
	  */
	  int num2 = (int)10000000000L;
	  System.out.println(num2);//1410065408
	 
  }
}
public class Demo04DataType{
  public static void main(String[] args){
	 byte num1 = 10+10;
	 System.out.println(num1);
	 
	 byte num2 = 10;
	 /*
	   byte = byte+int->int+int
	 */
	 //byte sum1 = num2+1;
	 byte sum1 = (byte)(num2+1);
	 System.out.println(sum1);
	 
	 System.out.println("=====================");
	 
	 char num3 = '中';
	 System.out.println(num3+0);
  }
}

第九章.运算符

1.算数运算符

符号说明
+(加)加法
-(减)减法
*(乘)乘法
/(除)除法 如果符号前后都是整数,结果取整数部分;一旦前后有一个是带小数点的,结果就是小数
%(模)取余数
public class Demo01YunSuanFu{
	public static void main(String[] args){
		int num1 = 10;
		int num2 = 3;
		
		int sum = num1+num2;
		System.out.println(sum);//13
		
		int sub = num1-num2;
		System.out.println(sub);//7
		
		int mul = num1*num2;
		System.out.println(mul);//30
		
		int div = num1/num2;
		System.out.println(div);//3
		
		int mo = num1%num2;
		System.out.println(mo);//1
	}
}
+:
 加法
 字符串拼接:任何类型遇到字符串都会变成字符串,直接拼接
public class Demo02YunSuanFu{
	public static void main(String[] args){
		int a = 10;
		int b = 20;
		
		String result = a+b+"";
		
		System.out.println(result);
		
		System.out.println(a+""+b);//1020
		System.out.println(""+a+b);//1020
		System.out.println(""+(a+b));//30
		
		int x = 10;
		int y = 20;
		int sum = x+y;
		System.out.println("两个变量的和为:"+sum);
	}
}

2.自增自减运算符(也算算数运算符的一种)

1.格式:
  变量++ : 后自加
  ++变量:  前自加
  变量--:  后自减
  --变量:  前自减

2.使用:
  a.单独使用:++ --单独是一句,没有和其他代码混合使用
    符号在前或者在后没区别,都是先运算
  b.混合使用:++ --和其他语句混合使用(赋值语句,打印语句等)
    符号在前:先计算,然后再使用计算后的值
    符号在后:先使用原值,使用完毕之后,自身再运算
public class Demo03ZiJiaZiJian{
	public static void main(String[] args){
		int i = 10;
		//i++;
		
		++i;
		System.out.println(i);//11
		
		System.out.println("=================");
		
		int j = 10;
		int result = j++;
		System.out.println(result);
		System.out.println(j);
		
		System.out.println("=================");
		
		/*
		  特殊:
		    c的原值是100
			将100又赋值给了c
			此时c依然是100
		*/
	    int c = 100;
		c = c++;
		System.out.println(c);
		System.out.println(c);
		
		System.out.println("=================");
		
		int x = 10;
		int y = 20;
		
		/*
		  10+21 = 31
		  
		  10+21-11 = 20
		  
		  注意:不要担心,以后开发绝对不用
		*/
		int result02 = x++ + ++y - x--;
		System.out.println(result02);
		System.out.println(x);
		
	}
}

3.赋值运算符

基本赋值运算符
=    -> 先看等号右边的
    
复合赋值运算符    
+=
    int i = 10;
    i+=1;//  展开  i = i+1
-=
*=
/=: 取整数部分
%=: 取余数部分
    
注意:
  byte,short使用复合赋值运算符时,jvm会自动强转
public class Demo04FuZhi{
	public static void main(String[] args){
		int i = 10;
		i+=2;//i = i+2
		System.out.println(i);
	}
}

4.关系运算符(比较运算符)

1.作用:比较判断,作为比较条件使用
2.结果:结果为boolean型
符号说明
==如果符号前后相等,为true;不等为false
如果符号前的大于符号后的,为true;否则为false
<如果符号前的小于符号后的,为true;否则为false
>=如果符号前的大于或者等于符号后面的,为true;否则为false
<=如果符号前的小于或者等于符号后面的,为true;否则为false
!=如果符号前的不等于符号后的为true;否则为false
public class Demo05Compare{
	public static void main(String[] args){
		int i = 10;
		int j = 20;
		int k = 10;
		
		boolean result01 = i==k;
		System.out.println(result01);
		
		System.out.println(i>j);
		System.out.println(i<j);
		System.out.println(i>=k);
		System.out.println(i<=j);
		System.out.println(i!=j);
		System.out.println(i!=k);
	}
}

5.逻辑运算符

1.作用:连接多个boolean型的表达式
2.结果:boolean
符号说明
&&(与,并且)有假则假,符号前后如果有一个结果为false,结果就是false
(或)有真则真,符号前后如果有一个结果为true,结果就是true
^(异或)符号前后结果一样,为false;不一样为true true^true -> false false^false->false true^false->true false^true->true
!(非,取反)取反,不是真就是假;不是假就是真
public class Demo06LuoJi{
	public static void main(String[] args){
		int i = 10;
		int j = 20;
		int k = 10;
		
	    boolean result01 = (i>j)&&(i<=k);
		System.out.println(result01);//false
		
		boolean result02 = (i>j)||(i<=k);
		System.out.println(result02);//true
		
		boolean result03 = (i>j)^(i<k);
		System.out.println(result03);//false
		
		boolean result04 = !(i>j);
		System.out.println(result04);//true
	}
}

1.&&和&区别

&:如果符号前后为boolean表达式,就是逻辑运算符,有假则假

如果符号前后为数字,&就是位运算符

&&(短路与):有假则假,如果符号前为false,后面不看了

2.||和|区别:

|:如果符号前后为boolean表达式,就是逻辑运算符,有真则真

如果符号前后为数字,|就是位运算符

||(短路或):有真则真,如果符号前为true,后面不看了

问题:定义一个变量,判断此变量的值是否是1-100之间的

数学写法: 1<=x<=100

java写法: x>=1 && x<=100

6.三元运算符

1.格式:
  boolean表达式?表达式1:表达式2
2.执行流程:
  a.先走boolean表达式,如果是true,走?后面的表达式1
  b.否则,走:后面的表达式2

第十章.进制的转换(了解)

十进制二进制八进制十六进制
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012a或A
11101113b或B
12110014c或C
13110115d或D
14111016e或E
15111117f或F
16100002010

3.1 十进制转成二进制

辗转相除法-> 循环除以2,取余数

image-20211218165309579

3.2 二进制转成十进制

8421规则

image-20211218165556758

3.3 二进制转成八进制

将二进制分开(3位为一组)

1621755513297

3.4 二进制转成十六进制

二进制分为4个为一组  

1627036847498

第十一章.位运算符(了解)

1621755993815

1代表true   0代表false

我们要知道计算机在存储数据的时候都是存储的数据的补码,而计算的也是数据的补码

1.正数二进制最高位为0;负数二进制最高位是1
2.正数的原码,反码,补码一致
  如:5的源码,反码,补码为:
     0000 0000 0000 0000 0000 0000 0000 0101->二进制最高位是0,因为是正数
3.负数的话原码,反码,补码就不一样了
  反码是原码的基础上最高位不变,其他的0和1互变
  补码是在反码的基础上+1
         
  如:-9
     原码:1000 0000 0000 0000 0000 0000 0000 1001
     反码:1111 1111 1111 1111 1111 1111 1111 0110
     补码:1111 1111 1111 1111 1111 1111 1111 0111

(1)左移:<<

运算规则:左移几位就相当于乘以2的几次方

注意: 当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位

2<<2    等于8
相当于:2*(2的2次方)

1621689774890

-2<<2   等于-8

相当于:-2*(2的2次方)

1621689784804

(2)右移:>>

快速运算:类似于除以2的n次,如果不能整除,向下取整

9>>2  等于 2

相当于:9除以(2的2次方)

1621689793253

-9>>2  等于-3

相当于:-9除以(2的2次方)

1621689801211

(3)无符号右移:>>>

运算规则:往右移动后,左边空出来的位直接补0,不管最高位是0还是1空出来的都拿0补

正数:和右移一样

9>>>2  等于 2

相当于:9除以(2的2次方)

负数:右边移出去几位,左边补几个0,结果变为正数

-9>>>2

结果为:1073741821

笔试题:8>>>32位->相当于没有移动还是8

8>>>34位->相当于移动2位

(4)按位与:&

小技巧:将0看成为false 将1看成true

运算规则:对应位都是1才为1,相当于符号左右两边都为true,结果才为true

1 & 1 结果为1

1 & 0 结果为0

0 & 1 结果为0

0 & 0 结果为0

比如:  5&3   结果为1

1621689811573

(5)按位或:|

运算规则:对应位只要有1即为1,相当于符号前后只要有一个为true,结果就是true

1 | 1 结果为1

1 | 0 结果为1

0 | 1 结果为1

0 | 0 结果为0

比如: 5|3  结果为:7

1621689820632

(6)按位异或:^

运算规则:对应位一样的为0,不一样的为1

1 ^ 1 结果为0 false

1 ^ 0 结果为1 true

0 ^ 1 结果为1 true

0 ^ 0 结果为0 false

比如: 5^3   结果为6

1621689829688

(7)按位取反

运算规则:~0就是1

~1就是0

~10     ->  结果为-11

1621689837355

第十二章.运算符的优先级(了解)

1621689848780

提示说明:
(1)表达式不要太复杂
(2)先算的使用(),记住,如果想让那个表达式先运行,就加小括号就可以了
i<(n*m)

第十三章.IDEA的使用

1.idea的介绍

1.概述:开发工具   由java编写, 使用idea必须由jdk环境   自动保存
2.作用:加速我们的开发

2.idea的目录结构

image-20220215093747284

3.如何去创建一个Project

1618192259620

3.1再次创建一个新的Project

1618192481636

或者:

1618192557841

4.关闭Project

file->close project

5.打开project

file->close project->open

6.创建module

1618193681495

6.1创建新的module

1618193760173

或者

1618193813762

或者

1618193866508

6.2打开和关闭module

关闭:

1618193956324

打开:

1618194053809

7.创建以及删除package

7.1创建

1618194122233

7.2 package的删除

对着包->右键->delete

7.3 package取名字规范

1.不要有中文
2.不要以数字开头
3.给包取名时一般都是公司域名倒着写,而且都是小写
  www.atguigu.com
  
  那么我们去package包名应该写成:com.atguigu.名字
      
 com.atguigu.a_for->在本地上是文件夹嵌套   一个.就是一级文件夹

8.创建类以及基本语句生成快捷键

1618194713746

psvm-->生成main方法

sout->生成输出语句

9.基本设置

9.1设置字体

file->settings

1618195252652

9.2设置提示的快捷键

file->settings

1618195500104

9.3 设置注释字体

1627266597353

10.快捷键

快捷键功能
Alt+Enter导入包,自动修正代码(重中之重)
Ctrl+Y删除光标所在行
Ctrl+D复制光标所在行的内容,插入光标位置下面
Ctrl+Alt+L格式化代码
Ctrl+/单行注释
Ctrl+Shift+/选中代码注释,多行注释,再按取消注释
Alt+Shift+上下箭头移动当前代码行

先写等号右边,按"alt+enter"自动生成等号左边的变量

11.出现的问题

1.创建project时,要选择empty project
2.在运行代码时会出现"找不到对应的发行源",证明本地jdk版本和idea中的project level不匹配
  所以要匹配版本
  file->project Structure->点击project->引入本地jdk->project level选择对应的版本
3.没有out路径的问题
  out路径是专门存放idea自动编译生成的.class文件的
  所以需要指明out路径
4.对着src,右键,选项中没有java class或者package

image-20220215105345405

第十四章.键盘录入_Scanner

1.概述:Java定义好的一个类
2.作用:可以通过键盘录入的形式将数据放到代码中参与运行
3.怎么使用:
  a.导包:import 包名.包名.类名  -> import java.util.Scanner
    目的:找到我们要使用的类
  b.创建对象:
    Scanner 名字 = new Scanner(System.in);
  c.调用方法,实现键盘录入
    名字.方法名()
      
4.常用方法:
  nextInt():输入int型的整数
  nextDouble():输入double型的小数
  next():输入一个字符串

快捷操作:

一.自动生成等号左边部分

1.alt+回车->自动生成等号左边的部分

  1. var->->自动生成等号左边的部分

    二.快速将变量放到输出语句中

变量名.sout

public class Demo01Scanner {
    public static void main(String[] args) {
        //创建对象
        Scanner sc = new Scanner(System.in);
        //调用方法,实现键盘录入
        int data1 = sc.nextInt();
        System.out.println(data1+1);

        //录入字符串
        String data2 = sc.next();
        System.out.println(data2);
    }
}
public class Demo02Scanner {
    public static void main(String[] args) {
        //创建Scanner
        Scanner scanner = new Scanner(System.in);
        System.out.println("请你输入第一个整数:");
        int data1 = scanner.nextInt();
        System.out.println("请你输入第二个整数:");
        int data2 = scanner.nextInt();

        int result = data1 + data2;

        System.out.println(result);
    }
}
Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at com.atguigu.b_scanner.Demo02Scanner.main(Demo02Scanner.java:10)
以上问题原因:输入的类型不一致
录入字符串:next()  nextLine()

next()->在录入的过程中,遇到空格和回车就结束录入了
nextLine()->在录入的过程中,遇到回车就结束录入
public class Demo03Scanner {
public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  String data = scanner.next();
  String data1 = scanner.nextLine();
  System.out.println(data);//abc
  System.out.println(data1);// haha
}
}

第十五章.switch(选择语句)

1.switch基本使用

1.格式:
  switch(变量){
      case 常量值1:
          执行语句1;
          break;
      case 常量值2:
          执行语句2;
          break;
      case 常量值3:
          执行语句3;
          break;
      ...
      
      default:
          执行语句n;
          break
  }
2.执行流程:
  用变量的值挨个和下面每一个case后面的常量值进行匹配,匹配上哪个case就执行哪个case对应的执行语句,然后走对应的break,结束switch
  如果以上所有的case都没有匹配上,就走default对应的执行语句
      
3.break关键字:
  代表的是结束switch语句
      
4.switch中能写什么类型的数据:
  byte short int char 枚举类型(jdk5是新增),String类型(jdk7新增)
public class Test01Switch {
    public static void main(String[] args) {
        //创建Scanner对象
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();

        switch (num) {
            case 1:
                System.out.println("111");
                break;
            case 2:
                System.out.println("222");
                break;
            case 3:
                System.out.println("333");
                break;
            case 4:
                System.out.println("444");
                break;
            default:
                System.out.println("ddddd");
                break;
        }
    }
}
public class Test02Switch {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请你输入一个月份:");
        int month = sc.nextInt();
        switch (month) {
            case 12:
                System.out.println("冬季");
                break;
            case 1:
                System.out.println("冬季");
                break;
            case 2:
                System.out.println("冬季");
                break;
            case 3:
                System.out.println("春季");
                break;
            case 4:
                System.out.println("春季");
                break;
            case 5:
                System.out.println("春季");
                break;
            case 6:
                System.out.println("夏季");
                break;
            case 7:
                System.out.println("夏季");
                break;
            case 8:
                System.out.println("夏季");
                break;
            case 9:
                System.out.println("秋季");
                break;
            case 10:
                System.out.println("秋季");
                break;
            case 11:
                System.out.println("秋季");
                break;
            default:
                System.out.println("输入有误!");
                break;
        }
    }
}

2.case的穿透性

如果,没有break,会出现case的穿透性,一直往下穿透,直到第一次遇到break或者switch代码执行完毕为止
public class Test03Case {
    public static void main(String[] args) {
        int num = 2;
        switch (num) {
            case 1:
                System.out.println("宋江");

            case 2:
                System.out.println("刘备");

            case 3:
                System.out.println("关羽");

            case 4:
                System.out.println("张飞");
                break;
            default:
                System.out.println("涛哥");
        }
    }
}
public class Test02Switch {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请你输入一个月份:");
        int month = sc.nextInt();
        switch (month) {
            case 12:
            case 1:
            case 2:
                System.out.println("冬季");
                break;

            case 3:
            case 4:
            case 5:
                System.out.println("春季");
                break;

            case 6:
            case 7:
            case 8:
                System.out.println("夏季");
                break;

            case 9:
            case 10:
            case 11:
                System.out.println("秋季");
                break;
                
            default:
                System.out.println("你有病呀,输入有误!");
                break;
        }
    }
}

第十六章.分支语句

1.if的第一种格式

1.格式:
  if(boolean表达式){
    执行语句
  }
2.执行流程:
  先走if后面的boolean表达式,如果是true,就走if后面大括号中的执行语句,否则就不执行
public class Demo01If {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入第一个整数:");
        int data1 = sc.nextInt();
        System.out.println("请您输入第二个整数:");
        int data2 = sc.nextInt();

        if (data1 == data2) {
            System.out.println("相等");
        }
    }
}

2.if的第二种格式

1.格式:
  if(boolean表达式){
    执行语句1
  }else{
    执行语句2
  }
2.执行流程:
  a.走if后面的boolean表达式,如果是true,走if后面的执行语句1,否则走else后面的执行语句2
public class Demo02IfElse {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入第一个整数:");
        int data1 = sc.nextInt();
        System.out.println("请您输入第二个整数:");
        int data2 = sc.nextInt();

        if (data1 == data2) {
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }

        System.out.println("哈哈哈");
    }
}

2.1 练习

任意给出一个整数,请用程序实现判断该整数是奇数还是偶数,并在控制台输出该整数是奇数还是偶数
步骤:
  1.创建Scanner
  2.调用nextInt方法录入一个整数 data
  3.利用if判断奇偶性  data%2==0
public class Demo03IfElse {
    public static void main(String[] args) {
        //1.创建Scanner
        Scanner sc = new Scanner(System.in);
        //2.调用nextInt方法录入一个整数 data
        int data = sc.nextInt();
        //3.利用if判断奇偶性  data%2==0
        if (data%2==0){
            System.out.println("偶数");
        }else{
            System.out.println("奇数");
        }
    }
}

2.2练习

需求.利用if  else 求出两个数的较大值
public class Demo04IfElse {
    public static void main(String[] args) {
        //1.创建Scanner
        Scanner sc = new Scanner(System.in);
        //2.调用nextInt方法录入一个整数 data1
        int data = sc.nextInt();
        int data1 = sc.nextInt();

        if (data>data1){
            System.out.println(data);
        }else{
            System.out.println(data1);
        }
    }
}
public class Demo05IfElse {
    public static void main(String[] args) {
        //1.创建Scanner
        Scanner sc = new Scanner(System.in);
        //2.调用nextInt方法录入一个整数 data1
        int data1 = sc.nextInt();
        int data2 = sc.nextInt();
        int data3 = sc.nextInt();

        int temp;
        if (data1>data2){
            temp = data1;
        }else{
            temp = data2;
        }


        if (temp>data3){
            System.out.println(temp);
        }else{
            System.out.println(data3);
        }

    }
}

2.3练习

案例:从键盘输入年份,请输出该年的2月份的总天数。闰年2月份29天,平年28天。

闰年:
(1)能被4整除,不能被100整除
(2)能被400整除
    
 步骤:
  1.创建Scanner对象
  2.调用nextInt,录入一个年份: year
  3.判断是否为闰年:
    (year%4==0 && year%100!=0)||(year%400==0)
public class Demo06IfElse {
    public static void main(String[] args) {
        //1.创建Scanner对象
        Scanner sc = new Scanner(System.in);
        //2.调用nextInt,录入一个年份: year
        int year = sc.nextInt();
        /*3.判断是否为闰年:
        (year%4==0 && year%100!=0)||(year%400==0)  */
        if ((year%4==0 && year%100!=0)||(year%400==0)){
            System.out.println("闰年2月29天");
        }else{
            System.out.println("平年2月28天");
        }
    }
}

2.4练习

public class Test06 {
    public static void main(String[] args) {
        boolean num1 = false;
        boolean num2 = true;
        int i = 1;
        if (num1 = num2){//相当直接写了一个true
            i++;
            System.out.println(i);
        }
        
        if (false){//相当于直接写了一个false
            --i;
            System.out.println(i);
        }
    }
}

3.if的第三种格式

1.格式:
  if(boolean表达式){
    执行语句1
  }else if(boolean表达式){
    执行语句2
  }else if(boolean表达式){
    执行语句3
  }...else{
    执行语句n
  }

2.执行流程:
  a.走if后面的boolean表达式,如果是true,就走if对应的执行语句1
  b.如果是false,走下面的else if,继续判断,如果是true,就走else if对应的执行语句2
  c.如果还是false,继续往下判断
  d.如果以上所有情况都不满足,就 走else对应的执行语句n
3.使用场景:2种情况以上的判断
public class Demo07ElseIf {
    public static void main(String[] args) {
        //1.创建Scanner
        Scanner sc = new Scanner(System.in);
        //2.调用nextInt方法录入一个整数 data1
        int data1 = sc.nextInt();
        int data2 = sc.nextInt();

        if (data1>data2){
            System.out.println("data1大于data2");
        }else if(data1<data2){
            System.out.println("data1小于data2");
        }else{
            System.out.println("data1等于data2");
        }
    }
}

3.1.练习

需求:
 键盘录入一个星期数(1,2,...7),输出对应的星期一,星期二,...星期日

输入  1      输出	星期一
输入  2      输出	星期二
输入  3      输出	星期三
输入  4      输出	星期四
输入  5      输出	星期五
输入  6      输出	星期六
输入  7      输出	星期日
输入  其它数字   输出      数字有误
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int week = sc.nextInt();
        /*if (week==1){
            System.out.println("周一");
        }else if(week==2){
            System.out.println("周二");
        }else if(week==3){
            System.out.println("周三");
        }else if(week==4){
            System.out.println("周四");
        }else if(week==5){
            System.out.println("周五");
        }else if(week==6){
            System.out.println("周六");
        }else if(week==7){
            System.out.println("周日");
        }else{
            System.out.println("输入有误!");
        }*/

        if (week>7 || week<=0){
            System.out.println("输入有误");
        }else{
            if (week==1){
                System.out.println("周一");
            }else if(week==2){
                System.out.println("周二");
            }else if(week==3){
                System.out.println("周三");
            }else if(week==4){
                System.out.println("周四");
            }else if(week==5){
                System.out.println("周五");
            }else if(week==6){
                System.out.println("周六");
            }else if(week==7){
                System.out.println("周日");
            }
        }
    }
}

3.2练习

- 需求: 小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
- 奖励规则:
95~100		山地自行车一辆
90~94		游乐场玩一次
80~89		变形金刚玩具一个
80以下	   胖揍一顿
public class Test02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int score = sc.nextInt();

        if (score>=95 && score<=100){
            System.out.println("山地自行车一辆");
        }else if (score>=90 && score<=94){
            System.out.println("游乐场玩一次");
        }else if (score>=80 && score<=89){
            System.out.println("变形金刚玩具一个");
        }else if (score>=0 && score<80){
            System.out.println("胖揍一顿");
        }else{
            System.out.println("没这个分数,往死里打");
        }
    }
}

第十七章.循环语句

1.for循环

1.格式:
  for(初始化变量;比较;步进表达式){
     循环语句
  }
2.执行流程:
  a.初始化变量
  b.比较判断,如果是true,进入循环体,执行循环语句,走步进表达式(初始化的变量的值改变)
  c.再比较,如果还是true,继续进入循环体,执行循环语句,再走步进表达式
  d.再比较,直到比较为false,循环结束
public class Test01 {
    public static void main(String[] args) {
       for (int i = 0;i<5;i++){
           System.out.println("我爱钱");
       }
    }
}

image-20220217091225996

1.1练习

for循环练习1:求1-3之间的数据和,并把求和结果在控制台输出

    1+2+3
步骤:
  1.定义一个变量,接收两个数的和 sum
  2.利用循环,将1 2 3表示出来
  3.在循环体中,两两相加,将结果赋值给sum
  4.输出sum
public class Test02 {
    public static void main(String[] args) {
        //1.定义一个变量,接收两个数的和 sum
        int sum = 0;
        //2.利用循环,将1 2 3表示出来
        for (int i = 1;i<=3;i++){
        //3.在循环体中,两两相加,将结果赋值给sum
            //sum = i+sum;
            sum+=i;//sum = sum+i
        }
        //4.输出sum
        System.out.println("和为:"+sum);
    }
}

image-20220217092406488

1.2练习

需求:求出1-100的偶数和
步骤:
  1.定义一个变量,接收两个偶数的和  sum
  2.利用循环将1-100循环出来
  3.判断,i%2==0,如果是true,证明是偶数,相加
  4.输出sum
public class Test03 {
    public static void main(String[] args) {
        //1.定义一个变量,接收两个偶数的和  sum
        int sum = 0;
        //2.利用循环将1-100循环出来
        for (int i = 1;i<=100;i++){
        //3.判断,i%2==0,如果是true,证明是偶数,相加
            if (i%2==0){
                sum+=i;//sum = sum+i
            }
        }
        //4.输出sum
        System.out.println("1-100的偶数和为:"+sum);
    }
}

1.3练习

需求:统计一下1-100之间的偶数个数
    
1.定义变量,用来计数,count
2.利用循环将1-100循环出来
3.判断,i%2==0,如果是true,证明是偶数,count++
4.输出count
public class Test04 {
    public static void main(String[] args) {
        //1.定义变量,用来计数,count
        int count = 0;
        //2.利用循环将1-100循环出来
        for (int i = 1;i<=100;i++){
        //3.判断,i%2==0,如果是true,证明是偶数,count++
            if (i%2==0){
                count++;
            }
        }
        //4.输出count
        System.out.println(count);
    }
}

快速生成for循环的快捷键:

次数.fori

第十八章.循环语句_while

1.while循环

1.1while循环的简单使用

1.格式:
  初始化变量
  while(比较){
     循环语句
     步进表达式
  }
2.执行流程:
  a.初始化变量
  b.比较,如果是true,执行循环语句,走步进表达式
  c.再比较,如果还是true,继续循环,继续走步进表达式
  d.再比较,知道比较为false,循环结束     
public class Test01 {
    public static void main(String[] args) {
        int i = 0;
        while(i<10){
            System.out.println("我爱钱");
            i++;
        }
    }
}
public class Test02 {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        while(i<=100){
            if (i%2==0){
                sum+=i;
            }
            i++;
        }
        System.out.println(sum);
    }
}

1.2while练习

需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?  27

步骤:
  1.定义一个变量,统计次数-> count
  2.利用while循环,循环比较
  3.如果纸的厚度<=山峰高度
  4.循环对折,count++
  5.输出count
public class Test03 {
    public static void main(String[] args) {
        //1.定义一个变量,统计次数-> count
        int count = 0;
        double paper = 0.1;
        double shanFeng = 8844430;
        //2.利用while循环,循环比较
        //3.如果纸的厚度<=山峰高度
        while(paper<=shanFeng){
        //4.循环对折,count++
            paper*=2;
            count++;
        }
        //5.输出count
        System.out.println(count);
    }
}

2.do...while循环(了解)

1.格式:
  初始化变量
  do{
    循环语句
    步进表达式
  }while(比较);
2.执行流程:
  a.初始化变量
  b.执行循环语句,步进表达式
  c.比较,如果是true,继续循环,如果是false,循环结束
          
3.特点:至少执行一次循环
public class Test04 {
    public static void main(String[] args) {
        int i = 0;
        do{
            System.out.println("我爱钱,都是钱");
            i++;
        }while(i<5);
    }
}

温馨小提示:快速生成for循环-> 次数.fori

xmind快捷键:

生成子主题tab
生成兄弟主题回车
编辑主题F2
添加备注F4
删除主题delete

3.循环的区别

1.for:在for循环中初始化的变量,出了for循环使不了了
2.while:在while循环初始化的变量,出了while循环还能使用
3.do...while:至少执行一次
4.确定次数用for,不确定次数用while

4.循环控制关键字

1.break:
  a.在switch中代表结束switch语句
  b.在循环中表示结束循环
2.continue:
  a.结束本次循环,自动进入下一次循环
public class Test01 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            if (i==3){
                //结束循环
                //break;
                //结束本次循环,进行下一次循环
                continue;
            }
            System.out.println("我爱钱"+i);
        }
    }
}

5.死循环

1.概述:一直循环
2.什么时候发生:比较一直为true
public class Test01 {
    public static void main(String[] args) {
        int count = 0;
        for (;;){
            count++;
            System.out.println("我爱钱"+count);
        }

       /* while(true){
            count++;
            System.out.println("我爱钱"+count);
        }*/
    }
}

6.嵌套循环

1.概述:循环中又套着一个循环
2.执行流程:
  先走外层for循环,进入内层for循环,内层for循环就一直循环,直到内层for循环结束,外层for循环进入下一次循环
  直到外层for循环都结束了,所有的循环全部结束
public class Test01 {
    public static void main(String[] args) {
        for (int fen = 0; fen < 60; fen++) {
            for (int miao = 0; miao < 60; miao++) {
                System.out.println(fen+"分"+miao + "秒");
            }
        }
    }
}