史上最强java基本语法讲解|附练习题(超详细版本

下一篇持续更新中…(如有错误 ,欢迎指正!!)

书接上回,在上一篇我讲解了第一个java程序HelloWorld的编译、运行和在这个过程中你可能会遇到的问题。希望通过昨天的学习,你已经能够独立完成:

  • 搭建Java的开发环境
  • 理解Java的加载与执行
  • 编写HelloWorld程序,编译并运行
  • 掌握环境变量path的原理以及如何配置

今天这一篇我将为你讲解,如何配置环境变量classpath以及它的作用原理、对HelloWorld程序进行初步解释以及java语言基础语法。(知识点超详细,附有练习题,回顾个别知识点的同学可以直接通过目录跳转,废话不多说,长篇预警!!!!!)

续上一篇

1. 配置环境变量classpath

在运行HelloWorld时,你有没有遇见这样的问题?
在这里插入图片描述
要解决这个问题,首先我们要明白:DOS命令窗口执行java HelloWorld的执行原理:

  1. java.exe命令会启动jvm
  2. JVM启动之后会启动类加载器ClassLoader
  3. ClassLoader会在硬盘上某个位置搜索HelloWorld.class字节码文件
  4. 找到该文件则执行
  5. 找不到该文件则报错

问题:ClassLoader是在哪个位置上搜索HelloWorld.class字节码文件的?

  • 默认情况下,Classloader从当前路径下加载xxx.class字节码文件。

  • 当然,也可以让ClassLoader去某个指定的路径下加载字节码文件,这时需要配置环境变量classpath
    在这里插入图片描述
    在这里插入图片描述

    • classpath环境变量属于Java语言中的环境变量,不属于Windows操作系统。【path环境变量属于操作系统】)
    • classpath是给ClassLoader类加载器指路的,你可以设置这样的环境变量:classpath=D:\java project\TEST把“ .class ”所在路径添加进去
    • 这样,打开DOS命令窗口在任意位置,都可以执行;java HelloWorld
    • classpath环境变量没有配置的话,类加载器默认从当前路径下找字节码文件;当classpath环境变量配置为某个指定的路径之后,类加载器只去指定的路径当中加载字节码文件。
    • 当然,classpath也可以这样配置:" classpath=. "。以后就得运行前切换到.class路径下,需要加载别的.class文件,在后面加一个“ ; ”再加上就可以了。

注意:
路径中“. .”表示上级目录
路径中“.”表示当前目录

