java语法基础

1、Java语法基础

1.1、Java简介

1.1.1、编程简介

其实所谓编程,就是操作计算机来实现我们的需求。计算机只是一个工具,是为了辅助我们实现我们的需求。而在编程的过程中,其实就是我们人类和计算机之间进行沟通的过程。由于计算机和人类之间语言不通,因此无法直接进行沟通,因此需要一个翻译存在。但是,很不幸,没有任何的一个翻译既懂机器语言,也懂人类的语言。因此,我们要学习的是翻译会的另外一种语言。这个翻译,其实就是一个编译器。

1.1.2、编程语言简介

编程语言,就是人类去操作计算机的语言。编程语言相比较于机器语言,更加容易被人类接受学习。Java就是一种高级的编程语言。所谓的高级的编程语言,指的是语言的立场更加靠近人类,对于人类来说,更加简单、容易学习。

1.1.3、Java简介

Java是一种高级的、面向对象的编程语言。诞生于1995年5月23日,由Sun公司在Sun World会议上正式发布。

Java的技术体系可以分为4个平台:

  • Java Card:支持一些Java小程序(Applets)运行在一些小的内存设备上。
  • Java ME:支持Java运行在移动端平台,对Java API有一些精简,并添加了对移动端的支持。
  • Java SE:支持面向桌面版的平台,提供了完整的Java核心API。
  • Java EE:支持多层架构的企业级应用平台,除了提供Java SE的API之外,还对其进行了大量的扩展,并提供了相关的部署支持。

对于大数据方向的学习,只到Java SE。

1.2、开发环境搭建

1.2.1、JDK、JRE、JVM
  • JDK:Java Development Kit
    • 是整个Java开发的核心。包含了JRE、Java工具和Java基础类库。
  • JRE:Java Runtime Environment
    • 提供了Java程序运行所必备的运行环境。包含JVM。
  • JVM:Java Virtual Machine
    • Java程序运行所依赖的虚拟机。是Java跨平台的最重要的部分。
    • Java程序在编译之后会生成.class字节码文件,这个文件会被加载到JVM虚拟机中运行。
1.2.2、JDK的安装

启动安装程序,一步步的安装即可。

1.2.3、环境变量的配置
  1. 为什么要配置环境变量

    在JDK安装完成后,bin目录中存放了若干个对Java程序进行操作的命令,包括javac和java。但是如果以后每次需要使用到这些命令的时候,都要从磁盘根目录开始找这些命令,会非常的麻烦。因此,我们需要将bin目录添加到环境变量中,实现在任意的路径下,都可以直接使用相关的命令来进行对Java程序的处理。

    另外,某些IDE是需要读取环境变量中的JDK的路径,来识别Java环境。如果没有配置环境变量,会导致这些IDE无法正常工作。

  2. 如何配置环境变量

    我的电脑右键 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> Path

    将jdk中的bin目录的位置添加到环境变量的最前方。

    注意事项:
    1、在环境变量中,有若干个路径。路径之间以英文半角的分号作为分隔符,因此,在添加jdk的路径的时候,需要注意路径分隔。
    2、Path变量中存放了很多之前已经存在的路径。新配置的Java的路径,不要影响到原有的路径。如果不小心把之前的路径修改或者删除了,那么很多的操作都会受到影响。因此,如果不能保证一次成功,则在配置环境变量之前,先做好备份。
    
  3. 如何验证环境变量是否配置成功

    环境变量配置成功之后,是需要启动一个新的DOS窗口才能验证。新建一个DOS窗口,输入javac,如果提示的结果是若干个帮助命令,而不是“既不是内部命令,也不是外部命令”,即为成功。

1.3、进制

1.3.1、进制的简介

进制,其实就是进位制,指的是用来表示一个数字的时候进位的制度。在生活中,我们常见的是十进制。但是在计算机中,采用的是二进制。进制是整个计算机世界的根基。

1.3.2、进制的分类

生活中常见的:十进制。

计算机中使用:二进制。

为了综合机器识别的必要性,和对于人类的可读性,发明了八进制和十六进制。

1.3.3、进制的表示形式

二进制:用数字0和1来表示所有的自然数,逢2进1位。

