第一阶段 JAVA基础知识
第二章 Java基础语法知识
在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的“潜规则”,通过你对命名的书写,别人一眼就能看出你是不是一个“行家”。我们先来看一下有哪些规则。
A:包名: | 全部小写用.隔开 eg: com.ideal.www |
---|---|
B:类名或接口: | 类的首字母大写。如果类名由若干个单词组成,那么每个单词首字母大写。 |
C: 方法或变量名: | 所有的方法名都应该小写字母开头。如果方法名 含有若干个单词,那么其后每个单词首字母大写。 |
D: 常量名: | 全部大写 用 _ 隔开 |
E:原文件名: | 原文件名必须和类名相同 类名.java |
---|---|
F: 主方法入口: | 所有的Java 程序由public static void main(String []args)方法开始执行。 |
我们暂时对于这些名词还没有什么概念,但是对于我们前一篇所写到的HelloWorld例程来说,我们就用到了 类名、主方法这两点。
HelloWorld 作为类名自然需要满足首字母大写,又由于HelloWorld由两个单词组成,所以两个单词首字母分别大写。
2.1关键字
(1)被Java语言赋予特定含义的单词,他们有着特定的使用位置和方式
(2)特点:
全部小写。
(3)注意事项:
A:goto和const作为保留字存在。
B:类似于Notepad++、sublime等编辑器对关键字有特殊颜色标记
(这是两款和好用的编辑器,可以简单的理解为可以使代码带着好看色彩的高级记事本)
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充,继承 | |
final | 最终值,不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地,原生方法(非Java实现) | |
new | 新,创建 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供switch选择 | |
continue | 继续 | |
default | 默认 | |
do | 运行 | |
else | 否则 | |
for | 循环 | |
if | 如果 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引用 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 | |
null | 空 |
2.2 标识符
(1)就是给类,接口,方法,变量等起名字的字符序列
(2)组成规则:
A: 首字符:字母(A-Z、a-z)、美元符($)、下划线(_)
B: 首字符之后:字母(A-Z、a-z)、美元符($)、下划线(_)或者数字的任何字符组合
(3)注意事项:
A:不能以数字开头
B:关键字不能作为标识符
C:区分大小写
2.3 注释
( 讨厌写自己写注释,讨厌别人不写注释 ~)
注释就是为了方便自己或别人后期阅读这部分代码的提示,能够快速的让阅读者,了解这部分代码的作用。
(1)注释就是对程序进行解释说明的文字(不会被编译运行)
(2)分类:
A:单行注释 // + 内容
B:多行注释 /内容/**
C:文档注释 /** */ 被javadoc工具解析成一个说明书,后期会讲到
在我们前期的学习中,只需要掌握基本的单行注释和多行注释即可
注释规范:
1、类注释 注释模板如下:
/**
Copyright (C), 2006-2010, ChengDu Lovo info. Co., Ltd.
FileName: Test.java
类的详细说明
@author 类创建者姓名
@Date 创建日期
@version 1.00
*/
2、属性注释****注释模板如下:
/** 提示信息 */private String strMsg = null;
3、方法注释 注释模板如下:
/**
类方法的详细使用说明
@param 参数1 参数1的使用说明
@return 返回结果的说明
@throws 异常类型.错误代码 注明从此类方法中抛出异常的说明
*/
4、构造方法注释 注释模板如下:
/**
构造方法的详细使用说明
@param 参数1 参数1的使用说明
@throws 异常类型.错误代码 注明从此类方法中抛出异常的说明
*/
5、方法内部注释 在方法内部使用单行或者多行注释
(根据实际情况添加)注释模板如下:
//背景颜色Color bgColor = Color.RED
4 常量
(1) 常量就是在程序执行的过程中,其值不发生改变的量(例如π、重力加速度,光速等)
而在Java中我们使用final关键字来修饰常量
Eg:final double PI = 3.1415927
习惯 :虽然常量名也可以用小写,但为了便于识别,通常使用大写字母 表示常量(随大流就好啦)
(2)分类:
A:字面值常量
B:自定义常量
字面值常量:
C++ primer:像42这样的值,在程序中被当作字面值常量:字面值是因为仅能用它的值称呼它,常量是因为它的值不能修改。每个字面值都有相应的类型,例如:0是int型,3.14159是double型。字面值仅存在于内置类型,没有类类型的字面值。因此,也没有任何标准库类型的字面值
简单理解:例如 int a = 6; 它的字面值就是a, 它的实际值是 6
(3)字面值常量
A:字符串常量 "bwh"
B:整数常量 666,888
C:小数常量 123.456
D:字符常量 'a','Z','0'
E:布尔常量 true,false
F:空常量 null
(4)在Java中针对整数常量提供了四种表现形式
A:二进制 由0,1组成。以0b开头。
B:八进制 由0,1,...7组成。以0开头。
C:十进制 由0,1,...9组成。整数默认是十进制。
D:十六进制 由0,1,...9,a,b,c,d,e,f(大小写均可)组成。以0x开头。
A:常见进制
常见进制的转化:
常见进制 → 十进制 : 忽略前缀和0,对1进行运算
0b10101 (二进制)
= 12^4 + 12^3 + 1*2^0
= 16 + 14 + 1
= 21
0123 (八进制)
= 18^2 + 28^1 + 3*8^0
= 64 + 16 + 3
= 83
0x3c (十六进制)
= 316^1 + 1216^0
= 48 + 12
=60
十进制 → 常见进制 :
除基取余,直到商为0,余数反转。(转换几进制就将基数除以几)
其他进制的转换可以通过十进制这个中间进制进行转换
熟悉2的倍数对我们也是很有帮助的
B: 补充:补码、原码、反码
为什么我们要学习这些呢?首先我们要知道,在计算机内,有符号数有三种表示方法,源码、反码、和补码。而所有的数据运算都是采用补码进行的。它的重要性可想而知。
1、原码:二进制点表示法,最高位为符号位,“0”表示正,“1”表示负,其 余位置表示数值大小,可直观反映出数据的大小。
2、反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则。
3、补码:解决负数加法运算正负零问题,弥补了反码的不足。
7的二进制 :111
原码 | 正数的原码最高位是0负数的原码最高位是1其他的是数值位 | |
---|---|---|
符号位 | 数值位数 | |
+7 | 0 | 0000111(补够8个字节,在左面补4个0) |
-7 | 1 | 0000111 |
反码 | 正数的反码与原码相同负数的反码与源码符号位相同,数值位取反 1 → 0 、 0 → 1 | |
---|---|---|
符号位 | 数值位数 | |
+7 | 0 | 0000111(补够8个字节,在左面补4个0) |
-7 | 1 | 1111000 |
补码 | 正数的补码与原码相同负数的补码是在反码的基础上+1 | |
---|---|---|
符号位 | 数值位数 | |
+7 | 0 | 0000111(补够8个字节,在左面补4个0) |
-7 | 1 | 1111001 |
2.5 变量
我们刚介绍了什么是常量,那么什么是变量呢,顾名思义,变量就是在某个范围内可以变化的量,其实它就是一个被你所定义的变量,在一个数据类型的约束下,可以在数据类型所允许的范围内进行,被赋值,运算,等操作。
(变量可以不在定义的时候就赋初始化值,但是在运行编译时,如果被编译变量仍没被赋值,则是没有意义的,编译器将会报错)
格式: 数据类型 变量名 = 初始化值
注意:可以在一行中声明多个变量,但是我们不推荐这种方式。
逐一声明变量能提高程序的可读性
变量类型:
· 局部变量
· 实例变量
· 类变量(静态变量)
局部变量:定义在方法、构造方法、或者语句块中的变量
(生而带来 死而带去 只能活在自己的世界)
只能在一定范围内使用的变量,随着这个方法等的结束变量也就无效了
对于局部变量的理解,刚入门可能也不会太深,等后面几篇我们学习到方 法后,再回过头来看这部分内容,就会有一种明了的感觉。
实例变量:声明在类中,但在方法、构造方法和语句块之外
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见
暂时在学习基础语法知识的时候可以暂时忽略实例变量这部分内容,这部分内容主要被使用在面向对象的部分,但是极其重要。
过了很久,你也不愿回头看,学习的进度就会很慢~
类变量: 后期补充
2.6 数据类型
❤ 2.6.1
Java是一种强类型的语言,针对每一种数据都定义了明确的数据类型(就是将一些值的范围做了约束,从而为不同类型的值在内存中分配不同的内存空间)
注意:在此部分暂时不用深究引用类型,着重认熟悉一下基本数据类型,引用类型在面向对象的部分会详细解释。
我们来看一下八种基本数据类型的详细说明:
Name | Size* | Range* | |
---|---|---|---|
byte | 1byte | 8bit | 存放的数据范围是-128~127之间 |
short | 2bytes | 16bit | 最大数据存储量是65536,数据范围是-32768~32767之间。 |
int | 4bytes | 32bit | 数据范围是负的2的31次方到正的2的31次方减1。 |
long | 4bytes | 64bit | 数据范围为负的2的63次方到正的2的63次方减1。 |
float | 4bytes | 32bit | 数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F |
double | 8bytes | 64bit | 数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。 |
boolean | 只有true和false两个取值。 | ||
char | 2bytes | 存储Unicode码,用单引号赋值。 |
注意:
- 整数默认是int类型
声明long型常量的时候长整数要加L或者l
如:long l = 66666666666666L//否则报错
- 浮点数默认是double(双精度浮点型)
声明float型(单精度的浮点数)要加F或者
如:double d = 521.1 //正确 float f = 52.1f //必须加f
boolean一般用来进行逻辑运算→流程控制中
Byte、short类型被赋值时,其实接收的是一个int类型的值,不 在范围内即报错
一个中文字符占据两用字节,Java中字符可以存储一个汉字,是 因为Java字符采用Unicode编码,每个字符占用两个字节。
Java中提供了三个特殊的浮点数值,正无穷大(正数除以0),负无穷大(负数除以0),NaN(不是一个数字,0除以0,负数开根号)
❤ 2.6.2数据类型转换
一般来说,我们在运算的时候,要求参与运算的数值类型必须一致
(1)默认转换(从小到大的转换)—自动类型转换
A:byte,short, char ( → int → long → float → double )
B:byte,short, char 相互之间不转换
他们参与运算首先转换为int类型
疑惑:****为什么 float(4个字节)在 long(8个字节)后面
A: 它们底层的存储结构不同
B: float表示的数据范围比long范围要大
long:2^63-1
float:3.410^38 > 210^38 > 28^38 > 22338
= 2*2^144 > 2^63 -1
例子一 :低精度byte到高精度int 会根据默认转换,自动转换类型
例子二 :高精度int到低精度byte 可能会损失精度
byte数据类型是 1个字节、8位
int 数据类型是 4个字节、32位
但是有没有办法能够让我们输出这种运算的结果呢?这就需要我们用到强制类型转换的知识。
(2)强制类型转换
格式:目标数据类型 变量 = (目标数据类型)(被转换的数据)
注意:不要随便的去用强制转化,因为它隐含了精度损失的问题
在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
例子:
int i = 128;
byte b = (byte)i;
因为byte类型是8位,最大值为127,所以当int强制转换为byte类
型的时候,值128就会导致溢出
很经典的题目 1: 永远做不对系列
第一句: byte类型的 b1 ,b2相加 自动类型转换为 int型
int类型的(b1 + b2) 赋值给byte类型的b
属于大单位转换为小单位 可能造成精度损失
第二句: 3 和4 为常量,编译过程中 先把结果计算出来,
然后看是否在byte的范围内,如果在就不报错
总结:
变量相加,会首先看类型问题,最终把结果赋值也会考虑类型问题
常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错
很经典的题目 2: 永远不会做系列
求输出结果:
分析过程:
我们想要知道结果是什么,就应该知道是如何计算的
而我们又知道计算机中数据的运算都是补码进行的
得到补码,首先要计算出数据的二进制
A: 求出130的二进制 10000010
130 是一个整数 所以补齐4个字节 (一个字节8位)
0000000 00000000 00000000 10000010
B: 做截取操作,截成byte类型的了
10000010
这个结果是补码
C已知补码求原码。
符号位 | 数值位 | |
---|---|---|
补码: | 1 | 0000010 |
反码: | 1 | 0000001 |
原码 | 1 | 1111110 |
11111110转换为十进制为 -126 |
2.7 字符
字符是指在计算机中所使用的 字母、数字、汉字、和符号,表示时用单引号包含在内。
例如: ‘5’ ‘R’ ‘。’均是字符
在内存中,字符数据以ASCII码存储 ,即以整数表示
需要记忆的常见字符‘a’→ 97 ‘A’→ 65 ‘0’→ 48
其余字符依次递推即可
一种特殊的字符——转义字符
转移字符 = 转义 + 字符 → 转变含义的字符(不再是本来字符的意思)
结构:\ + 一些特定的字母
其中 \n (换行)和 \t(制表符)最为常用
(一)下面两种输出变量love的方法均有换行效果
补充: \r和 \n的区别
回车 \r 意思是光标重新回到本行的开头
换行 \n 光标移动到下一行,不一定是行首,取决于其后是否还有内容
(因为我们常用在一行的句末,所以会误以为会在下一行的行首)
针对不同系统的换行符:
苹果系统Mac \n
Unix、Linux系统 \n
Windows系统 \r\n
在windows中,如果在两端字符串的中间使用转义字符,只有使用 \r\n才能真正的达到了我们日常操作中,回车换行的那种效果。
(二)\t是补全当前字符串长度到8,最少1个,最多8个空格
所以灵活的使用制表符可以达到对齐两行数据的作用
2.8 字符串
字符串是由零个或者多个字符组成的有限序列,它是编程中表示文本的数据类型
字符串使用的时候用双引号括起来
String并不是Java中的基本方法,而是一个类。
我们在此部分不做过多的介绍,但要知道,String类是一个非常非常重要的类!!!
我们会在后面有专门一大篇介绍
总结:
字符串和其他数据做加法运算的时候,结果是字符串类型。
这里的 + 不是加法运算,而是字符串连接符
2.9 运算符
算数运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
三目运算符
01
❤ 2.9.1 算数运算符: + - * / % ++ --
A: 整数相除只能得到整数(想得到小数 需将其中任意的一个数据变成浮点 数)
Eg: int x = 3;
int y = 4;
System.out.println(x/y); →System.out.println(x * 1.0 / y );
B: /除法求商 %除法取余
C: ++, -- 就是对变量进行自增1或者自减1. 参与运算 前置后置有区别
来一道例题,大家就整明白了:
Eg : int x = 4;
int y = ( x++ ) + ( ++x ) + ( x * 10);
System.out.println( y );
//首先 x后置++ 所以括号1中 x运算时取4 然后自增为5
其次 x前置++ 所以括号2中 x = 6
最后 x * 10 = 6 * 10 = 60
Output y → 4 + 6 + 60 = 70
❤2.92 赋值运算符
基本的赋值运算符:=
扩展的赋值运算符:+=,-=,=,/=,%=*
在刚开始的时候我们书写赋值语句,还是推荐使用 基本的方法,待到日后熟练,再转为扩展的赋值语句
很经典的题目 1: 你猜到底对不对
编译第一个语句报错:
编译第二个语句没有报错:(? ? ?)
扩展的赋值运算符其实隐含了一个强制类型转换
s += 1; 不是等价于 s = s + 1 而是等价于 s = ( s的数据类型 ) (s + 1);
❤2.9.3关系运算符 ==, != , > , >= , < , <=*
== 无论你的操作是简单还是复杂木结构是boolean类型
Output → flase
❤2.9.4 逻辑运算符 & | && || !
逻辑运算符用于连接布尔型表达式,在java中。不可以写成3 < x < 6 应该写 成 x > 3 & x < 6
&&和&的区别? 同理||和|的区别
A: 最终结果一样
B: &&具有短路作用。左边是false,右边不执行。(&&效率更高)
eg:int x = 3; int y = 4;
boolean b1 = ( ( x++ = 3) ) && ( y++ = 4 )
结果: x = 4 ,y = 4 ,true
❤2.9.5 位运算符
(3 & 4) (3 | 4) (3 ^ 4) (~3) (3 << 2) (>>) (>>>)
因为是位运算,所以我们需要把数据换算成二进制
^的特点:一个数据对另一个数据位异或两次,该数本身不变
很经典的题目 1: 交换两个整型数的值
做一个灵活的交换者
· 我们先直接给出位运算的结论
这是详细的运算过程,但是我们使用时直接用结论即可
题目:
请用最有效率的方式写出计算2乘以8的结果?
2 * 8
2 << 3
❤2.9.6 三目运算符
这一部分要与下面马上要学习的if语句进行对照学习
满足表达式则执行冒号前的表达式,反之则时候后面的
格式 : (条件表达式)?(条件真的表达式):(条件假的表达式)
条件表达式:结果是一个boolean型
Eg: 将a,b 中的较小数赋值给x
x = a < b ? a : b → if (a < b) x = a; else x = b
2.10 键盘录入
我们之前所写的程序中,数据的值都是固定的,在源码中就写好的,而我们有时候想要让用户来决定一些值的具体数据(例如:学生成绩录入),所以键盘录入就是让用户输入一些值,使得程序更加灵活。
现在我们对于导包以及对象的概念仍然比较模糊,但是我们在介绍别的知识的时候也会频繁的用到,所以大家暂时按照以下的格式记忆下来。
A:导包:
格式:import java.util.Scanner;
位置:在class上面
B:创建键盘录入对象
格式:Scanner sc = new Scanner(System.in);
C:通过对象获取数据
格式: int x = sc.nextint();
String s = sc.nextLine(); (字符串录入)
2.11 选择结构(分支结构)
· if 语句
· switch 语句
认识选择结构后我们的程序就会变得很有趣了,我们先来学习一下最常见的If条 件语句
(一) if语句
更正:满足就执行,不满足就出去
我们对照三元运算符和if语句,这两个是不是完全一样的呢?
三元运算符的操作都可以使用if语句改进,反之不成立
什么时候不成立呢?
当if语句控制的语句体是一条输出语句的时候,就不成立。
因为三元运算符是一个运算符,必须要求有一个结果返回。
而输出语句却不能作为一个返回结果
三个数中求最大值:可以用三目运算 跳转2.9.6
用if语句实现:
(二) switch语句
注意: ·case后面只能是常量,不能是变量,而且不能出现相同的
·default可以省略 但是一般不建议,
(除非判断的值是固定的,单选题)
·break 可以省略,一般不建议
·default可以出现在switch语句的任意位置
·switch语句的结束条件:
遇到break 或者 执行到程序的末尾
以下条件选用switch
·条件分支有多个
·条件的值是整数或一个字符型
原因
·如果条件分支太多时用if语句,一定会出现if的嵌套,if嵌套的越多,程序 的开销就会随着增大,这样整个程序的运行效率就一定会大大降低
·switch值比较一次就可以找出条件的结果
我们在下面将上面的if成绩例程改为switch版本是不是简洁了很多呢
2.12 循环语句
· for循环
· while循环
· do ...while循环
我们如果存在大量的重复语句,我们就可以使用循环语句,进行处理。
(一)for循环
for 语句不仅适用于循环次数明确的情况,也适用于循环次数不明确的情况 (满足条件继续循环,不满足跳出循环)
求偶数和还有一种方法:
for ( int x =0; x <= 100; x+=2){
Sum += x
}
求5的阶乘
*//分析 什么是阶乘 n! = n * ( n -1 ) * ( n - 2) * ... * 3 * 2 1
int jc = 1; //定义最终结果变量
for ( int x = 1; x <= 5; x++ ){
*Jc = x
}
在控制台输出所有的水仙花数
//水仙花数就是指一个三位数,其各位数字的立方等于该数本身
Eg:153 = 111 +555+ 333 = 125 +27 =153**
通过 for循环我们可以实现获取一个三位数
获取这个三位数的个十百位上的数据
获取方法: 假设有一个数据为 153
Ge: 153 % 10 =3
Shi :153 / 10 % 10 = 5
Bai: 153 / 10 / 10 % 10 = 1
Qian: x/10/10/10%10
Wan :x/10/10/10/10%10
利用嵌套循环:可以输出各种样式的三角形
外循环控制行数,内循环控制列数
System.out.print(****“ ***** ”****) → 不换行
System.out.println() → 换行
九九乘法表
(二)while循环
判断条件表达式的值为逻辑真时,重复执行循环体(不满足出去)
死循环:
第一种:
for(;;){}
第二种:
while(true){}
While循环和for循环的区别?
使用区别:
for循环 控制条件定义的变量,只能在循环内使用
while 循环 ..... 可以在循环外使用
因为变量及早的从内存中消失,可以提高内存的使用效率
另一种理解:
for 语句不仅适用于循环次数明确的情况,也适用于循环次数不明确的情况
while 循环适用于循环次数不明确的情况
(三)do ... while循环
先执行循环体,再判断继续条件不为逻辑真时,再执行循环体并判断条 件, 直到条件为假转去执行while下面的语句(不满足出去)
至少要执行一次
2.12 跳转控制语句
·break:中断
·continue: 继续
·return: 返回
(一)break 的意思是中断
适用:switch、循环语句中(循环语句中加入了if判断的情况)
跳出单层循环(从最近的封闭循环体中跳出)
若想跳出多层循环 需要使用带标签的语句
格式:标签名:语句
(二)continue 继续的意思是
跳出一次循环进入下一次的执行
(结束本次循环,进入下次循环的判定。)
(三)retuen
return关键字不是为了跳出循环体,更常用的功能是(结束一个方法),也就是退出一个方法。跳转到上层调用的方法。
结尾:
如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_
如果能帮到你的话,那就来关注我吧!
在这里的我们素不相识,却都在为了自己的梦而努力 ❤
一个坚持推送原创Java技术的公众号:理想二旬不止