第一阶段-Java基础知识:【第二章 Java基础语法知识】

第一阶段 JAVA基础知识

第二章 Java基础语法知识

在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的“潜规则”,通过你对命名的书写,别人一眼就能看出你是不是一个“行家”。我们先来看一下有哪些规则。

A:包名:

全部小写用.隔开 eg: com.ideal.www

B:类名或接口:

类的首字母大写。如果类名由若干个单词组成,那么每个单词首字母大写。

C: 方法或变量名:

所有的方法名都应该小写字母开头。如果方法名 含有若干个单词,那么其后每个单词首字母大写。

D: 常量名:

全部大写 用 _ 隔开

E:原文件名:

原文件名必须和类名相同 类名.java

F: 主方法入口:

所有的Java 程序由public static void main(String []args)方法开始执行。

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 (二进制)

= 1*2^4 + 1*2^3 + 1*2^0

= 16 + 14 + 1

= 21

0123 (八进制)

= 1*8^2 + 2*8^1 + 3*8^0

= 64 + 16 + 3

= 83

0x3c (十六进制)

= 3*16^1 + 12*16^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码,用单引号赋值。

注意:

1. 整数默认是int类型

声明long型常量的时候长整数要加L或者l

如:long l = 66666666666666L//否则报错

2. 浮点数默认是double(双精度浮点型)

声明float型(单精度的浮点数)要加F或者

如:double d = 521.1 //正确 float f = 52.1f //必须加f

3. boolean一般用来进行逻辑运算→流程控制中

4. Byte、short类型被赋值时,其实接收的是一个int类型的值,不 在范围内即报错

5. 一个中文字符占据两用字节,Java中字符可以存储一个汉字,是 因为Java字符采用Unicode编码,每个字符占用两个字节。

6. 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.4*10^38 > 2*10^38 > 2*8^38 > 2*2^3^38

= 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

10

键盘录入

2.10 键盘录入

我们之前所写的程序中,数据的值都是固定的,在源码中就写好的,而我们有时候想要让用户来决定一些值的具体数据(例如:学生成绩录入),所以键盘录入就是让用户输入一些值,使得程序更加灵活。

现在我们对于导包以及对象的概念仍然比较模糊,但是我们在介绍别的知识的时候也会频繁的用到,所以大家暂时按照以下的格式记忆下来。

A:导包:

格式:import java.util.Scanner;

位置:在class上面

B:创建键盘录入对象

格式:Scanner sc = new Scanner(System.in);

C:通过对象获取数据

格式: int x = sc.nextint();

String s = sc.nextLine(); (字符串录入)

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版本是不是简洁了很多呢

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 = 1*1*1 +5*5*5+ 3*3*3 = 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关键字不是为了跳出循环体,更常用的功能是(结束一个方法),也就是退出一个方法。跳转到上层调用的方法。

原文发布于微信公众号 - 理想二旬不止(ideal-20)

原文发表时间:2019-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券