八进制:用数字0-7来表示所有的自然数,逢8进1位。

十进制:用数字0-9来表示所有的自然数,逢10进1位。

十六进制:用数字0-9,a-f来表示所有的自然数,逢16进1位。(字母部分不区分大小写)

另外,在表示一个数字的时候,有可能会出现歧义。所以,在使用不同的进制来表示一个数字的时候,是需要添加上一个标志,来进行不同的进制之间的区分。

二进制:以0b作为开头,例如:0b1001, 0b1100

八进制:以0作为开头,例如:012,0100

十进制:不用任何开头,默认就是十进制

十六进制:以0x作为开头,例如:0x12, 0xAF, 0x8D

1.3.4、进制的转换
  1. 十进制与其他进制之间的相互转换

    1. 十进制转其他进制

      辗转相除法:用这个数字除进制,再用商除进制,一直到商为0结束。将每一步得到的余数倒着连接起来,最后得到的结果,就是转换成指定进制后的结果。

    2. 其他进制转十进制

      用每一位的数字,乘进制的位数-1次方,最后将每一个结果相加,就是转换成的十进制的表示形式。

  2. 二进制、八进制、十六进制之间的相互转换

    1. 一个八进制位可以等价替换成三个二进制位
    2. 一个十六进制位可以等价替换成四个二进制位
  3. 数据单位转换

    每一个二进制位,称为一个比特位:1bit

    每8个比特位,称为一个字节:1byte

    1024byte => 1kb

    1024kb => 1mb

    1024mb => 1Gb

    1024Gb => 1Tb

    1024Tb => 1Pb

    1024Pb => 1Eb

    1024Eb => 1Zb

1.3.5、原码、反码、补码

1、负数的表示形式

在一个二进制的数字中,最高位(最左侧的一位)不是用来表示一个数字的大小的,而是用来表示一个数字的符号的。如果0,代表是正数;如果是1代表是负数。这一位也被称为符号位。

2、关于补码

由于一个数字具有正负性,因此,在进行数据的计算的时候,需要考虑到数字的符号。因此,在计算机中所有的数字存储和运算都是以补码的形式进行的。补码的存在,就是为了解决正负数字在进行存储和运算时候会出现的符号问题。

3、如何计算补码

原码:就是一个数字直接计算得到的二进制本身。

反码:正数的反码与原码相同;负数的反码是符号位不变,其他位按位取反。

补码:正数的补码与原码相同;负数的补码是反码+1;

4、关于补码的计算

数字的存储和计算都是以补码的形式进行的。如果计算结果超出一位,那么这种情况称为是“溢出”。如果出现了溢出的情况,则溢出的那一位舍去不要。

需要注意的是:两个数字通过补码进行运算,而运算结果也是一个补码。如果需要得到原码,则将这个数字再求一次补码即可。

对补码再求补码,得到原码

5、一个字节能够表示的数据范围

一个字节有8位来组成,其中,有7位是来表示数字大小的。

一个字节的数字大小范围是 [-128, 127]

1.4、数据类型

其实编程,就是操作若干数据进行各种计算。每个数据都有自己的类型。

在Java中,数据类型分为两种: 基本数据类型 和 引用数据类型 。

引用数据类型,暂时涉及不到。在我们的计划中,最早接触的引用数据类型是数组。

基本数据类型分为:

  • 整型:就是整数类型
    • 字节型:byte,占1个字节,[-27, 27-1]
    • 短整型:short,占2个字节,[-215, 215-1]
    • 整型:int,占4个字节,[-231, 231-1]
    • 长整型:long,占8个字节,[-263, 263-1]
  • 浮点型:就是小数类型
    • 单精度浮点型:float,占4个字节
    • 双精度浮点型:double,占8个字节
  • 字符型:用来描述一个字符(字母、数字、符号、汉字…)
    • char,占2个字节
  • 布尔型:用来描述非真即假,非假即真的数据
    • boolean,占1个字节
1.5、标识符

1.5.1、什么是标识符

编程其实就是操作很多的数据进行各种计算。但是这些数据一定要有一个标志来区分它们。标识符,是一个有序的字符序列,用来表示内存中的数据。类似于数学中的代数。

