红色培训网站源码,发布新闻的平台有哪些,西安网站建设公,辽宁营口建设工程信息网站前言 本片文章主要讲了刚学Java的一些基础内容,例如注释,标识符,数据类型和变量,运算符,还有逻辑控制等,记录的很详细,带你从简单的知识点再到练习题.如果学习了c语言的小伙伴会发现,这篇文章的内容和c语言大致相同. 而在下一篇文章里,我会讲解方法和数组的使用,也是Java中基础… 前言 本片文章主要讲了刚学Java的一些基础内容,例如注释,标识符,数据类型和变量,运算符,还有逻辑控制等,记录的很详细,带你从简单的知识点再到练习题.如果学习了c语言的小伙伴会发现,这篇文章的内容和c语言大致相同. 而在下一篇文章里,我会讲解方法和数组的使用,也是Java中基础的部分,但相较于c语言会有一些差别,大家一定要注意呀! 感谢大家点赞收藏⭐评论✍您的三连就是我持续更新的动力❤️ 欢迎各位大佬指点相互学习,一起进步 目录 一、初识Java 1.什么是Java? 1.1.Java工作领域 1.2.Java与c异同点 1.3Java软件安装 (IDEA) 1.4 Java 技术体系 2.第一个Java程序 2.1注意事项: 2.2Java程序编译运行过程 3.注释 3.1什么是注释? 3.2注释的快捷方式 3.3注释有哪些? 4.标识符 4.1什么是标识符? 4.2标识符起名规则 4.3关键字 编辑二 、数据类型和变量 1.字面常量 1.1字面常量的分类 2数据类型 2.1数据类型的种类 2.2.什么是字节 3.变量 3.1概念与格式 3.2整型变量 3.2.1整型变量 3.2.2长整型变量 3.2.3短整形变量 3.2.4字节型变量 3.3浮点型变量 3.3.1双精度浮点型 3.3.2单精度浮点数 3.4字符型变量 3.5布尔类型 3.6类型转换 3.6.1自动类型转换(隐式) 3.6.1强制类型转换(显式) 3.7类型提升 4.字符串类型 三、运算符 1.算术运算符 1.1. 基本四则运算符加减乘除模( - * / % 1.2. 增量运算符 - * / % 2.关系运算符 ! 3. 逻辑运算符( || !) 3.1逻辑与--- 3.2逻辑或--|| 3.3 逻辑非 ! 3.4. 短路求值 4. 位运算符 | ~ ^ 4.1按位与--- 4.2按位或---| 4.3按位取反---~ 4.4按位异或---^ 5. 移位运算( ) 5.1左移运算符 5.2右移运算符 和() 6. 条件运算符 7.运算符的优先级 四 、逻辑控制 1.顺序结构 2.分支结构 2.1if语句 练习 2.2switch语句 3.循环结构 3.1while语句 练习 3.2.break与continue 3.3for循环 练习: 3.4.do while循环 练习: 五.输入输出 1.输出到控制台 2 从键盘输入 2.1使用 Scanner 读取字符串/整数/浮点数 2.1.1一般写法 2.1.2标准写法 2.2使用 Scanner 循环读取 总结 一、初识Java
1.什么是Java?
Java是一种优秀的程序设计语言它具有令人赏心悦目的语法和易于理解的语义。
不仅如此Java还是一个有一系列计算机软件和规范形成的技术体系这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。
1.1.Java工作领域
Java语言目前在IT领域的应用是非常广泛的掌握Java语言可以从事不少IT行业的相关开发岗位具体包括
企业级系统Web开发领域android平台应用大数据平台开发
1.2.Java与c异同点
类型系统与内存管理 Java 是一种强类型语言具有自动垃圾回收机制来处理不再使用的对象这减轻了程序员手动释放内存的工作负担 相比之下C是一种过程式编程语言在内存管理和指针操作方面给予开发者更大的控制权但也因此增加了程序错误的风险 面向对象支持 Java 完全基于面向对象的设计理念构建而成所有的代码几乎都需要定义在类里面执行。 而C则不具备内置的对象导向特性尽管可以通过结构体(structures)模拟一些简单的封装形式但这远不及Java所提供的全面OOP框架那样强大和灵活。 平台独立性 编译后的Java字节码可以在任何安装有JVM(Java虚拟机)的操作系统上运行实现了真正的跨平台能力。“编写一次到处运行”的口号正是体现了这一点。然而,C源文件通常会被编译成特定硬件架构下的原生二进制指令集这意味着为了使同一份应用程序能在不同类型的计算机之间移植则往往需要重新编译并调整底层实现细节以适应目标环境的要求。 错误处理方式 当遇到异常情况时Java采用抛出异常的方式通知调用者发生了什么问题并允许通过try-catch-finally语句块来进行优雅降级或恢复流程逻辑。而在标准库层面之外C并没有提供类似的机制大多数情况下依赖于返回状态码告知函数调用方是否成功完成预期动作。 1.3Java软件安装 (IDEA)
【附安装包】IDEA下载、安装、配置与使用保姆级教程_idea下载安装教程-CSDN博客
1.4 Java 技术体系
技术体系说明Java SE标准版Java技术的核心和基础Java EE企业版企业级应用开发的一套解决方案Java ME小型版针对移动设备应用的解决方案
2.第一个Java程序
public class Test {public static void main(String[] args) {System.out.println(hello world);}
}
2.1注意事项: 1.在c 语言中,main函数是程序称为main函数,而在Java中称为main方法 2.在IDEA 中,由于 public static void main(String[] args) {}很长,我们只需要输入main,然后点击Tab 即可生成 同理 System.out.println(hello world);我们只需要输入sout,然后点击Tab 即可生成 3.Java中的打印函数较c 不同,每当我们打印完一句话时,会自动换行 (ln相当于line,打印内容自动添加换行) 4.ctrlF5快捷运行 也可点击前面的绿色三角符号 5.确保你的文件是.java后缀 6.确保文件名与类名相一致,上图中Test为文件名,注意首字母要大写 此为类名 否则会报错,出现红色波浪线 2.2Java程序编译运行过程
由编译器将.Java文件Java的源代码文件转换为.class字节码文件
JVM再运行.class字节码文件执行里面的逻辑
3.注释
3.1什么是注释?
解释说明程序含义,方便自己与别人观看,因为在工作中,修改代码非常常见,我们很容易忘记代码含义,所以可以对一些关键代码或者不易理解的代码进行注释
3.2注释的快捷方式
ctrl/能够对选中的部分进行注释,再次点击取消注释
3.3注释有哪些?
单行注释://多行注释:/* ......*/文档注释:/**......*/
注意事项: 1. 多行注释不能嵌套使用 2. 不论是单行还是多行注释都不参与编译即编译之后生成的.class文件中不包含注释信息 4.标识符
4.1什么是标识符?
在编程语言中标识符是用来给变量、常量、函数、类、接口等元素命名的字符序列。它们是编程时使用的“名字”建立起名称与使用之间的关系。标识符的命名不仅有助于代码的理解和维护而且是编程语言语法的一部分。
4.2标识符起名规则
硬性规则: 标识符中可以包含字母、数字以及 下划线和 $ 符号等等。 注意标识符不能以数字开头也不能是关键字且严格区分大小写。 软性建议 : 类名每个单词的首字母大写(大驼峰)eg:StudentName 方法名首字母小写后面每个单词的首字母大写(小驼峰)eg:studentName 变量名与方法名规则相同 4.3关键字 通过观察上述程序可以发现public、class以及static等颜色会发生变化将这些具有特殊含义的标识符称为关键字。即关键字是由Java语言提前定义好的有特殊含义的标识符或者保留字。
二 、数据类型和变量
1.字面常量
常量即程序运行期间固定不变的量称为常量
public class Test{public static void main(String[] args){System.Out.println(hello world!);System.Out.println(100);System.Out.println(3.14);System.Out.println(A);System.Out.println(true);System.Out.println(false);}
}
其中100、3.14、‘A’、true/false都是常量将其称为字面常量
1.1字面常量的分类
1. 字符串常量由双引号 括起来的比如“12345”、“hello”、“你好”。
2. 整形常量程序中直接写的数字(注意没有小数点)比如100、1000
3. 浮点数常量程序中直接写的小数比如3.14、0.49
4. 字符常量由 单引号 括起来的当个字符比如‘A’、‘1’
5. 布尔常量true和false(只有这两种)
6. 空常量null
注意字符串、整形、浮点型、字符型以及布尔型在Java中都称为数据类型。
2数据类型
2.1数据类型的种类
在Java中数据类型主要分为两类基本数据类型和引用数据类型。
数据类型关键字内存占用范围字节型byte1字节-128~127短整型short2字节-32768~32767整型int4字节-~-1长整型long8字节-~-1单精度浮点数float4字节有范围一般不关注双精度浮点数double8字节有范围一般不关注字符型char2字节0~65535布尔型boolean没有明确规定true与false
2.2.什么是字节
字节是存储空间的单位在计算机中使用二进制表示和存储数据一个二进制位称为1个比特
8个二进制位构成一个字节(Byte) 1024 Byte1KB 1024KB1MB 1024MB1GB 1024GB1TB 8个二进制位中第一位表示正负号由于只用01存储所以128即1字节的范围为-128~127
注意
1.与c 不同Java在32位系统与64位系统中int都占4个字节long都占8个字节
2.与c 不同Java的字符型char占2个字节表示范围更大可以包含中文(常用字)
3.整型和浮点型都带有符号
4.float的精度和范围都非常有限所以我们一般用double short的范围太小所以一般用int
5.使用long类型时数字后面加上L/l
6.数字太长时可以用_进行分割
7.与C相同的是,也是ascii编码的方式来表示字符包括汉字
ASCII 表 | 菜鸟教程
要表示汉字的,此处Java中使用了Unicode这样的方式来进行编码
查看字符编码UTF-8
此网站可以将汉字转化为Unicode编码 到这里大家可能对Unicode和 ASCII 存在疑惑可以参考一下下面这篇文章
彻底搞清楚ASCIIUnicode和UTF-8之间的关系_ascii utf8 关系-CSDN博客
3.变量
3.1概念与格式 在程序中除了有始终不变的常量外有些内容可能会经常改变比如人的年龄、身高、成绩分数、数学函数的 计算结果等对于这些经常改变的内容在 Java 程序中称为变量 。 int t 20;System.out.println(t);t 100;System.out.println(t); 像这样能够被改变的则称为变量 注意赋值时要求值的类型和变量类型匹配 而数据类型就是用来定义不同种类变量的。 数据类型 变量名 初始值 ; char c 中;long d 100_0000_0000l;//长整型后面得加Lint a 4;double b 3.14;
可以在一行定义多个变量不建议
int a 4,q 6,o 9;
3.2整型变量
3.2.1整型变量
1.定义整型变量 int a 2;//在定义时给出初始值建议这种方法System.out.println(a);int b ;//可以先定义变量但是在使用前必须 设置初值 b 3;System.out.println(b);int c;//如果在使用前没有复制出值则编译期间会报错 System.out.println(c);c4;
2.int型变量的范围超过范围会导致溢出 System.out.println(Integer.MIN_VALUE);//int 的范围System.out.println(Integer.MAX_VALUE);
//输出范围为-2147483648~2147483647
注意integer是int的包装类后续会介绍
3.2.2长整型变量 1.定义长整型变量 int c 10;long d 100_0000_0000L; // long定义的长整型变量,如果超出了int的范围后面必须加上L大小写均可建议大写否则不容易区分long a 10L; // 为了区分int和long类型一般建议long类型变量的初始值之后加L或者l 2.long型变量的范围超过范围会导致溢出 System.out.println(Long.MIN_VALUE);//long 的范围System.out.println(Long.MAX_VALUE);//输出范围为-9223372036854775808~9223372036854775807
注意Long是long的包装类后续会介绍
3.2.3短整形变量
1.定义短整形变量
short a 10;
System.out.println(a);
2.short型变量的范围范围很小使用时一定要注意是否溢出
System.out.println(Short.MIN_VALUE);
System.out.println(Short.MAX_VALUE); 3.2.4字节型变量
byte b 10;
System.out.println(b);
// byte型变量所能表示的范围
System.out.println(Byte.MIN_VALUE);
System.out.println(Byte.MAX_VALUE); 3.3浮点型变量
3.3.1双精度浮点型
1.定义双精度浮点型变量 double c 3.14;System.out.println(c);
2. 在 Java 中 , int 除以 int 的值仍然是 int( 会直接舍弃小数部分 ) 。如果想得到 0.5, 需要使用 double 类型计算 . int a 1;
int b 2;
System.out.println(a / b); 3.特殊注意
double c 1.1;
System.out.println(c*c); 结果为1.2100000000000002因为doublefloat这样的类型无法精确的表示一个小数是会存在误差的不只是Java像CCPython都会有类似问题double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势 必会存在一定的精度误差因此浮点数是个近似值并不是精确值double的包装类型为Double 3.3.2单精度浮点数
float num 1.0f; // 写作 1.0F 也可以
System.out.println(num); 注意与long类似对于1.5字面值常量默认是double类型要想定义float类型需要F/f作为后缀 float 类型同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数 都优先考虑 double, 不太推荐使用 float.float的包装类型为Float。 3.4字符型变量
在Java中字符类型是通过2个字节来表示的使用Unicode编码对内容进行编排更严谨的说法char是使用Unicode的子集以前Unicode早期版本使用两个字节足够了当时Java就规定char是两个字节但是随着时代发展Unicode包含内容更多导致2 个字节表示不下了改也来不及。但是虽然当前Java的char不能表示全部Unicode至少可以把常用的都表示出来
char c1 A; // 大写字母
char c2 1; // 数字字符
System.out.println(c1);
System.out.println(c2);
char的包装类型为Character
3.5布尔类型
只有true和false两种小写
boolean b true;
System.out.println(b);
b false;
System.out.println(b);
注意事项
在Java中boolean类型是单独的类型true和false就是这个单独类型的字面值与int类型无关和0或非0这样的设定无关而不像在c 语言中表达式非0表示true表达式为0表示falseJava虚拟机规范中并没有明确规定boolean占几个字节也没有专门用来处理boolean的字节码指令在 Oracle公司的虚拟机实现中boolean占1个字节 boolean 的包装类型为 Boolean
3.6类型转换
不同类型之间的变量相互赋值就会涉及到类型转换 从上图中我们可以发现int类型可以赋值给long类型但是long类型却不可以赋值给int类型 Java 中类型转换主要分为两类自动类型转换 ( 隐式) 和 强制类型转换 (显式) 。 3.6.1自动类型转换(隐式)
不需要写任何额外代码自动转换
特点数据范围小的转换为数据范围大的会自动执行在将int赋值给long时会自动转换为long类型
float f 3.14F;
double d 5.12;
d f; // 编译器会将f转换为double然后进行赋值
f d; // double表示数据范围大直接将float交给double会有数据丢失不安全
byte b1 100; // 编译通过100没有超过byte的范围编译器隐式将100转换为byte
byte b2 257; // 编译失败257超过了byte的数据范围有数据丢失
3.6.1强制类型转换(显式)
手动写要怎么转换类型也叫做强制类型转换
a(int)b; 注意如果b的值太大例如100_0000_0000超出int的范围进行强制转换的时候会把超出的部分舍弃掉 虽然这样也会有风险但是编译器会认为程序员知道这个风险仍想要强制转换 需要注意强制转换不一定能成功不相干的类型不能相互转换eg将字符串转成整数
int a 10;
long b 100L;
b a; // int--long数据范围由小到大隐式转换
a (int)b; // long--int, 数据范围由大到小需要强转否则编译失败
float f 3.14F;
double d 5.12;
d f; // float--double数据范围由小到大隐式转换
f (float)d; // double--float, 数据范围由大到小需要强转否则编译失败
a d; // 报错类型不兼容
a (int)d; // int没有double表示的数据范围大需要强转小数点之后全部丢弃
byte b1 100; // 100默认为int没有超过byte范围隐式转换
byte b2 (byte)257; // 257默认为int超过byte范围如果一定要转换需要显示转换否则报错
boolean flag true;
a flag; // 编译失败类型不兼容
flag a; // 编译失败类型不兼容
下面这道题可以试着理解一下 经过强制类型转换以后变量ab的值分别为多少 short a 128 byte b (byte) a A.128 127 B.128 - 128 C.128 128 D.编译错误 将a转化为byte类型之后最大范围是127但此时是128 所以b变为-128a仍为128.故本题选B
3.7类型提升
刚刚所说的类型转换是在变量赋值的过程中进行的转换而类型提升则是多个变量在运算过程中涉及到的类型转换
1.int与long之间int会被提升为long 这样会导致报错需要将最下面的int改为long
那为什么不能用int呢因为在运算过程中会自动地将int类型往long类型转a bint long---long long它们之前是不同类型我们需要将它们转换为相同类型后再进行计算所以需要将小类型的int转换为大类型的long此时c就变为long类型所以上述程序报错
2.int与double,int会转换为double int和double进行计算时也会进行类型提升将b转换为double类型同理float和double也会涉及
注意只要有一个操作数是double另一个也会自动提升为double
3.byte与byte 注意: byte 和 byte 都是相同类型 , 但是出现编译报错 . 原因是 , 虽然 a 和 b 都是 byte , 但是计算 a b 会 先将 a 和 b 都提升成 int , 再进行计算 , 得到的结果也是 int, 这是赋给 c 就会出现上述错误 . 由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据 . 为了硬件上实现方便 , 诸如 byte 和 short 这种 低于 4 个字节 的类型 , 会 先提升成 int , 再参与计算 如果仍然想转为byte类型就要进行强制转换为byte类型。
也可直接将c 前的类型改为int类型。
4.字符串类型
1.定义字符串类型变量 String s hello;//String一定是大写System.out.println(s);System.out.println(s.length());//求字符串长度
2.类型转换 //将int转成stringint a (int)10;//不能将字符串类型强制转化为int类型,这个写法是错误的//方法一可以直接使用将int类型和string类型相加得到的结果是字符串String s 10;System.out.println(s);//方法二使用valueOfString s2String.valueOf(10);//括号里只输入整数10即可System.out.println(s2);//这样就将int类型转成了String类型//将String转成intString t 10;int b Integer.parseInt(t);System.out.println(b);//此时得出来的时就是整数10//将String转成doubledouble cDouble.parseDouble(t);//将String转成longlong d Long.parseLong(t)
三、运算符
在学习操作符之前我们先了解一下什么是运算符就是对操作数进行操作的符号像、-等符号Java中的运算符可分为以下 算术运算符( - * / %) 关系运算符( !) 逻辑运算符( || !) 位运算符( | ~) 移位运算符( ) 条件运算符(?:) 1.算术运算符
1.1. 基本四则运算符加减乘除模( - * / % int a10;int b20;System.out.println(ab);System.out.println(a-b);System.out.println(a*b);System.out.println(a%b);System.out.println(a/b);//因为两数都为整数类型所以得出的数要取整为0//如果想要打印出数学中的结果其中至少要有一个浮点数double d a*1.0/b;//而a*1.0就相当于前面的类型提升将a变为double类型System.out.println(d);
1.注意在进行除法运算或是取余运算时要右操作数不能为0 否则会导致异常会使程序崩溃不继续执行
注意异常不等于编译出错
编译出错是自己能遇到的问题运行的异常时到了别人使用的时候可能遇到的问题 如果double为0时
int a10;
double b0;
System.out.println(a/b);//结果为Infinity无穷大
System.out.println(a%b);//结果为NaN不是一个数字
2.% 不仅可以对整型取模也可以对double类型取模c语言不可以但是没有意义一般都是对整型取模的
System.out.println(11.5 % 2.0);
//结果为1.5
3.两侧操作数类型不一致时向类型大的提升
System.out.println(10.2); // 的左侧是int右侧是double在加之前int被提升为double
// 故输出1.21.2. 增量运算符 - * / % int a2;a3;//相当于aa3a-3;//相当于aa-3a*3;//相当于aa*3a/3;//相当于aa/3a%3;//相当于aa%3
注意只有变量才能使用该运算符常量不能使用。
1.3自增/自减运算符 --
int a 1;
a; // 后置 相当于aa1此时a的值为2
System.out.println(a); // 注意后置是先使用变量原来值所以打印结果为2表示式结束时给变量1
//此式子结束时a3,下方验证
System.out.println(a); // 输出3a; // 前置 表示给a的值加1,相当于aa131,此时a为4
System.out.println(a); // 注意前置是先给变量1,即为415然后使用变量中的值因此输出5
System.out.println(a); // 输出5
// --操作符给操作-1与含义类似 结论1. a:先赋值后自增 a:先自增后赋值 2.只有变量才能使用自增/自减运算符常量不能使用因为常量不允许被修改 2.关系运算符 ! 关系运算符主要有六个: ! 其计算结果一定是布尔类型为 true 或者 false
一定要注意没有true对于1false对于0这种写法 。
int a 10;
int b 20;
// 注意在Java中 表示赋值要与数学中的含义区分
// 在Java中 表示相等
System.out.println(a b); // false
System.out.println(a ! b); // true
System.out.println(a b); // true
System.out.println(a b); // false
System.out.println(a b); // true
System.out.println(a b); // false
注意不能像数学中连续判断需要分开写例如下方
int a10;
int b20;
int c30;
System.out.println(abc); 解释因为程序从左至右执行先进行ab的判断结果我布尔类型的true但是布尔类型不能比较大小所以不能计算 3. 逻辑运算符( || !)
逻辑运算符主要有三个: || ! 运算结果都是 boolean类型操作数也是布尔类型。
3.1逻辑与---
表达式1表达式2
注意表达式最后计算的结果必须是布尔类型 int a10;int b20;int c30;System.out.println(!ab);//不能这样表达式必须为布尔类型true或falseSystem.out.println(!(ab));//正确写法
左右两边同时为真才为真只要有一个假则为假一假则假全真才真
相当于现实中的且字
表达式1表达式2表达式1表达式2真真真真假假假真假假假假 3.2逻辑或--||
表达式1表达式2
注意与相同表达式最后计算的结果必须是布尔类型
左右两边同时为假才为假只要有一个真则为真 一真则真全假才假
相当于现实中的或字
表达式1表达式2表达式1表达式2真真真真假真假真真假假假 3.3 逻辑非 !
表达式只有一个操作数
真变假假变真
表达式表达式真假假真 的优先级更高需加上括号
3.4. 短路求值
计算只要左侧表达式为false结果一定是false右侧表达式就可以不用算了计算||只要左侧表达式为true结果一定是true右侧表达式就可以不用算了 System.out.println(10 20 10 / 0 0); // 打印 false// 因为/表达式右边不能为零 ,但此题表达式右边为零 所以结果应该会出现异常 但此程序结果为false,未出现异常意味着右边并没有执行因为左边已经为假了结果一定为假就不用再执行右边了 System.out.println(10 20 || 10 / 0 0); // 打印 true//此题同理左边为真就不用再执行右边了所以会打印出true
注意 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 || 相比, 它们不支持短路求值
System.out.println(10 20 10 / 0 0); // 程序抛出异常
System.out.println(10 20 | 10 / 0 0); // 程序抛出异常
4. 位运算符 | ~ ^ 4.1按位与--- int a 0xa;//16进制为a,十进制为10,二进制为1010int b 0xc;System.out.println(a);//默认十进制和换行System.out.printf(%x\n,a);//将ln换位f 可以打印出我们想要的进制System.out.printf(0x%x\n,a);//可以在前面加上0x更加方便阅读System.out.printf(0x%x\n,ab);//打印结果为16进制的8
转化过程中先将16进制换成10进制
a*10^010*10^010
再将10换为二进制 所以82等于10,即后四位为1010
也可在开始菜单中找到计算器,将标准切换为程序员模式,进行计算 从上到下依次为十六进制,十进制,八进制,二进制 点击想要换算的进制来计算(我想换算16进制的A,所以点击的HEX)
00000000 00000000 00000000 00001010 //1000000000 00000000 00000000 00001100 //1200000000 00000000 00000000 00001000 //8
上下全为1才为1,只要有0则为0
4.2按位或---|
与按位与类似
00000000 00000000 00000000 00001010 //1000000000 00000000 00000000 00001100 //1200000000 00000000 00000000 00001110 //14 上下全为0才为0,只要有1则为1
int a 0xa;
int b 0xc;
System.out.printf(0x%x\n,a|b);
4.3按位取反---~
00000000 00000000 00000000 00001010 //101111111 11111111 11111111 11110101 //0xfffffff5
只有一个操作数所有的0会变成1,所有的1会变成0
a是int类型,总共32位
int a 0xa;
int b 0xc;
System.out.printf(0x%x\n,~a);//结果为0xfffffff5
4.4按位异或---^
00000000 00000000 00000000 00001010 //1000000000 00000000 00000000 00001100 //1200000000 00000000 00000000 00000110 //6
上下两个数相同结果为0 , 两个数不同结果为1 int a 0xa;int b 0xc;System.out.printf(0x%x\n,b^a);//结果为0x6
5. 移位运算( ) 移位运算符有三个 : 都是二元运算符且都是按照二进制比特位来运算的。 5.1左移运算符
移位规则左边丢弃右边补0。 int a0x10;//对应十进制为16,二进制为0001 0000System.out.printf(0x%x\n,a1);//二进制左移一位变成0010 0000,十进制为32,对应16进制为20int b10;//10的二进制是00001010 5.2右移运算符 和()
无符号右移(逻辑右移)与左移相似左边用0填充右边丢弃
算术右移左边用符号位填充右边丢弃
下图中使用-10来举例 注意 : 1. 左移 1 位 , 相当于原数字 * 2. 左移 N 位 , 相当于原数字 * 2 的 N 次方 . 例如:5的二进制后四位为0101,左移一位为01010(十的二进制),再左移一位为010100(二十的二进制),右移同理. 2. 右移 1 位 , 相当于原数字 / 2. 右移 N 位 , 相当于原数字 / 2 的 N 次方 .注意:(5/22(取整)) 3. 由于计算机计算移位效率高于计算乘除 , 当某个代码正好乘除 2 的 N 次方的时候可以用移位运算代替 . 4. 移动负数位或者移位位数过大都没有意义,例如左移32位,就剩32个0了(int) 练习: 以下哪一个不是赋值符号(c ) A. B. C. D. 没有这个符号 6. 条件运算符 条件运算符只有一个 : 表达式1 ? 表达式2 : 表达式3 当 表达式 1 的值为 true 时 , 整个表达式的值为 表达式 2 的值 ; 当 表达式 1 的值为 false 时 , 整个表达式的值为 表达式 3 的值 . 也是 Java 中唯一的一个 三目运算符 , 是条件判断语句的简化写法 // 求两个整数的最大值
int a 10;
int b 20;
int max a b ? a : b; 注意 1. 表达式 2 和表达式 3 的结果要是同类型的除非能发生类型隐式类型转换 int a 10;
int b 20;
int c a b? 1 : 2.0; 2. 表达式不能单独存在其产生的结果必须要被使用 int a 10;
int b 20;
a b? a : b; // 报错Error:(15, 14) java: 不是语句 7.运算符的优先级 在一条表达式中各个运算符可以混合起来进行运算但是运算符的优先级不同比如 * 和 / 的优先级要高于 和 - // 求a和b的平均值
int a 10;
int b 20;
int c a (b - a) 1;
System.out.println(c); 此代码求平均值,a(b-a)/22a/2(b-a)/2(ba)/2 所以正常来说,应该先算后面,但由于优先级高先算了前半部分,结果为10 注意运算符之间是有 优先级 的 . 具体的规则我们 不必记忆 . 在可能存在歧义的代码中加上括号即可 所以正确代码为,结果为15 // 求a和b的平均值
int a 10;
int b 20;
int c a ((b - a) 1);
System.out.println(c); 四 、逻辑控制 1.顺序结构 按照代码书写的顺序执行 会依次打印出a,b,c 当调整代码顺序后结果也会随之改变 2.分支结构 它的作用是根据判断的条件是否成立true或false来决定是否进入此语句 ,以及后续代码执行顺序。 2.1if语句 语法格式1: if(布尔表达式){
// 语句
} 这里我们要注意的是: if后面的表达式必须是布尔类型的表达式否则就会出现如下的结果 注意:这种写法在C语言中可行在Java语言中不可行 int score 60;
if(score 60){System.out.println(及格);
} 语法格式2: if(布尔表达式){
// 语句1
}else{
// 语句2
} C语言的时候一般是独占一行的在Java中往往不独汉一行语法上没有强制要求大括号必须放在哪里但是Java圈子里绝大部分的代码都是不独干一行的放眼整个编程圈把不占银行写法是非常普遍的只有C或C才会有独占一行的写法 int score 60;
if(score 60){System.out.println(及格);
}else{System.out.println(不及格);
} 语法格式3: if(布尔表达式1){
// 语句1
}else if(布尔表达式2){
// 语句2
}else{
// 语句3
} int score 76;
if(score 90){System.out.println(及格);
}else if(score 80){System.out.println(良好);
}else if(score 70){System.out.println(中等);
}else if(score 60){System.out.println(及格);
}else{System.out.println(不及格);
} 代码会按照条件的顺序依次从上到下进行匹配 也可以写成如下形式 if(score 90){
System.out.println(优秀);
}else if(score 80 score 90){
System.out.println(良好);
}else if(score 70 score 80){
System.out.println(中等);
}else if(score 60 score 70){
System.out.println(及格);
}else if(score 0 score 60){
System.out.println(不及格);
}else{
System.out.println(错误数据);
} 练习 练习:1.判断一个数是奇数还是偶数(先不要看答案,自己上机练习) int num9;
if(num%21){System.out.println(num是奇数);
}else {System.out.println(num是偶数);
} 练习2:判断一个数字是正数,负数,还是零 int num -1;
if(num0){System.out.println(num是负数);
}else if(num0){System.out.println(num是正数);
}else{System.out.println(num是零);
} 一些伙伴可能会问为什么不用输入函数,给大家放在下方了,可以先体现了解一下,后面会学到 System.out.println(请输入一个整数 );Scanner scanner new Scanner(System.in);int num scanner.nextInt();if(num0){System.out.println(num是负数);}else if(num0){System.out.println(num是正数);}else{System.out.println(num是零);} 注意:如果结果报错,出现:找不到符号,可以尝试将鼠标放在标红的Scanner上,同时点击ALTEnter,然后点击第一个就可以了. 练习3:判断一个年份是否是闰年(分整百年与不整百年两种情况 ) System.out.println(请输入一个整数 );
Scanner scanner new Scanner(System.in);
int year scanner.nextInt();
if (year % 100 0) {if (year % 400 0) {System.out.println(year 是闰年);} else {System.out.println(year 不是闰年);}
} else {if (year % 4 0) {System.out.println(year 是闰年);} else {System.out.println(year 不是闰年);}
} 分号问题: int x 20;
if (x 10);
{System.out.println(hello);
}// 运行结果
hello 永远会打印Hello,因为if后面加了之后就和下面的打印语句没有关系了 悬垂else问题: if / else 语句中可以不加 大括号 . 但是也可以写语句 ( 只能写一条语句 ). 此时 else 是和最接近的 if 匹配 . 但是实际开发中我们 不建议 这么写 . 最好加上大括号 . int x 10;
int y 10;
if (x 10)
if (y 10)
System.out.println(aaa);
else
System.out.println(bbb); 浮点数问题: //因为0.1加0.2不能精确的等于0.3所以说 我们要是用判断a加B是否等于0.3的方法是不可取的
// 一般不是直接比较浮点数相等,而后是做减法,判断差值是否在规定的误差范围之内
double gap0.00000001;
double a0.1;
double b0.2;
if((ab-0.3gap)(ab-0.3-gap)){System.out.println(相等);
}else{System.out.println(不相等);
} 注意:在要求精度高的场景下 , 慎用浮点数 2.2switch语句 switch(表达式){
case 常量值1:{
语句1;
[break;]
}
case 常量值2:{
语句2;
[break;]
}
...
default:{
内容都不满足时执行语句;
[break;]
}
} 执行流程 1. 先计算表达式的值 2. 和 case后的值 依次比较一旦有响应的匹配就执行该项下的语句直到遇到 break 时结束 3. 当表达式的值没有与所列项匹配时执行 default System.out.println(请输入一个整数 );
Scanner scanner new Scanner(System
int day scanner.nextInt();
switch(day){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(输入有误);break;//由于default是最后一个所以说是否有break都无所谓
} 注意: 多个case后的常量值不可以重复 switch不能支持复杂条件 , 只能是判断switch括号里的和case后面的常量是否相等 ,就像上述if里的判断优秀及格还是不及格,这种判断范围或大于小于的,switch语句就不支持 // 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示.
if (num 10 num 20) {
System.out.println(hehe);
} switch的括号内只能是以下类型的表达式 基本类型byte、char、short、int注意不能是long float double boolean类型引用类型String常量串、枚举类型 switch可以支持嵌套 (不建议,看着太丑了 ,可以使用if else的方法) int a10;
int b20;
switch(a){case 10:switch(b) {case 20:System.out.println(a10,b20);break;}
} case后面必须是常量,如果我们只想打印case后面的内容那么就必须要在输出结束后输入一个break ,否则会出现下述情况 :只有遇到break才会跳出 3.循环结构
3.1while语句
while(循环条件){
循环语句;
} 循环条件为 true, 则执行循环语句; 否则结束循环.
练习
练习1:打印 1 - 10 的数字
int i1;
while(i10){System.out.println(i);i;
}
练习2: 计算 1 - 100 的和 int i1,sum0;while(i100){sumsumi;i;}System.out.println(sum);
练习3:计算五的阶乘
int i1,s1;
while(i6){ss*i;i;
}
System.out.println(s);
练习4计算 1!2!3!4!5!
int i1,s1,sum0,n1;
while(i5){while (i n) {//第几个数n就为几s s * i;i;}//先算出每一项的阶乘sumssum;//最后再求和n;
}
System.out.println(sum);
int sum0,n1;
while(n5){int i1,s1while (i n) {//第几个数n就为几s s * i;i;}//先算出每一项的阶乘sumssum;//最后再求和n;
}
System.out.println(sum);
练习5:输出 1000 - 2000 之间所有的闰年
int year 1000;
while (year 1000 year 2000) {if (year % 100 0) {if (year % 400 0) {System.out.println(year);} else {}} else {if (year % 4 0) {System.out.println(year);}else{}}year;
} 注意事项 1. 和 if 类似 , while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句 . 建议还是加上 { } 2. 和 if 类似 , while 后面的 { 建议和 while 写在同一行 . 3. 和 if 类似 , while 后面不要多写 分号 , 否则可能导致循环不能正确执行 . 3.2.break与continue
break:结束当前整个循环语句,不会继续进行循环 continue:立即结束当前这一循环 , 直接进入到下一次循环的条件判断
eg:打印出零到一百之间能被五整除的数字
1.break 结果只能打印第一个数字零因为遇到break就会跳出循环,不会再进行
2.continue 注意:遇到continue之后不会执行下方的打印语句,而是直接进入下次循环(判定循环条件)
3.3for循环 for ( 表达式① ; 布尔表达式② ; 表达式③ ){ 表达式④ ; } 表达式 1: 用于初始化循环变量初始值设置在循环最开始时执行且只执行一次 表达式 2: 循环条件满则循环继续否则循环结束 表达式 3: 循环变量更新方式 执行过程 : ①②③④ --- ②③④ --- ②③④ --- ②③④ --- ②③④ --- ②③④ ---...--- ②为 false 循环结束。 for与while格式上的区别 举例(打印1到10的数字) for(int i0;i10;i){System.out.println(i);
}int j0;
while(j10){System.out.println(j);j;
}//注意:在for循环中
//省略for括号内的三个条件任意一个或两个或三个都可以,大家要注意如何修改
int i0;//此条件可以放在循环外面
for(;i10;){//;留下 System.out.println(i);i;//此条件也可拿出放在最后一行(循环里)
}//也可以将表达式二放在循环里
for(int i0;;i){if(i100){break;}sumsumi;System.out.println(i);
}//三个都省略的程序为下
int sum0;
int i0;
for(;;){if(i10){break;}sumsumi;System.out.println(i);i;
}注意:表达式1中定义的变量只能在此循环中使用 . 如下图可见:此方块以外的s都会显示未被定义 练习:
练习1:计算 1 - 100 的和
int sum0;
for(int i0;i100;i){sumsumi;
}
System.out.println(sum);
练习2: 计算5的阶乘
int s1;
for(int i1;i5;i){ss*i;
}
System.out.println(s);
练习3: 计算 1! 2! 3! 4! 5!
在这道题中我们涉及到了嵌套循环 ,需要注意一点的是 当其中一个for循环位于另外一个for循环里面时 , 定义的变量不可以相同 , 但如果每一个for循环都是一个独立的整体时 , 它们定义的变量是可以相同的 结果为:
int n1;
int sum0;
for(int i1;i5;i) {int s 1;for (int j 1; j i; j) {s s * j;}sumsums;
}
System.out.println(sum); 注意: ( 和 while 循环类似 ) 1. 和 if 类似 , for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句 . 建议还是加上 { } 2. 和 if 类似 , for 后面的 { 建议和 while 写在同一行 . 3. 和 if 类似 , for 后面不要多写 分号 , 否则可能导致循环不能正确执行 . 4. 和 while 循环一样结束单趟循环用 continue 结束整个循环用 break 3.4.do while循环 do{
循环语句;
}while(循环条件); 先执行循环语句, 再判定循环条件循环条件成立则继续执行否则循环结束
//打印1-10
int num 1;
do {
System.out.println(num);
num;
} while (num 10);
不是很常用 , 建议使用for循环和while循环 练习:
1.判定一个数字是否是素数
Java---判断素数的三种方法-CSDN博客
2.求出0-999之间的所有水仙花数,并输出
(水仙花数是指 : 一个三位数其各位数字的立方和恰好等于该数本身)
public class Text {public static void main(String[] args) {for(int i100;i999;i){int a i%10;int b (i/10)%10;int c i/100;if(a*a*ab*b*bc*c*ci){System.out.println(i是水仙花数);}}}
}五.输入输出
1.输出到控制台 for (int i 1; i 3; i) {System.out.println(i);//println自动换行//java,println本质上是打印字符串string ,把int和String进行,直接把int转成String}for (int i 1; i 3; i) {System.out.print(i);//print打印不换行}System.out.println(\n);for (int i 1; i 3; i) {System.out.print(i\n);//print打印不换行,除非手写\n(i\n)}System.out.println(接下来我们来看printf);for (int i 0; i 3; i) {System.out.printf(%d, i);//格式化打印,与c语言相似 从上方我们可以看出println能自动添加换行而print就不能 printf的输出格式与C语言相似都是格式化打印并且想要添加换行 也需要手动添加%d\n 2 从键盘输入
键盘输入代码的四个步骤: 1、建立导包import java.util.Scanner;
三种方法:
直接输入到最上方输入Scan Tab键可以在输入完Scanner scanner new Scanner( System.in) 之后将光标放在标红处,点击AltEnter 2、创建Scanner类型的对象Scanner scanner new Scanner( System.in) ; 3、调用Scanner类的相关方法(next() / nextXxx()) 来获取指定类型的变量 4.结尾调用关闭方法 scanner.close();
2.1使用 Scanner 读取字符串/整数/浮点数 1.字符串:next 2.一行nextLine 3.float: nextFloat 4.double: nextDouble 5.整数: nextInt 6.byte: nextByte 7.short: nextShort 8.long: nextLong 9.布尔类型: nextBoolean 2.1.1一般写法
直接按照步骤往下写 , 不用判断类型是否一致 , 类型不一致会自动报错 import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println(请输入你的姓名);String name scanner.nextLine();System.out.println(请输入你的年龄);int age scanner.nextInt();System.out.println(请输入你的工资);float salary scanner.nextFloat();System.out.println(你的信息如下);System.out.println(姓名: name\n年龄age\n工资salary);scanner.close(); // 注意, 要记得调用关闭方法}}请输入你的姓名
张三
请输入你的年龄
18
请输入你的工资
1000
你的信息如下
姓名: 张三
年龄18
工资1000.0 2.1.2标准写法 先判断是否有数据可读(有数据,并且类型一致) 通过hasNext系列的方法判断是否有数据可读 1.判断是否有字符串可读 hasNext 2.判断是否有一行可读 hasNextLine 3.判断是否有float可读 hasNextFloat 4.判断是否有double可读 hasNextDouble 5.判断是否有整数可读 hasNextInt 6.判断是否有byte可读 hasNextByte 7.判断是否有short可读 hasNextShort 8.判断是否有long可读 hasNextLong 9.判断是否有布尔类型可读 hasNextBoolean Scanner scanner new Scanner(System.in);
if(scanner.hasNextInt()) {//先判断一下有没有数据可读int n scanner.nextInt();//if后的真假是由所输入的内容和括号内的类型是否一样来判别的System.out.println(n);
}else{System.out.println(输入有误);
} 2.2使用 Scanner 循环读取 求取其平均值: Scanner scanner new Scanner(System.in);
int num0;//总和
int count 0;//变量个数
double a0.0;
System.out.println(请输入整数: );
while(scanner.hasNextInt()) {//先判断一下有没有数据可读int n scanner.nextInt();numnumn;count;
}anum/count;System.out.println(平均数为a); 当循环输入多个数据的时候 , 使用 ctrl z 来结束输入 (Windows 上使用 ctrl z, Linux / Mac 上使用 ctrl d) 注意:IDEA特殊,使用ctrld 具体Scanner用法可以参考以下链接 Scanner (Java SE 17 JDK 17) 总结
以上就是今天要讲的内容本文详细介绍了Java的基础语法