配置classpath环境变量后你可以去重新运行你的HelloWorld,怎么样?成功了没?(手动狗头

2. java源程序的注释

-单行注释

 //单行注释,只注释当前行

-多行注释

	/*
    多行注释
	多行注释
	多行注释
	多行注释
	多行注释
	多行注释
	多行注释
    */

-javadoc注释

 /**
	* javadoc注释
	* javadoc注释
	* javadoc注释
	* javadoc注释
	* javadoc注释
	* javadoc注释
	* javadoc注释
	*/

注意:这种注释是比较专业的注释,该注释信息会被javadoc.exe工具解析提取并生成帮助文档。
在这里插入图片描述

3. 对HelloWorld源程序初步解释

//public表示公开的
//class表示定义一个类
//HelloWorld表示一个类名
public class HelloWorld{//表示定义一个公开的类,起名HelloWorld

	//类体中不允许直接编写Java语句【除声明变量之外】
	//System.out.println("Hello World!");

	//类体【记住】

	/*
         public表示公开的
		 static表示静态的
		 void表示空
		 main表示方法名是main
		 (string[] args)是一个main方法的形式参数列表 

		 需要记住的是:
		 以下的方法是一个程序的"主方法",是程序的执行入口
		 是sun公司规定的,固定编写方式。
	*/
    public static void main(String[] args){//表示定义一个公开的静态的主方法

		//方法体
		//方法体
		//方法体
		//方法体
		//方法体
		//方法体

		//java语句【Java语句以“;”终止,分号必须是半角分号】
		//先记住:以下这样代码的作用是向控制台输出一段字符串
		//以下的双引号必须是半角的双引号【是Java语法的一部分】
		//Java中所有的“字符串”都使用双引号括起来
		System.out.println("Hello World!");

		//再向控制台输出消息
		System.out.println("Hello Jessica!");

		//输出中文
		System.out.println("你好,杰西卡!");

		//输出中文【以下,程序员两边的双引号是全角的,
		//这里的双引号不是Java语法的一部分,这里的全角的双引号只是一个普通的字符串】
		System.out.println("我是一个“程序员”");

		//大括号成对写,防止忘
		//记得缩进
    }
}

4. public class和class的区别:

class B
{
	public static void main(String[] args){
		System.out.println("B's main method invoke!");
	}
}
class X
{
	public static void main(String[] args){
		System.out.println("X's main method invoke!");
	}
}
class Y
{
	public static void main(String[] args){
		System.out.println("Y's main method invoke!");
	}
}
class Z
{
	public static void main(String[] args){
		System.out.println("Z's main method invoke!");
	}
}
public class K
{
	public static void main(String[] args){
		System.out.println("K's main method invoke!");
	}
}

*一个Java源文件当中可以定义多个class

*一个Java源文件当中public的class不是必须的

*一个class会定义生成一个xxx.class字节码文件

*一个Java源文件当中定义公开的类的话,只能有一个,并且该类名称必须和Java源文件名称一致

*每一个class当中都可以编写main方法,都可以设定程序的入口:

   想执行B.class中的main方法:java B
   想执行X.class中的main方法:java X

*注意:当在命令窗口中执行java Hello,那么要求Hello.class当中必须有主方法。没有主方法会出现运行阶段的错误:
在这里插入图片描述

本篇:java基础语法

1. 标识符

  • 类、方法、变量、常量、枚举、接口等,在Java源程序中,凡是程序员有权利自己命名的单词都是标识符。

  • 标识符在EditPlus编辑器当中以黑色字体高亮显示

  • 标志符的命名规则
    【不按照这个规则来,编译器会报错,这是语法】

    1. 一个合法的标识符只能由“数字、字母、下划线_、美元符号$”组成,不能含有其他符号
    2. 不能数字开头
    3. 严格区分大小写
    4. 关键字不能做标识符
    5. 理论上无长度限制,但是最好不要太长
  • 标识符的命名规范?
    【只是一种规范,不属于语法,不遵守规范编译器不会报错】

    1. 见名知意
    2. 驼峰命名方式
      1. 大驼峰法【首字母大写,后面每个单词首字母大写】–>类名、接口名、文件名
      2. 小驼峰法【首字母小写,后面每个单词首字母大写】–>变量名、方法名
      3. 全部大写:常量名
      4. 全部小写:包名

2. 关键字

  • 关键字是由语言本身定义好的,不能挪作他用。
  • 关键字在EditPlus工具中颜色是蓝色高亮
  • 关键字在Java语言当中全部小写
  • 常见的关键字有哪些?
    public
    class
    static
    void
    if
    for
    while
    do
    default
    byte
    short
    int
    long
    float
    double
    boolean
    char
    private
    protected
    switch
    true
    false
    throw
    throws
    try
    catch
  • 提醒:关键字不需要单独拿出来记忆,编写程序的过程中记忆

3. 字面值

不同的数据类型有不同的定义语法和可以对其进行的操作,数据类型对应的具体的值就是字面值,"helloworld"是字符串类型的字面值,false是布尔类型的字面值【新手可以理解为:一眼看上去就知道这个数类型、大小的值】

  • 字面值是Java源程序的组成部分之一。包括标识符和关键字都是Java源程序的组成部分。

  • 字面值就是数据,而数据在现实世界中是分门别类的,所以数据在计算机编程语言当中也是有类型的:【数据类型】
    -10、100 整数型字面值
    -3.14 浮点型字面值
    -true\false 布尔型字面值
    -“abc”“中国人” 字符串型字面值
    -‘A’‘人’ 字符型字面值

  • 注意:

    • Java语言中所有的字符串型字面值必须使用半角双引号括起来
    • Java语言中所有的字符型字面值必须使用半角单引号括起来
public class ConstTest01
{
	public static void main(String[] args){
	System.out.println("abc");

	System.out.println("你最近过得怎么样?");

	System.out.println(10);

	System.out.println(false);

	System.out.println('A');

	System.out.println(3.14)

	System.out.println("3.14")

	//编译报错;因为单引号中只能存放单个字符,属于字符型字面值
	//System.out.println('ABC')
	}
}

4. 数据类型

不同的数据有不同的类型,不同的数据类型底层会分配不同大小的空间,数据类型的作用是指导JVM在运行程序时该给数据分配多大的内存空间。

  1. 分类:

1.a. 基本数据类型【四大类八小种】:

第一类:整数型
byte,short,int,long
第二类:浮点型
float,double
第三类:布尔型
boolean
第四类:字符型
char

ps:字符串"abc"不属于基本数据类型,属于“引用型数据类型”,字符属于基本数据类型:
* 字符串使用双引号"abc"
* 字符使用单引号’a’

2. 八种基本数据类型各自占用空间大小:

	基本数据类型			占用空间大小【单位:字节】
	-----------------------------------------------------
	byte							1
	short							2	
	int								4			
	long							8
	float							4
	double							8		
	boolean							1
	char							2
A.二进制

计算机在任何情况下都只能识别二进制。例如:只认识010101010101010…【现代的计算机底层采用交流电的方式,接通和断开就两种状态,计算机只识别1或0,其他不认识】

二进制是数据的一种表示形式。十进制表示满十进一原则。二进制表示满二进一原则。

  • 十进制转换成二进制:短除法

  • 二进制转换成十进制:2 4 8 16 32 64 128…【实在算不明白开计算器(手动狗头】

      	例如:十进制
      		0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    
      	例如:二进制
      		0 1 10 11 100 101 110 111 1000 1001......
      		0 1  2  3  4   5   6   7   8    9 .......
    
B.字节(byte):
		1 byte = 8 bit 【1个字节 = 8个比特位】1个比特位表示一个二进制:1/0
		1 KB = 1024 byte
		1 MB = 1024 KB
		1 GB = 1024 MB
		1 TB = 1024 GB

		1TB = 1024 * 1024 * 1024 * 1024 * 8

3. 八种数据类型的取值范围:

A.关于Java中的数字类型

数字都是有正负之分的,所以在数字的二进制当中有一个二进制位被称为“符号位”。这个“符号位”在所有二进制位的最左边,0表示正数,1表示负数

整数型当中的byte类型,占用1个字节,所以byte类型的数据占用8个比特位。

		* byte类型最大值:01111111
		【
			00000000 00000000 00000000 10000000(二进制)
				减去1的结果是
			00000000 00000000 00000000 01111111(二进制)
		】
		* byte类型最大值:2的7次方 - 1,结果是:127
		* byte类型最小值:-128【具体怎么用二进制表示,这个和原码、反码、补码有关】

		* byte类型的取值范围:[ -128 ~127 ]

		* byte类型可以表示256个不同的数字【256个不同的二进制】
B. 字符编码
  • 八种基本数据类型当中byte,short,int,long,float,double,boolean这7种数据类型计算机在表示的时候比较容易,因为底层都是数字,十进制的数字和二进制之间存在一种固定的转换规则。
  • 但是char类型表示的是现实世界中的文字,文字和计算机二进制之间 “ 默认” 情况下是不存在任何转换关系的。为了让计算机可以表示现实世界当中的文字,需要人为干涉,人负责提前制定好“文字”和“二进制”之间的对照关系。这种转换关系就是:字符编码。

计算机最初只支持英文,最先出现的字符编码是:ASCII码

‘a’–>97【01100001】
‘A’–>65
‘0’–>48

‘a’–(按照ASCII解码)–>01100001
01100001—(按照ASCII编码)–>‘a’

编码和解码的时候采用同一套字典/对照表,不会出现乱码;当解码和编码的时候采用的不是同一套对照表,会出现乱码问题。

  • 随着计算机的发展,后来出现了一种编码方式,是国际化标准组织ISO制定的,
    这种编码方式支持西欧语言,向上兼容ASCII码,仍然不支持中文。这种编码方式
    是:ISO-8859-1,又称为latin-1

      	* 随着计算机向亚洲发展,计算机开始支持中文、日文、韩文等国家文字,其中支持
      	简体中文的编码方式:
      		GB2312 < GBK < GB18030
    
      	* 支持繁体中文:大五码<big5>
    
      	* 后来出现了一种编码方式统一了全球所有的文字,容量较大,这种编码方式叫做:**unicode编码**
      	
      	unicode编码方式有多种具体的实现:
      		-UTF-8
      		-UTF-16
      		-UTF-32
      		......
    

Java语言源代码采用的是Unicode编码方式,所以“标识符”可以用中文。现在在实际开发中,一般使用UTF-8编码方式比较多。【统一编码方式】

C. 八种数据类型的取值范围:
		类型				取值范围
		--------------------------------
		byte				[-128~127]
		short				[-32768~32767]
		int					[-2147483648~2147483647]
		long
		float
		double
		boolean				[true/false]	
		char				[0~65535]

		注意:short和char所表示的种类总数是一样的,只不过char可以表示更大的正整数。因为char没有负数。
//以下Java程序主要讲解的是数据类型之:char程序
public class DataTypeTest01
{
	public static void main(String[] args){
	
		//定义一个char类型的变量,起名c,同时赋值字符'a'
		char c = 'a';
		System.out.println(c);

		//一个中文占用2个字节,char类型正好是2个字节
		//所以Java中的char类型变量可以存储一个中文字符
		char x = '国';
		System.out.println(x);

		//编译错误
		//ab是字符串不能使用单引号括起来
		//char y = 'ab';

		//"a"是字符串类型
		//k变量是char类型
		//类型不兼容,编译错误
		//char k = "a"

		//声明
		char e;

		//赋值
		e = 'e';
		System.out.println(e);

		//再次赋值
		e = 'f';
		System.out.println(e);
	}
}

4. 八种数据类型的默认值

	数据类型						默认值
	-------------------------------------------------
	byte,short,int,long				0
	float,double					0.0
	boolean							false【在c语言中,true是1,false是0】
	char							\u0000	

八种基本数据类型的默认值是一切向0看齐。
public class DataTypeTest02
{	
	//这里的static必须加,别问为什么!
	static int k = 1000;

	//变量还是遵守这个语法:必须先声明,再赋值,才能访问。
	//成员变量没有手动赋值,系统会自动赋值【局部变量不会】
	static int f;//成员变量

	public static void main(String[] args){
	
		/*
		int i;//局部变量
		System.out.println(i);
		*/

		System.out.println(k);
		System.out.println(f);
	}
}

1.b. 引用数据类型【后边讲】

			-类
			-接口
			-数组
			.....

1.a.1. char 类型(转义字符:\)

转义字符出现在特殊字符之前会将特殊字符转换成普通字符。
\n 换行符
\t 制表符
\ 普通的反斜杠
’ 普通的单引号
" 普通的双引号

public class DataTypeTest03
{
	public static void main(String[] args){
	
		//普通的n字符
		char c1 = 'n';
		System.out.println(c1);

		//依照目前所学知识,以下程序无法编译通过,因为显然是一个字符串,不能使用单引号括起来
		//但是经过编译,发现编译通过了,这说明以下并不是一个字符串,而是一个字符
		//这是一个“换行符”,属于char类型的数据
		//反斜杠在Java语言当中具有转义功能
		char c2 = '\n';

		System.out.println(c2);

		/*
		System.out.println("Hello");
		System.out.println("World!");
		*/

		//System.out.print()和System.out.println()的区别:
		//println输出之后换行,print表示输出,但是不换行
		/*
		System.out.print("Hello");
		System.out.println("World!");
		*/

		System.out.print('A');
		System.out.print(c2);
		System.out.println('B');
		
		//普通的t字符
		char x = 't';
		System.out.println(x);

		//制表符tab
		char y = '\t';
		System.out.print('A');
		System.out.print(y);
		System.out.println('B');

		//要求在控制台上输出“反斜杠字符”
		//反斜杠将后面的单引号转译成不具备特殊含义的普通单引号字符
		//左边的单引号缺少了结束的单引号字符,编译报错
		/*
		char k = '\';
		System.out.println(k);
		*/
		
		//解释:第一个反斜杠具有转义功能,将后面的反斜杠转义为普通的反斜杠字符
		//结论:在java中两个反斜杠代表一个普通的反斜杠字符
		char k = '\\';
		System.out.println(k);
	
		//在控制台上输出一个普通的单引号字符
		//java中不允许这样编程,编译报错
		//char a = '''

		//以下编译报错,第一个单引号和第二个单引号配对儿,最后的单引号找不到另一半!
		//char a = '''
		//System.out.println(a);

		//反斜杠具有转义功能,将第二个单引号转换成普通的单引号字符,第一个单引号和最后单引号配对
		char a = '\'';
		System.out.println(a);

		char f = '"';
		System.out.println(f);

		System.out.println("HelloWorld!");
		System.out.println("“HelloWorld!”");
		
		//编译错误
		//System.out.println(""HelloWorld!"");
		//纠正
		System.out.println("\"HelloWOrld!\"");

		
		char m = '中';
		System.out.println(m);

		//JDK中自带的native2ascii.exe命令,可以将文字转换成unicode编码形式
		//怎么使用这个命令?
		//在命令行中输入native2ascii,回车,然后输入文字之后回车即可得到unicode编码
		char n = '\u4e2d';//'中'对应的unicode编码是4e2d
		System.out.println(n);

		//编译错误
		//char g = '4e2d';
		//编译错误
		//char g = 'u4e2d';
		//通过:反斜杠u联合起来后面的一串数字是某个文字的unicode编码
		char g = '\u4e2d';
		System.out.println(g);


		System.out.println("=======");


		//g = '\u456a';
		//g = '\u256a';
		//g = '\u456b';
		//System.out.println(g);

		//char类型的默认值
		char c10 = '\u0000';
		System.out.println(c10);
		
	}
}

/*

	十进制:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
	二进制:0 1 10 11 100 101 ...
	十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20
	八进制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20

*/

1.a.2. 整数型

	数据类型			占用空间			默认值			取值范围
	----------------------------------------------------------------------
	byte				1					0				[-128 ~ 127]
	short				2					0				[-32768 ~ 32767]
	int					4					0				[-2147483648 ~ 2147483647]
	long				8					0L

Java语言中的“整数型字面值”被默认当作int类型来处理。要让这个“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面添加l或L,建议使用大写的L

Java语言中的整数型字面值有三种表示方式:
第一种表示方式:十进制【是一种缺省默认的方式】*常用
第二种表示方式:八进制【在编写八进制整数型字面值的时候需要以0开始】
第三种表示方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】

public class DataTypeTest04
{
	public static void main(String[] args){
	
		int a = 10;
		int b = 010;//整数型字面值以0开头的,后面那一串数字就是八进制
		int c = 0x10;//整数型字面值以0x开头的,后面那一串数字就是十六进制

		System.out.println(a);//10
		System.out.println(b);//8
		System.out.println(c);//16

		System.out.println(a + b + c);//34

		//123这个整数型字面值是int类型
		//i变量声明的时候也是int类型
		//int类型的123赋值给int类型的变量i,不存在类型转换
		int i = 123;
		System.out.println(i);

		//456整数型字面值被当作int类型,占用4个字节
		//x变量在声明的时候是long类型,占用8个字节
		//int类型的字面值456赋值给long类型的变量x,存在类型转换
		//int类型转换成long类型
		//int类型是小容量
		//long类型是大容量
		//小容量可以自动转换成大容量,称为自动转换机制。
		long x = 456;
		System.out.println(x);

		//2147483647字面值是int类型,占用4个字节
		//y是long类型,占用8个字节,自动类型转换
		long y = 2147483647;
		System.out.println(y);

		//编译错误:过大的整数:2147483648
		//2147483648被当作int类型4个字节来处理,但是这个字面值超出int类型范围
		//long z = 2147483648;

		//解决错误
		//2147483648字面值一上来就当作long类型来处理,在字面值后面加L
		//2147483648L是8个字节的long类型
		//z是long类型变量,以下程序不存在类型转换。
		long z = 2147483648L;
		System.out.println(z);
	
	}
}

1.a.3. 浮点型

float 单精度【4个字节】 / double 双精度【8个字节,精度较高】

double的精度太低【相对来说的】,不适合做财务软件。财务软件涉及到钱的问题,要求精度较高,所以sun在基础SE类库当中为程序员准备了精度更高的类型,只不过这种类型是一种引用数据类型,不属于基本数据类型,它是:java.math.BigDecimal

其实java程序中sun提供了一套庞大的类库,Java程序员是基于这套基础的类库来进行开发的。所以要知道java的SE类库的字节码在哪,要知道java的SE类库的源码在哪(看到这里的同学可以自行去下载jdk的文件夹里查找)

		* SE类库字节码:D:\java course\javaSE course\03下载\jdk8\jre\lib\rt.jar
		* SE类库源码:D:\java course\javaSE course\03下载\jdk8\src.zip

例如:String.java和String.class
(String[ ] args)中的String使用的就是String.class字节码文件

在Java语言中,所有的浮点型字面值【3.0】,默认被当作double类型来处理,要想该字面值当作float类型来处理,需要在字面值后面添加F/f

	注意:	
		double和float在计算机内部二进制存储的时候存储的都是近似值。
		在现实世界中有一些数字是无限循环的,例如:3.333333....
		计算机的资源是有限的,用有限的资源存储无限的数据只能存储近似值
public class DataTypeTest06
{
	public static void main(String[] args){
	
		//3.0是double类型的字面值
		//d是double类型的变量
		//不存在类型转换
		double d = 3.0;
		System.out.println(d);

		//5.1是double类型的字面值
		//f是float类型变量
		//大容量转换成小容量需要加强制类型转换符吗,所以以下程序编译错误。
		//float f = 5.1;

		//解决方案:
		//第一种方式:强制类型转换符
		//float f = (float)5.1;
		
		//第二种方式:没有类型转换
		float f = 5.1f;
	}
}

1.a.4.布尔型Boolean

在java语言当中Boolean类型只有两个值:true、false,没有其他值。不像c语言当中,0和1可以表示假和真。在底层存储的时候boolean类型占用1个字节,因为实际存储的时候false底层是0,true底层是1。
布尔类型在实际开发当中非常重要,经常使用在逻辑运算和条件控制语句当中。


public class DataTypeTest07
{
	public static void main(String[] args){
	
	//编译错误:不兼容的类型
	//boolean flag = 1;

	//boolean loginSuccess = false;
	boolean loginSuccess = true;

		//if语句以后讲【条件控制语句】
		if(loginSuccess)
		{
			System.out.println("恭喜你,登陆成功");
		}else{
			System.out.println("对不起,用户名不存在或者密码错误!");
		}	
	}
}

5. 基本数据类型之间的互相转换规则

  1. 八种基本数据类型当中除布尔类型之外剩下的7种类型之间都可以相互转换.eg:char c = 97;

  2. 小容量向大容量转换,称为自动类型转换,容量从小到大排序:
    byte < short < int < long < float < double < char

    注:任何浮点类型不管占用多少个字节,都比整数型容量大。char和short可表示的种类数量相同,但是char可以取更大的正整数

  3. 大容量转换成小容量,叫做强制类型转换,需要加强类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。

  4. 当整数字面值没有超出byte、short、char的取值范围,可以直接赋值给byte,short,char类型的变量

  5. byte、short、char混合运算的时候,各自先转换成int类型再做运算

  6. 多种数据类型混合运算,先转换成容量最大的那种类型再做运算

//右侧先计算再赋值,右侧计算结果是int类型
double dd = 10 / 3;
System.out.println(dd);//3.0

dd = 10.0/3;
System.out.println(dd);//3.33333333335

long g = 10;
//编译期只检查语法,不进行运算,JVM参与时进行运算。
//出现精度损失问题,以下问题主要是优先级问题
//将g转换成int,然后再将int类型的g转换成byte,
//最后byte类型的g和3运算,那么它的运算结果类型就是int,所以int赋值给byte就出现了精度损失
//byte h = (byte)(int)g/3;
byte h = 3;//可编译通过,3没有超出byte类型取值范围
byte h = (byte)(int)(g/3);//可以

short i = 10;
byte j = 5;
//错误,short和byte类型运算,首先会转换成int类型再运算
//所以运算结果为int,int赋值给short会出现精度丢失的问题
//short = i + j;

//可以将运算结果强制转换成short
//short = (short)(i + j);

char l = 'a';
System.out.println(l);//a
System.out.println((byte)l);//97,也就是a的ascii值

5. 变量

A. 变量的基本概念

  1. 什么是变量?
    变量本质上来说是内存中的一块空间,这块空间包含三部分:数据类型、名称、字面值【数据】,变量是内存中存储数据的最基本的单元。
  2. 变量要求:
    变量中存储的具体的“数据”【字面值】必须和变量的“数据类型”一致,当不一致的时候编译报错。
  3. 声明 / 定义变量的语法格式:数据类型+空格+变量名
  4. 变量在一行上可以声明多个
int a,b,c;
  1. 变量名只要是合法的标志符就行。规范要求:首字母小写,后面每个单词首字母大写
  2. 变量声明之后赋值的语法格式:变量名 = 字面值
  3. 声明和赋值可以放到一起完成。
int i = 10;
>目前我们还没有学习数据类型,但是提前告诉大家有一种数据类型是整数型叫做int
  1. 变量赋值之后,可以重新赋值,变量的值可变化:
  2. 有了变量的概念之后,内存空间得到了重复的使用:
int i = 10;
			System.out.println(i);
			...
			....
			System.out.println(i);
  1. 通常访问一个变量包括两种访问形式:
    * 第一种:读取变量中保存的具体数据 get/获取
    * 第二种:修改变量中保存的具体数据 set/设置
i = 20;  //set

			System.out.println(i);  //get
  1. 变量先声明然后赋值再访问

    在方法体中的java代码,是遵守自上而下的顺序依次逐行执行。
    第一行;
    第二行;
    第三行;
    * 特点:第二行的代码必须完整的结束之后,第三行程序才能执行。

public class VariableTest01
{
	public static void main(String[] args){
	
	//声明一个int类型的变量,起名i
	int i;
	//编译报错:变量i并没有初始化
	//System.out.println(i);

	//给i变量赋值,i变量在这里完成初始化,内存开辟
	i = 100;
	System.out.println(i);

	//i再次重新赋值
	i = 200;
	System.out.println(i);

	//一行上可以同时声明多个变量
	//a和b尚未初始化,c赋值300
	int a,b,c = 300;

	//编译错误
	//System.out.println(a);

	//编译错误
	//System.out.println(b);

	System.out.println(c);

B. 变量的作用域

变量的作用域就是变量的作用范围。在变量的作用范围之内是可以被访问的,只要出了这个范围,该变量就无法访问了。【新手可以理解为:出了大括号就不认识了

在同一个“作用域”当中,变量名不能重名,但是变量可以重新赋值;在不同的作用域当中,变量名是可以相同的。

public class VarTest03
{
	//注意:这里的static不要去掉
	static int k = 90;


	public static void main(String[] args){
		
		//变量i的作用域是main方法
		//在整个main方法当中是有效的、可见的,可以访问的
		int i = 100;
	
		System.out.println(i);//可以

		System.out.println(k);//可以

		//以下会编写一个for循环语句
		//这个for循环后面的控制语句的时候详细讲解
		for(int a=0;a<10;a++){
		//a变量的作用域是整个for循环,for循环结束之后,a变量的内存就释放了
		
		}

		//这里无法访问a变量
		//System.out.println(a);

		int j;//作用域是main方法
		
		for(j=0;j<0;j++){
		
		System.out.println(j);//访问的是main方法中的变量j		
		}
	}
	public static void doSome(){

		//这里无法访问main方法中的变量i
		//已经出了i变量的作用域
		//System.out.println(i);
	
		//可以
		System.out.println(k);
		}
}

C. 变量的分类

变量根据变量声明的位置来分类:

  • 局部变量:在方法体当中声明的变量叫做局部变量,局部变量在使用的前必须要赋值。
  • 成员变量:在方法体外【类体之内】声明的变量叫做成员变量,成员变量系统会给默认值,具体根据数据类型判断,一般向零看齐。
public class VarTest04
{
	//成员变量
	int k = 200;

	//主方法:入口
	public static void main(String[] args){
	
		//i变量就是局部变量
		int i = 10;
		
		//Java遵循“就近原则”
		System.out.println(i);
	}

	//成员变量
	int i = 100;

	//类体中不能直接编写java语句【除声明变量之外】
	//System.out.println(i);

	//doSome方法
	public static void doSome(){
	
		//局部变量
		int i = 90;
	}
}
	

6. 运算符

算术运算符

	+	求和
	-	相减
	*	乘积
	/	商
	%	求余数【取模】

	++	自加1
	--	自减1

一个表达式当中有多个运算符,运算符有优先级,不确定加小括号,优先级得到提升。新手可不专门记忆运算符的优先级。
public class OperatorTest01
{
	public static void main(String[] args){
	
		int i = 10;
		int j = 3;

		System.out.println(i + j);//13
		System.out.println(i - j);//7
		System.out.println(i * j);//30
		System.out.println(i / j);//3
		System.out.println(i % j);//1
	
		//以下以++为例,--运算符自学!
		//关于++运算符【自加1】
		int k = 10;

		//运算符可以出现在变量后面【单目运算符】
		k ++System.out.println(k);//11

		int y = 10;

		//++运算符可以出现在变量前面【单目运算符】
		++ y;

		System.out.println(y);//11

		//小结:
		//++运算符可以先出现在变量前,也可以出现在变量后,无论是变量前还是变量后
		//只要++运算结束,该变量中的值一定会自加1


		//++出现在变量后
		//规则:先做赋值运算,再对变量中保存的值进行自加1
		int a = 100;
		int b = a ++;
		System.out.println(a);//101
		System.out.println(b);//100

		//++出现在变量前
		int m = 20;
		int n = ++ m;
		System.out.println(m);//21
		System.out.println(n);//21
		}
	}

关系运算符

A. 关系运算符的运算结果一定是布尔类型:true/false

	>			大于
	>=			大于等于
	<			小于
	<=			小于等于
	==			等于
	!=			不等于

	=			是赋值运算符
	== 			是关系运算符

B. 关系运算符的运算原理
int a = 10;
int b = 10;
a > b 比较的时候,比较的是a中保存的10这个值和b中保存的10的这个值之间的大小比较
a == b也是如此

逻辑运算符

& 逻辑与:只有两个操作数都是真,结果才是真
| 逻辑或
! 逻辑非
^ 逻辑异或:两输入值不相同时,结果为真

&& 短路与
|| 短路或

  1. 逻辑运算fu要求两边的算子都是布尔类型,并且逻辑运算符最终的运算结果也是一个布尔类型
  2. 短路 与 / 或 和逻辑 与 / 或 最终的运算结果是相同的,只不过短路 与 / 或 存在短路现象
  3. 第一个表达式执行结果是true,会发生短路或;第一个表达式执行结果是false,会发生短路与。
  4. 从某个角度来看,短路与更智能。由于后面表达式可能不执行所以执行效率更高。这种方式在实际的开发中使用较多。短路与比逻辑与使用的多。短路与更常用。但是,在某些特殊的业务逻辑当中,要求运算符两边的算子必须全部执行,此时必须使用逻辑与,不能使用短路与,使用短路与可能导致右边的表达式不执行。
public class OperatorTest03
{
	public static void main(String[] args){
		
		//运算符优先级不确定加小括号
		System.out.println(5 > 3 & 5 > 2);//true
		System.out.println(5 > 3 & 5 > 6);//false
		System.out.println(5 > 3 | 5 > 6);//true

		System.out.println(true & false);//false
		System.out.println(true & true);//true
		System.out.println(false & false);//false

		System.out.println(true | false);//true
		System.out.println(false | false);//false
		
		System.out.println(!false);//true
		System.out.println(!true);//false

		System.out.println(true ^ false);//true
		System.out.println(false ^ false);//false
		System.out.println(true ^ true);//false

		/*
			//逻辑与和短路与
			int x = 10;
			int y = 8;
			//逻辑与
			System.out.println(x < y & ++x < y);
			System.out.println(x); //11		
		*/
		
		//逻辑与和短路与
		int x = 10;
		int y = 8;
		//短路与
		//x < y 结果是false,整个表达式结果已经确定是false
		//只有后面的表达式没有再执行,这种现象被称为短路现象
		//短路与才会有短路现象,逻辑与是不会存在短路现象的
		System.out.println( x < y && ++x < y);
		System.out.println(x);//10
		}
}

赋值类运算符

  • 基本的赋值运算符
    =

  • 扩展的赋值运算符
    +=
    -=
    *=
    /=
    %=

  1. 赋值类的运算符优先级:先执行等号右边的表达式,然后将执行结果赋值给左边的变量

  2. 注意以下代码:

     byte i = 10;
     i += 5;等同于:i = (byte)(i + 5);
    
     int k = 10;
     k += 5;等同于:k = (int)(k + 5)l;
    
     long x = 10L;
     int y = 20;
     y += x;等同于:y = (int)(y + x);
    
  3. 重要结论:
    扩展类的赋值运算符不改变运算结果类型,假设最初这个变量的类型是byte类型,无论怎么进行追加或追减,最终该变量的数据类型还是byte类型。

public class OperatorTest01
{
	public static void main(String[] args){
	
		//基本的赋值运算符
		int i = 10;

		System.out.println(i);//10

		i = i + 5;
		
		System.out.println(i);//15

		//扩展的赋值运算符【+=运算符可以翻译为“追加、累加”】

		i += 5;//等同于i = i + 5;

		System.out.println(i);//20

		i -= 5;//等同于i = i - 5;

		System.out.println(i);//15

		i *= 2;//等同于i = i * 2;

		System.out.println(i);//30

		i /= 4;//等同于i = i /4;

		System.out.println(i);//7

		i %= 2;//等同于i = i % 2;

		System.out.println(i);//1

		//------------------------------------

		//10没有超出byte取值范围,可以直接赋值
		byte b = 10;
		//b = 15;//可以,编译通过,15没有超出byte取值范围
		//编译错误,为什么?
		//编译器只检查语法,不运行程序,编译器发现b + 5的类型是int类型,b变量的数据类型是byte
		//大容量向小容量转换需要加强制类型转换符,所以以下程序编译报错
		//b = b + 5;
		//纠正错误
		b = (byte)(b + 5);
		System.out.println(b);//15

		byte x = 10;
		x += 5;//等同于:x = (byte)(x + 5);其实并不等同于x = x + 5;
		System.out.println(x);//15

		byte z = 0;
		z += 128;//等同于:z = (byte)(z + 128);
		System.out.println(z);//-128【损失精度】

		z += 10000;//等同于:z = (byte)(z + 10000);
		System.out.println(z);//-112

	}
}

字符串连接运算符 “ + ”

  1. +运算符在java语言中有两个作用:
    * 加法运算,求和
    * 字符串的连接运算

  2. 当“+”运算符两边的数据都是数字的话,一定是进行加法运算

  3. 当“+”运算符两边的数据只要有一个数据是字符串,一定会进行字符串连接运算,并且,连接运损之后的结果还是一个字符串类型。

    数字 + 数字 --> 数字【求和】

    数字 + “字符串” --> “字符串”【字符串连接】

  4. 在一个表达式当中可以出现多个“+”,在没有添加括号的前提之下,遵循自左向右的顺序依次运算。

public class OperatorTest02
{
	public static void main(String[] args){
	
		System.out.println(10 + 20);//30,这里的加号是求和
		System.out.println(10 + 20 + 30);//60,这里的加号也是求和
		System.out.println(10 + 20 + "30");//3030,自左向右的顺序依次运算,第一个加号是求和,第二个加号是字符串连接
		System.out.println(10 + (20 + "30"));//102030
		
		int a = 10;
		int b = 20;

		//要求在控制台上输出"10 + 20 = 30"
		System.out.println("10 + 20 = 30");

		//注意:要求以动态的方式输出
		System.out.println("10 + 20 = " + a + b);//"10 + 20 = 1020"
		System.out.println("10 + 20 = " + (a + b));//"10 + 20 = 30"
		System.out.println("a + 20 = " + (a + b));//"a + 20 = 30"
		System.out.println(a + " + b = " + (a + b));//"10 + b = 30"
		System.out.println(a + " + " + b + " = " + (a + b));//"10 + 20 = 30"
		
		a = 100;
		b = 200;
		System.out.println(a + " + " + b + " = " + (a + b));

		//引用类型String
		//String是SUN在javase当中提供的字符串类型
		//String.class字节码文件
		
		//int是基本数据类型,s是变量名,10是int类型的字面值
		int i = 10;

		//String是引用数据类型,s是变量名,"abc"是String类型的字面值
		//String s = "abc"
		String s = "abc";

		String username = "zhangsan";

		System.out.println("登录成功,欢迎" + username + "回来");
	}
}

三元运算符

  1. 语法规则:布尔表达式 ? 表达式1 : 表达式2

  2. 当布尔表达式的结果是true的时候,选择表达式1作为整个表达式的执行结果;当布尔表达式的结果是false的时候,选择表达式2作为整个表达式的执行结果。

public class OperatorTest03
{
	public static void main(String[] args){
	
	//编译错误,不是一个完整的Java语句
	//10;

	//编译错误,不是一个完整的Java语句
	//'男'

	//布尔类型的变量
	boolean sex = false;

	//分析以下程序是否可以编译通过?
	//编译错误,不是一个完整的Java语句,这只是一个值
	//sex ? '男' : '女';

	char c = sex ? '男' : '女';
	System.out.println(c);

	//语法错误,编译报错,结果可能是String,也可能是char,但是前边不能用char来接收数据。
	//类型不兼容
	//char c1 = sex ? "男" : '女';

	//编译错误,类型不兼容
	/*
	sex = false;
	char c1 = sex ? "男" : '女';
	*/
	//这个方法的括号里面什么类型的数据都可以写
	System.out.println(10);
	System.out.println("10");
	System.out.println('1');


	//可以
	System.out.println(sex ? '男' : "女");

	String s = sex ? "男的" : "女的";
	System.out.println(s);
	}
}

7. 控制语句

1. 选择结构

A. if / if…else

if语句又被称为分支语句/条件控制语句:

第一种:
				if(布尔表达式){
					java语句;
					java语句;
					java语句;
					java语句;
					java语句;
					......
				}
				
第二种:
				if(布尔表达式){
					java语句;
					java语句;
					......
				}else{
					java语句;
					java语句;
					......
				}
				
第三种:
				if(布尔表达式){
					java语句;
					java语句;
					......
				}else if(布尔表达式){
					java语句;
					java语句;
					......
				}else if(布尔表达式){
					java语句;
					java语句;
					......
				}else if(布尔表达式){
					java语句;
					java语句;
					......
				
}......

第四种:
				if(布尔表达式){
					java语句;
					java语句;
					......
				}else if(布尔表达式){
					java语句;
					java语句;
					......
				}else if(布尔表达式){
					java语句;
					java语句;
					......
				}else if(布尔表达式){
					java语句;
					java语句;
					......
				}else{
					java语句;
					java语句;
					......
				}

  1. 重点:对于Java中的if语句来说,只要有一个分支执行,整个if语句全部结束。
  2. 注意:以上的第二种编写方式和第四种编写方式都带有else分支,这两种方式可以100%保证会有分支执行。
  3. “所有的控制语句if for”都是可以嵌套使用的,只要合理嵌套就行
    嵌套使用的时候,代码格式要保证完美。【该缩进的时候必须缩进,大部分情况下使用大括号包围的需要缩进】
if(){
	if(){
		if(){
			if(){
				}
			}
		}
	}

  1. if语句的分支中只有一条java语句的话,大括号可以省略不写
    if( true / false ){ 一条Java语句; }
    if(true) 一条java语句;
    这种方式不推荐使用,别人这么写能看懂就行
    举个栗子:
public class IfTest04
{
	public static void main(String[] args){
		
		boolean sex = true;
		if(sex){
			System.out.println("男");
		}else{
			System.out.println("女");
		}

		sex = false;

		if (sex)System.out.println("男"); else System.out.println("女");
		
		//-------------------------------------------------------

		if (sex)
		{
			System.out.println("男");
			System.out.println("呵呵");
		}
		else
			System.out.println("女");

		//以上程序编译错误出现在26行,26行以上没有语法错误。
	}
}
练习题1 :

(仅供初学者练习改语法使用)

public class IfTest01
{
	public static void main(String[] args){
	
		//需求:所在位置的五公里范围之内有肯德基的话,去KFC吃午饭
		//公里数
		double distance = 1.0;//单位:KM

		//判断语句
		if(distance < 5)
		{
			System.out.println("去KFC吃午饭");
		}

		/*
			需求:
			假设系统给定一个考生的成绩,成绩可能带有小数点
			根据学生的成绩判断该学生的成绩等级:
				[90-100] A
				[80-90)  B
				[70-80)  C
				[60-70)  D
				[0-60)   E

			以上的逻辑判断采用if语句完成,应该怎么写?
		*/

		//double score = 56;
		
		//见名知意原则:应该统一把 x 换成 grade。
		double score = 101;
		String x = "对不起,您输入的成绩不合法";
		if(score < 0 || score > 100){
			x = "对不起,您输入的成绩不合法" ;
		}
		else if(score >= 90){
			x = "你的分数是A" ;//能够判断到这里说明成绩一定是[0-100]
		}
		else if(score >= 80){
			x = "你的分数是B"; 
		}
		else if (score >= 70){
			x = "你的分数是C"; 
		}
		else if (score >= 60){
			x = "你的分数是D"; 
		}else{
			x = "对不起,您的分数不及价格" ;
		}
		System.out.println(x);
	}
}

练习题2 :
/*
	需求:
		假设系统给定一个人的年龄,根据年龄来判断这个人处于生命的哪个阶段,年龄必须在[0-150]
		[0-5] 幼儿
		[6-10] 少儿
		[11-18] 青少年
		[19-35] 青年
		[36-55] 中年
		[56-150] 老年
*/
public class IfTest02
{
	public static void main(String[] args){

		//1、接收键盘输入:年龄【输入的时候必须输入数字】
		java.util.Scanner s = new java.util.Scanner(System.in);
		//让光标不换行闪动
		//System.out.println("请输入您的年龄");
		System.out.print("请输入您的年龄:");//输出提示信息,要不然用户根本不知道这里要干嘛!
		int age = s.nextInt();//停下来等待用户的输入,输入之后自动接收,赋值给age变量
		//System.out.println("age = " + age);

		//2、根据需求进行业务逻辑判断

		String str = "老年";//先给一个默认值
		if (age < 0 || age > 150){
			str = "您提供的年龄不合法,年龄值需要在[0-150]之间";
		}
		else if (age <= 5)
		{
			str = "您处于幼儿阶段";
		}
		else if (age <= 10)
		{
			str = "您处于少年阶段";
		}
		else if (age <= 18)
		{
			str = "您处于青少年阶段";
		}
		else if (age <= 35)
		{
			str = "您处于青年阶段";
		}
			else if (age <= 55)
		{
			str = "您处于中年阶段";
		}
		else if (age <= 150)
		{
			str = "您处于老年阶段";
		}
		System.out.println(str);
	}
}
练习题3 :
/*
	需求:

		判断当前的天气
			当外边下雨的时候:
				带雨伞:
					判断性别:
						当性别为男:带一把黑伞
						当性别为女:带一把花伞

			当外边是晴天的时候:
				判断天气的温度;
					当温度在30度以上:
						当性别为男:戴墨镜
						当性别为女:擦防晒霜

		提示:
			1、一定会用到嵌套
			2、天气状况、温度、性别都需要从键盘输入

				天气状况:1表示下雨,0表示晴天
				温度直接使用数字即可
				性别:1表示男,0表示女
*/
public class IfTest03
{
	public static void main(String[] args){
		
		//接收
		java.util.Scanner s = new java.util.Scanner(System.in);
		
		//简单说明
		System.out.println("欢迎使用本系统,您通过本系统可以完成一些简单的判断");
		System.out.println("说明1:1表示下雨,0表示晴天");
		System.out.println("说明2:1表示男,0表示女");
		System.out.println("说明3:温度为数字");

		//接收性别
		System.out.print("请输入您的性别:");
		int sex = s.nextInt();

		//接收天气情况
		System.out.print("请输入当前天气情况:");
		int weather = s.nextInt();

		//判断天气情况
		//下雨天
		if (weather == 1)
		{			
			if (sex == 1)
			{
				System.out.println("带一把大黑伞");
			}else if(sex == 0){
				System.out.println("带一把小花伞");
			}else{
				System.out.println("对不起,您的性别是怎么回事?");
			}
		//晴天
		}else if(weather == 0){
			//接收温度
			System.out.println("请输入当前温度:");
			int tem = s.nextInt();
			if (tem > 30)
			{			
				if (sex == 1)
				{
					System.out.println("戴墨镜");
				}else if(sex == 0){
					System.out.println("涂防晒霜");
				}else{
					System.out.println("对不起,您的性别是怎么回事?");
				}		
			}
		}else{
					System.out.println("对不起,您输入的天气不存在!");
				}					
	}
}
B. switch
  1. switch语句的语法结构:

     	一个比较完整的switch语句应该这样编写:
    
     		switch(int或String类型的字面值或变量){
     			case int 或 String类型的字面值或变量:
     				java语句;
     				java语句;
     				java语句;
     				...
     				break;
     			case int 或 String类型的字面值或变量:
     				java语句;
     				java语句;
     				java语句;
     				...
     				break;
     			case int 或 String类型的字面值或变量:
     				java语句;
     				java语句;
     				java语句;
     				...
     				break;
     			case int 或 String类型的字面值或变量:
     				java语句;
     				java语句;
     				java语句;
     				...
     				break;
     			...
     			default:
     				java语句;
     				...					
     		}
    
  2. switch语句的执行原理:
    switch后面小括号当中的“数据”和case后面的“数据”进行一一匹配,匹配成功的分支执行。

    按照自上而下的顺序依次匹配

  3. 匹配成功的分支执行,分支当中最后有“break;”语句的话,整个switch语句终止。

  4. 匹配成功的分支执行,分支当中没有“break;”语句的话,直接进入下一个分支执行(不进行匹配),
    这种现象被称为case穿透现象。【提供break;语句可以避免穿透】

  5. 这种分支都没有匹配成功,当有default的语句的话,会执行default分支当中的程序

  6. switch后面和case后面只能是int或String类型的数据,不能探测其他类型。

  • 当然byte,short,char也可以直接写到switch和case后面,因为他们可以进行自动类型转换。byte,short,char可以自动转换成int类型。

  • JDK6的,switch和case后面只能探测int类型

  • JDK7之后包括7版本在内,引入新特性,switch关键字和case关键字后面可以探测出int或String类型的数据。

  1. case可以合并
	int i = 10;

			switch(i){
				case 1 : case 2 : case 3 : case 10;
					System.out.println("Test Code!");
			}

举堆栗子:

public class SwitchTest01
{
	public static void main(String[] args){
		
		/*
		long a = 10L;
		int b = a;//损失精度,编译报错
		*/

		/*
		long x = 100L;
		switch(x){}//损失精度,编译报错
		*/

		//解决编译错误
		long x = 100L;
		switch((int)x){}

		byte b = 10;
		switch(b){};

		char c = 'A';
		switch(c){};

		char cc = 97;
		switch(cc){};

		//编译报错
		//switch(true){}

		String username = "zhangsan";
		switch (username){}

多敲练习
//接收用户的输入
		//1 表示星期一
		//2 表示星期二
		//...
		//7 表示星期日

		java.util.Scanner s = new java.util.Scanner(System.in);
		System.out.print("请输入数字:");
		int num = s.nextInt();
		switch (num)
		{
		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;
		default :
			System.out.println("对不起,您输入的数字非法!");
		
		}

Switch确实可以探测String类型

public class SwitchTest02
{
	public static void main(String[] args){
		java.util.Scanner s = new java.util.Scanner(System.in);

		System.out.print("今天星期几?");

		String dayOfWeek = s.next();

		switch(dayOfWeek){
			
			case "星期一":
				System.out.println(1);
				break;
			case "星期二":
				System.out.println(2);
				break;
			case "星期三":
				System.out.println(3);
				break;
			case "星期四":
				System.out.println(4);
				break;
			case "星期五":
				System.out.println(5);
				break;
			case "星期六":
				System.out.println(6);
				break;
			case "星期日":
				System.out.println(7);
				break;	
			default :
					System.out.println("对不起,你输入的数据非法!");
		}
	}
}
练习题 1 :
/*
	实现计算器当中的
		+
		-
		*
		/
		%

	实现思路:
		1、选择所有数据从键盘输入
		2、使用switch语句进行判断
		3、需要从控制台输入三次:
			* 第一个数字
			* 运算符
			* 第二个数字

		最终在控制台上是这样的一个场景;
			欢迎使用简单计算器系统:
			请输入第一个数字:10
			请输入运算符:+
			请输入第二个数字:20
			运算结果:10 + 20 = 30

*/

public class SwitchTest04
{
	public static void main(String[] args){
		java.util.Scanner s = new java.util.Scanner(System.in);

		System.out.println("欢迎使用简单计算器系统!");

		System.out.print("请输入第一个数字:");
		int num1 = s.nextInt();

		System.out.print("请输入运算符:");
		String operator = s.next();

		System.out.print("请输入第二个数字:");
		int num2 = s.nextInt();

		int result = 0;
		switch (operator)
		{
		case "+" :
			result = num1 + num2;
			break;
		case "-" :
			result = num1 - num2;
			break;
		case "*" :
			result = num1 * num2;
			break;
		case "/" :
			result = num1 / num2;
			break;
		case "%" :
			result = num1 % num2;
			break;
		}
		System.out.println("运算结果:" + num1 + operator + num2 + "=" + result);
	}
}
练习题 2 :
/*
	假设系统给定考生成绩,请判断该考生的成绩等级:

		1、有效成绩范围:[0-100]

		2、考试成绩可能带有小数

		3、考试成绩和等级之间的对照关系:
			[90-100]	A
			[80-90)		B
			[70-80)		C
			[60-70)		D
			[0-60)		E

		4、以上需求必须采用switch语句完成,不能采用if。

		窍门:(int)(成绩 / 10)
		0
		1
		2
		3
		4
		5
		6
		7
		8
		9
		10
*/
public class SwitchTest05
{
	public static void main(String[] args){

		//考生成绩
		double score = 85.5;
		
		//转换int
		int grade = (int)(score / 10);

		switch (grade)
		{
		case 9: case 10:
			System.out.println("A");
			break;
		case 8:
			System.out.println("B");
			break;
		case 7:
			System.out.println("C");
			break;
		case 6:
			System.out.println("D");
			break;
		default :
			System.out.println("E");
		}
	}
}

2. 循环结构

  1. 循环结构:
    在程序当中总有一些需要反复的/重复的执行的代码,假设没有循环结构,那么这段需要重复执行的代码自然是需要重复编写的。代码无法得到重复使用。所以多数编程语言都是支持循环结构的。将来把需要反复执行的代码片段放到“循环体”,再联合“计数器”,共同控制这段需要反复执行的代码。

  2. 基本上所有编程语言支持的循环包括三种:

  • for 循环
  • while 循环
  • do…while循环
A.for
  1. 语法结构:
			for( 初始化表达式 ; 布尔表达式 ; 更新表达式 ){
				//是需要重复执行的代码片段【循环体:由java语句构成】
			}
  1. for循环执行过程 / 执行原理
  • 初始化表达式、布尔表达式、更新表达式都不是必须的!(;;)是必须要的
  • 初始化表达式最先执行,并且在整个for循环当中只执行一次布尔表达式必须是true/false,不能是其他值
  • for的执行过程:
* 先执行初始化表达式,并且该表达式只执行一次

			* 判断布尔表达式的结果是 true 还是 false 
				
				- 布尔表达式 true

					* 执行循环体
					
					* 执行更新表达式

					* 判断布尔类型表达式的结果是 true 还是 false
						
						- true
						...

						- false
						...

				- 布尔表达式 false
					
					* 循环结束

举堆栗子:

public class ForTest01
{
	public static void main(String[] args){
		
		/*
		//需求:输出数字1-10
		System.out.println(1);
		System.out.println(2);
		System.out.println(3);
		System.out.println();
		System.out.println(4);
		System.out.println(5);
		System.out.println(6);
		System.out.println(7);
		System.out.println(8);
		System.out.println(9);
		System.out.println(10);
		*/

		//使用循环结构来代替以上所有反复执行的代码块
		//使用循环语句可以让代码量变少

		//将以上代码修改为for循环
		for (int i = 1 ; i <= 10 ; i = i + 1)
		{
			System.out.println(i);
			
		}
		for (int i = 1 ; i <= 10 ; i += 1)
		{
			System.out.println(i);
		}
		for (int i = 1 ; i <= 10 ; i++ )
		{
			System.out.println(i);
		}
		//死循环
		//ctrl c结束死循环
		for (; ; )
		{
			System.out.println("死循环");
		}
		
	}
}
1. i 变量的作用域
public class ForTest02
{
	public static void main(String[] args){
		
		//以下的for循环当中"i"变量的作用域是仅限于当前for循环内部使用
		for (int i = 0 ; i < 10 ; i++ )
		{
			System.out.println(" i ---> " + i );
		}

		//以下的for循环当中"i"变量的作用域是仅限于当前for循环内部使用
		for (int i = 0 ; i <= 10 ; i++ )
		{
			System.out.println(" i ---> " + i );
		}
		//这个i变量可以在main方法的作用域当中访问吗?无法访问
		//System.out.println("i = " + i);//编译错误

		//main方法作用域当中的变量,只要main方法没有结束,这里的i就能用
		int i = 0;

		for (; i < 10 ;  i++ )
		{
			System.out.println(" i = " + i);
		}

		//这里可以访问main方法作用域当中的i变量
		System.out.println("i ===>" + i);
		

		int j;

		for ( j = 1 ; j < 10 ; j++ )
		{
			System.out.println(" j--> " + j);
		}
		System.out.println(j);
	}
}
小练习:
public class ForTest03
{
	public static void main(String[] args){
	
	//输出1~10中所有的奇数
	for (int i = 1;i<=10 ;i+=2 )
	{
		System.out.println("i--->" + i);//1 3 5 7 9 
	}

	//输出1~10中所有的偶数
	for (int i = 2;i<=10 ;i+=2 )
	{
		System.out.println("i--->" + i);//2 4 6 8 
	}
	
	for (int i = 10;i > 0 ;i-- )
	{
		System.out.println("i===>" + i);//10 9 8 7 6 5 4 3 2 1 
	}
	for (int i = 100;i>=50 ;i-=10 )
	{
		System.out.println("i====>" + i);//100 90 80 70 60 50

	}
	for (int i = 0;i<10 ; )
	{
		i++;
		System.out.println("计数器===>" + i);//1 2 3 4 5 6 7 8 9 10
	}
	for (int i = 0;i<10 ; )
	{
		System.out.println("计数器===>" + i);//0 1 2 3 4 5 6 7 8 9
		i++;
	}

	}
}
2. 循环语句和条件语句嵌套使用(附例)
public class ForTest04
{
	public static void main(String[] args){

	//找出1~100所有的奇数
	//第一种方案:从1开始,每次递增2,这样每一个数字一定是奇数
	for (int i = 1;i<=100 ;i+=2 )
	{
		System.out.println("i--->" + i);
	}

	//第二种方案:从1开始,每次递增1,每一个数据都进行判断,判断标准是该数字对2求余数
	for (int i = 1;i<=100 ;i+=1 )
	{
		int x = i % 2;
		if (x != 0)
		{
			System.out.println("i--->" + i);
		}
	}
		//以上两种方案,优先选择第一种方案,代码少,循环次数少,效率较高

	}
}
练习题 1 :
/*
	在前一个程序的基础之上,计算1~100所有奇数的和
		1 + 3 + 5 + 7 + 9 + ...... +99 累加

	运算符 += 就是专门完成追加的。

*/
public class ForTest05
{
	public static void main(String[] args){

		int sum = 0;//定义一个盒子,sum存的是最终求和结果,不能把sum定义到循环体里,每次执行都会把求和结果归零
	
		for (int i = 1;i<=99 ;i+=2 )
		{
				sum += i; 
		}
		System.out.println("sum = " + sum);//输出语句也不能放到循环体里,以上循环全部结束之后,最终输出求和结果
	
	}
}
3. for循环嵌套for循环
public class ForTest06
{
	public static void main(String[] args){
		for (int i = 1;i<=10 ;i++ )//共循环10次
		{
			//循环体中可以编写其他控制语句
			//控制语句可以嵌套使用
			//控制语句可以是:if\if..else\switch\for\while\do..while
			
			if ()
			{
				for (; ; )
				{
					while ()
					{
						if ()
						{
							for (; ; )
							{
							}
						}
					}
				}
			}

			//最好不要想太多,即使循环体当中是一个for循环,不要将这个for特殊化,也只是一个普通的for循环
			//只不过是一段符合java语法的代码

			//内层循环,内层循环中的变量名和外层循环中的变量名不能重名
			/*
				for(int i = 100;;){}
			*/

			//System.out.println("i--->" + i);

			//这里是循环体,无论这个循环体当中编写了什么样的代码,这堆代码也需要执行10遍

			for (int i = 0;i < 10 ;i++ )
			{
				for (int j = 0;j<3 ;j++ )
				{
					System.out.println("j--->" + j);//30遍012
				}
			}

		}
	}
}
练习题1、2 :
public class ForTest07
{
	public static void main(String[] args){
	
	for (int i = 0;i<10 ;i++ )//循环10次
	{	
		System.out.println("Begin!");
		//这里的代码片段执行10遍
		for (int j = 0;j<1 ;j++ )//循环1次,输出0
		{
				System.out.println("j--->" + j);
		}
		System.out.println("Over");
	}
		/*
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over
			Begin
			0
			Over

		*/


		for (int i = 1;i<=5 ;i++ )
		{
			System.out.println("开始");

			for (int j = 1;j<=5 ;j++ )
			{
				System.out.println(i * j);
			}
			System.out.println("结束");
		}
			/*
				开始
				(1*1)1
				(1*2)2
				(1*3)3
				(1*4)4
				(1*5)5
				结束
				开始
				(2*1)2
				(2*2)4
				(2*3)6
				(2*4)8
				(2*5)10
				结束
				开始
				(3*1)3
				(3*2)6
				(3*3)9
				(3*4)12
				(3*5)15
				结束
				开始
				(4*1)4
				(4*2)8
				(4*3)12
				(4*4)16
				(4*5)20
				结束
				开始
				(5*1)5
				(5*2)10
				(5*3)15
				(5*4)20
				(5*5)25
				结束

			*/
	}
}
练习题 3:
/*
	使用for循环输出九九乘法表:

	1*1=1
	2*1=1 2*2=4
	3*1=3 3*2=6 3*3=9
	............
	................
	9*1=9 ......................9*9=81
*/
public class ForTest08
{
	public static void main(String[] args){
		for (int i = 1;i<=9 ;i++ )//外层循环9次
		{
			//循环体当中的程序主要的任务是什么?
			//处理当前行,将当前行中所有的项目全部输出
			for (int x = 1;x<=i ;x++ )
			{
				System.out.print(i + "*" + x + "=" + i * x + " ");
				//空格
				//System.out.print(" ");
			}
			//换行
			System.out.println("");
			//System.out.print("\n");
		}
	}
}
B.while
  1. 语法结构:
while(布尔表达式){
	循环体;
}
  1. while循环的执行原理:
先判断布尔表达式的结果:
	* true
		- 执行循环体
			* 判断布尔表达式的结果:
				* true
					- 执行循环体
						* 判断布尔表达式的结果
							...
				* false
					- 循环结束
	* false
		- 循环结束
  1. while循环的循环次数:0 ~ n次【while的循环体可能执行次数为0】
public class WhileTest01{
	public static void main(String[] args){
		//死循环
		while(true){
			System.out.println("死循环");
		}
		//编译器检测到该程序永远都无法被执行,所以编译报错
		//System.out.println("HelloWorld!");

		int i = 10;
		int j = 3;
		while(i > j){
			System.out.println("你好!");
		}
		
		//编译错误
		/*
		while(10 > 3){
			System.out.println("你好!");
		}
		*/
		
		System.out.println("HelloWorld!");
	}
}
练习题 1:
//使用while循环输出1~10
public class WhileTest02{
	public static void main(String[] args){
		int i = 1;
		while(i <= 10){
			System.out.println(i);
			i++
		}
		System.out.println("end--->" + i);
		System.out.println(-----------------------);
		int j = 10;
		while(j > 0){
			System.out.println(j--);//10 9 8 7 6 5 4 3 2 1 
			System.out.println(j);//9 8 7 6 5 4 3 2 1 0
		}
		System.out.println("end--->" + j);//0
		System.out.println(----------------------------);
		int k = 10;
		while(k >= 0){
			System.out.println(--K);//9 8 7 6 5 4 3 2 1 0 -1
		}
		System.out.println("end k---->" + k);
	}
}
C.do…while
  1. 语法结构:
do{
	循环体;
}while(布尔表达式);
  1. 执行原理
  2. do…while循环的循环体代码片段执行次数是:1 ~ n次【至少一次】
  3. 注意:do…while语句最后有一个“ ; ”别忘了
public class DoWhileTest01{
	public static void mian(String[] args){
		int i = 10;
		do{
			System.out.println(i);//有点先斩后奏的意思
		}while(i > 100);
		System.out.println(------------------------);
		while(i > 100){
			System.out.println("i--->" + i);//x
		}
		System.out.println(----------------------------);
		int a = 1;
		do{
			System.out.println(a);//1 2 3 4 5 6 7 8 9 10
			i++;
		}while(a <= 10);
	}
}

3. 控制循环语句

A. break
  1. “ break ; ” 可以是一个单独的完整的java语句
  2. 可以使用在switch语句当中用来终止switch语句的执行
  3. 还可以用在循环语句当中用来终止循环的执行
  4. break语句使用在for,while,do…while循环语句当中用来跳出循环,终止循环的进行。因为当程序循环到某个条件的时候,后续的循环没必要执行了,再执行也是耗费资源,所以可以终止循环,这样可以提高程序的执行效率。
  5. 在默认情况下:break语句终止的是离他最近的循环语句。当然也可以指定终止某个循环,需要给循环起名子,采用这种语法:break+空格+循环名称 ;

举个栗子:

public class BreakTest01{
	public static void main(String[] args){
		for(int i = 1;i <= 1;i++){
			if(i == 5){
				break;//终止的是当前的for循环
			}
			System.out.println("i--->" + i);//0 1 2 3 4
		}
		//这里的程序和以上的for循环无关
		System.out.println("HelloWorld!");

		for(int j = 0 ;j < 3;j++){
			for(int i = 0 ;i < 10;i++){
				if(i == 5){
					break;//当前的break语句终止的是内层for循环,因为这个for离它最近
						  //这里的break语句不会影响到外层for循环
						  	
		//给for循环起名for1
		for1:for(int j = 0 ;j < 3;j++){
					//给for循环起名for2
					for2:for(int i = 0 ;i < 10;i++){
						if(i == 5){
							break for1;//终止for1循环
				}
				System.out.println("i--->" + i);
			}
		}
	} 
}
B. continue
  1. “ continue ; ” 可以是一个单独的完整的java语句
  2. break和continue区别:
  • break表示循环不执行了
  • continue表示终止当前本次循环,直接进入下一次循环继续执行
  • 【了解】语法:continue+空格+循环名称
public class ContinueTest01{
	public static void main(String[] args){
		for(int i = 0;i < 10;i++){
			if(i == 5){
				continue;
			}
			System.out.println("i--->" + i);//0 1 2 3 4 6 7 8 9 
		}
		System.out.println("HelloWorld!");

		for(int i = 0;i < 10;i++){
			if(i == 5){
				break;//只要这个语句执行,当前本次循环停止,直接进入下一次循环继续执行
			}
			System.out.println("i--->" + i);//0 1 2 3 4 
		}
		System.out.println("HelloWorld!");

		MyFor:for(int i = 0;i < 10;i++){
			if(i == 5){
				continue MyFor;
			}
			System.out.println("i--->" + i);
		}
		System.out.println("HelloWorld!");
		}	
	}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值