1.5.2、标识符的命名规则

1、由字母、数字、下划线和$符号组成。

2、不能以数字开头。

3、不能与系统关键字、保留字重复。

关键字:其实也是一个满足以上两点要求的字符序列,只不过这个字符序列被系统占用了,已经被赋予了特殊的含义。
保留字:也是满足以上两点要求的字符序列,同样被系统占用了,但是目前暂未赋予特殊的含义,可能会在后续的版本更新中使用。
1.5.3、标识符的命名规范

所谓的规范,其实就是人类约定俗成的一系列条约。不按照规范来进行标识符的命名,对程序来说,没有影响。但是影响的是自己对你的代码的阅读能力,以及团队之间的沟通能力。

  • 望文知义:每一个标识符的命名需要有一定的含义,让人一眼看上去就知道想表示的数据是什么。
  • 遵循驼峰命名法:
    • 在遵循望文知义的情况下,有些时候一个标识符的命名可能比较长,由多个单词组成。
    • 大驼峰:组成一个标识符的每一个单词的首字母都是大写的。
    • 小驼峰:首单词除外,从第二个单词开始,每一个单词的首字母都是大写的。
以后在标识符的命名中,如果没有特殊说明,默认使用小驼峰。
《阿里巴巴编码规范手册》
1.6、变量、常量

1.6.1、变量常量的概念

如果某一个标识符表示的数据,在程序运行的过程中是可以发生改变的,这样的数据称为变量。

如果某一个标识符表示的数据,在程序运行的过程中是不能发生改变的,这样的数据称为常量。

1.6.2、变量常量的定义方式

变量的定义

// 语法:数据类型 标识符;
int age;
age = 10;			// 将10给变量age进行赋值
age = 20;			// 将20给变量age进行赋值

// 语法:数据类型 标识符 = 初始值;
int height = 172;	// 在定义一个变量的同时,给他赋一个初始值

// 语法:数据类型 标识符1, 标识符2, ...;
int a, b, c, d, e;	// 可以同时定义多个相同类型的变量
int x, y = 20, z;	// 可以同时定义多个相同类型的变量,并且对其中的某些变量进行初始化赋值

常量的定义

// 常量,需要使用关键字 final 修饰
final int birthday = 2000;		// 定义一个常量,一旦赋值完成,值不可以修改
// 常量,也可以先声明,后赋值
final int day;
day = 30;
1.6.3、各种数据类型的变量定义

不同数据类型的变量,在定义的时候,直接修改为指定的数据类型即可。但是有些数据类型需要特殊说明:

1、关于long型:整型字面量默认推导的类型是int,如果需要写一个long型的字面量,需要在最后添加一个l。

2、关于浮点型:浮点型字面量默认推导的类型是double,如果需要一个float型的字面量,需要在最后添加一个f,或者大写的F。其实double类型,也可以在最后添加一个d来表示。

3、关于字符型:字符型的字面量,需要使用单引号括起来,并且单引号中只能有一个字符,不允许多,也不允许少。

/*
 * 每一种数据类型的变量的定义和赋值
 */
// 整型
byte a = 10;
short b = 20;
int c = 30;
long d = 40;

// 浮点型
float e = 3.14f;
double f = 3.14;

// 字符型
char g = 'a';

// 布尔型
boolean h = true;
boolean i = false;
1.7、注释

注释,其实就是对某一段程序的解释、备注。注释的内容是为了提示程序员的,注释部分的内容不会被编译运行。

在Java中,注释分为三种:

  • 单行注释:顾名思义,就是注释一行的内容,用两个//来表示。
  • 多行注释:注释多行的内容。以/*作为开头,以*/作为结尾。
  • 文档注释:常用于类、接口、方法前面。以/**作为开头,以*/作为结尾。
1.8、数据类型转换

1.8.1、什么是数据类型转换

一个变量声明完成后,已经在内存上开辟好了空间,此时这个空间大小是不允许改变的。也就是说一个变量的类型是不允许改变的。数据类型转换,其实就是定义一个新的指定类型的变量,然后将原来的变量的值给这个新的变量进行赋值。赋值完成后,新的变量和原来的变量值基本相同,并且类型也发生了改变,因此,这个过程就被称为数类型转换。

在数据类型转换中,分为两种转型:自动类型转换 和 强制类型转换

1.8.2、自动类型转换

其实,就是一个直接的赋值操作,不需要进行任何额外的操作。常见于取值范围小的数据类型转型为取值范围大的数据类型。例如:byte转型为int。

byte、short、char类型的变量,在进行计算的时候,结果会自动的转型为int类型
1.8.3、强制类型转换

在进行赋值的时候,需要额外的操作来辅助完成。常见于取值范围大的数据类型向取值范围小的数据类型转型。

注意事项:
强制类型转换,可能会出现值溢出的问题。
在强制类型转换的时候,非常有可能出现的情况是两个类型的字节数不一样。如果出现这样的问题,取最后的指定的字节数的数据为新的变量赋值。
自动类型转换,由于不需要任何的额外操作,因此被称为 -- 隐式转换
强制类型转换,由于需要强制转换的操作,因此被称为 -- 显式转换

1.9、字符类型

1.9.1、字符型是如何存储的?

任意的数据在计算机底层存储都是二进制数字,字符型也不例外。每一个字符在计算机底层存储的时候,都是以一个数字来存储的。

每一个字符与数字的对应关系,需要在一个类似于字典的文件中存储,这样的存储了每一个字符与数字的对应关系的文件,被称为是 – 字符集。

常见的字符集:ASCII、GB2312。

世界上每一个国家都有自己的字符集,来存储自己国家的文字。为了将每一个国家的字符集统一起来,发明了unicode字符集。

unicode被称为万国码,为了统一每一个国家的字符集,统一规定给每一个字符都分配两个字节的空间。这样会有一个问题:如果一个文本中所有的字符都可以用一个字节来表示,那么这个文本的体积翻倍了。

因此,肯·汤普森 在unicode的基础上,发明出了 utf-8 的字符集。这个字符集也叫作万国码。但是这个字符集会针对每一个字符动态的分配空间大小。

1.9.2、字符类型与整型的相互转换

在Java中,字符类型可以和整型直接相互转换。

int x = 'a';
System.out.println(x);

char y = 97;
System.out.println(y);

1.9.3、转义字符

转义字符,就是一个\,常用于字符或者字符串中。可以将某些具有特殊含义的字符变成普通字符,不再具备特殊的含义。

反斜线是一个转义字符,只会对后面的一个字符生效,使其转义。如果在一个字符串中,有多个特殊的字符,那么,每一个特殊字符的前面都需要添加一个转义字符。

char c = '\'';
System.out.println(c);		// '

转义字符还有另外一个作用:转义字符可以配合某些普通的字符使用,使其具有特殊的含义。

\t		: tab
\n		: 换行
\r		: 回车

1.10、常用运算符

1.10.1、算术运算符
+  -  *  /  %
以上几个运算的注意事项:
1、求模运算%:求余数, 5 % 3 = 2
2、关于/:整型与整型的计算结果,还是整型。最终除如果得到一个浮点型的结果,那么这个浮点型的数字会自动的转成整型数字,浮点型转整型,舍去小数点后面所有的内容,直接保留整数部分。

++  --
自增、自减运算符,对一个变量进行自增1、自减1。
注意事项:自增、自减运算是很多初学者很容易出错的地方。
自增、自减运算符,可以放在变量的前面,也可以放在变量的后面。

放变量前:先对这个变量进行自增、自减操作,然后再使用这个变量的值。
放变量后:先使用这个变量的值,然后再对这个变量进行自增、自减操作。

int a = 10;
System.out.println(a++);	// 10,  a = 11
System.out.println(--a);	// 10,	a = 10
System.out.println(++a);	// 11,  a = 11
System.out.println(a--);	// 11,	a = 10
System.out.println(a);		// 10

// 拓展(了解):
// 在内存中进行各种计算的时候,其实是将计算的结果先存到了一个临时的空间中,然后再使用这个空间中的值给指定的变量赋值
a = a++;
System.out.println(a);		// 10

1.10.2、赋值运算符
=
是一个赋值运算符,将等号右边的值给左边的变量进行赋值。
+=  -=  *=  /=  %=
将一个变量,在现有值的基础上,对一个数字进行运算
a += 3;			// a = a + 3;
a -= 3;			// a = a - 3;
a *= 3;			// a = a * 3;
a /= 3;			// a = a / 3;
a %= 3;			// a = a % 3;

注意事项:
1、组合运算符,在给左侧变量进行赋值的时候,是进行了一次强制类型转换。
2、赋值运算,也有运算结果。赋值运算的结果,是赋值完成后的变量的值。

char c = 'a';
System.out.println(c += 2);	// 结果是c,并不是99

byte n = 127;
n++; // n += 1   n = n + 1
System.out.println(n);		// 结果是-128

int a = 10;
System.out.println(a = 100);	// 结果是赋值完成后的变量值100

1.10.3、关系运算符
对两个数据进行大小比较的运算
>  <  >=  <=  ==  !=

关系运算的结果一定是 boolean 类型

1.10.4、逻辑运算符
对两个boolean类型的变量进行的运算
&   |   !    ^
&:与,两真即为真,有任意一个为假,结果就是假。
|:或,两假即为假,有任意一个为真,结果就是真。
!:非,非真即假,非假即真。
^:异或,两个相同为假,两个不同为真。

&&:短路与, ||:短路或。
短路操作:如果在进行逻辑运算的时候,前半部分的内容可以决定最终的结果,则后半部分不参与运算。
以后在使用逻辑运算的时候,如果没有特殊的需求,尽量使用短路操作。

int x = 10, y = 20;
boolean flag = x++ > --y && x-- < ++y;
System.out.println(flag);	// false
System.out.println(x);		// 11
System.out.println(y);		// 19

1.10.5、位运算符
类似于逻辑运算,将两个整型数字的补码的每一位进行类似逻辑运算的操作。1相当于true,0相当于false。
&  |  ^  ~
注意事项:
~按位取反,是将一个数字的补码的每一位进行取反,包括符号位。

x = 10;		// 0000 1010
y = -20;	// 1110 1100

/*
 * 0000 1010
 * 1110 1100
 * 0000 1000
 */
System.out.println(x & y);	// 8
/*
 * 0000 1010
 * 1110 1100
 * 1110 1110 => 1001 0010
 */
System.out.println(x | y);	// -18
/*
 * 0000 1010
 * 1110 1100
 * 1110 0110 => 1001 1010
 */
System.out.println(x ^ y);	// -26
/*
 * 0000 1010
 * 1111 0101 => 1000 1011
 */
System.out.println(~x);		// -11

<< >> >>>
位移运算符,也叫作移位运算符。
将一个数字的补码的每一位向左或者向右移动指定的位数。

>> : 有序号右移,左侧补符号位。
>>>: 无符号右移,左侧补0。

1、左移运算符,每向左移动一位,相当于乘一个2
2、右移运算符,每向右移动一位,相当于除一个2,但是如果除的结果是浮点型数字,最后的结果是向下取整。

1、位异或:定理:一个数字和另外一个数字异或两次,肯定得到自己。
2、面试题:如何高效率的计算 2 * 8 解: 2 << 3

1.10.6、三目运算符
语法:
boolean变量或者boolean结果的表达式 ?值1 :值2
规则:
如果问号前面的boolean是true,整体的结果是值1;
如果问号前面的boolean是false,整体的结果是值2;

int a = 10, b = 20;
/*
 先判断a和b的大小关系,
 如果a > b成立,取a的值给max赋值,
 如果a > b不成立,取b的值给max赋值
 */
int max = a > b ? a : b;

1.10.7、运算符的优先级

1、运算符的简单分类:

运算符根据操作数的不同,可以分为:一元运算符、二元运算符、三元运算符。

一元运算符:只能操作一个操作数,++ -- ! ~ + - (此时的+和-代表的是正负)
二元运算符:只能操作两个操作数,
三元运算符:只能操作三个操作数,三目运算符。

2、运算符的优先级

1. 一元运算符 > 二元运算符 > 三元运算符
2. 算术运算:乘除模 > 加减
3. 逻辑运算:与 > 或
4. 赋值运算符的优先级是最低的
5. 小括号的优先级是最高的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值