第一章
开发环境
JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境,以及常用的Java类库等。
JRE(Java Runtime Environment),Java运行环境,是运行Java程序的必须条件。
JVM(Java Virtual Machine),Java虚拟机,是运行Java程序的核心虚拟机。
三者关系:JDK包含JRE,JRE包含JVM。
Java程序需要经过编译才能运行,编译的是.java文件,运行的是通过编译生成对应的.class文件。
编译命令:javac + 空格 + java文件全称(包含扩展名);
运行命令:java + 空格 + class文件名称(不包含扩展名);
【以上命令必须进入文件所在目录】
面向对象
面向对象是一种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、消息等基本概念进行程序设计。【类】是采用面向对象方式开发的程序的最小程序单元,【成员变量(状态数据)+ 方法(行为) = 类 】
面向对象方法的三个基本特征:封装、继承和多态。
封装指的是将对象(类)的实现细节隐藏起来,然后通过一些公用方法来暴露该对象(类)的功能;
继承是面向对象实现程序复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;
多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。【通俗的讲,就是一个父类有一个或者多个子类,在创建子类对象时,类型定义为父类或子类,而这个对象在表达行为(方法)时,可能表达出子类的行为(方法),也可能表达出父类的行为(方法)】
第二章
数据类型
Java数据类型有两种:基本数据类型、引用数据类型。
基本数据类型
基本数据类型有四大种八小种,即整型(byte【1字节】、short【2字节】、int【4字节】、long【8字节】)、字符型(char【2字节】)、浮点型(float【4字节】、double【8字节】)、布尔型(Boolean)
整型中每种数据类型大小范围:-2n-1至2n-1-1;n为该类型所占内存空间的位数。【1(byte)字节=8(bit)位】
Java整型数值有4种表达方式:二进制【以0b或0B开头】、八进制【以0开头】、十进制及十六进制【以0x或0X开头】。【十进制就是我们正常使用的数值】
二进制与十进制相互转换:二进制转十进制,二进制数值从末尾开始依次与2n相乘,n从0开始,得到的数值再依次相加,得到就是对应的十进制数值;十进制转二进制,十进制数值除以2,直到商为0【除不尽时,视为商为0,余数为上次相除所得的商】,依次所得的余数,再从右至左排列,所得的数值就是对应的二进制数值。
在十进制中,使用大写或者小写的e表示幂,e2或者E2表示102
引用数据类型
再Java中,除了上述讲的四大种八小种基本数据类型之外,其他数据类型都是引用数据类型。换句话说,Java中,除了基本数据类型,就是引用数据类型。
引用数据类型包含类、接口及数组声明的的数据类型。
类型转换
所有数值型变量(整型及浮点型)之间可以转换。转换分为两种:自动转换及强制转换。自动转换发生在小数值型转大数值型;强制转换发生在大数值型转小数值型,强制转换会丢失精度。【这里说的大小数值型是以类型所占内存大小(位数)来衡量的】。
类型自动转换顺序为byte -> short (char)-> int -> long -> float -> double【数值型从小到大】
强制转换格式:数据类型 变量名 = (数据类型) 变量名
char类型比较特殊,char可以自动转换成int、long、float、double,但byte与short类型不能自动转换成char类型,而char类型也不能自动转换成byte与short类型【注意这里说的是不能自动转换】
在Java中,char是16bit长的无符号整数,因此范围是:0~65535,而short则是16bit长的带符号整数,范围是-32768~32767。 所以,两者虽然字长相同,但意义却不一样(表示范围并不完全重合或包含),因此不管是char转换成short,还是short转换成char,都属于数值的“窄化转换”(Narrowing Primitive Conversion)。 窄化转化都可能“丢失精度”,因此必须强制转换。虽然,这里的“丢失精度”跟从int到short的丢失精度给人的感觉似乎不一样,但仔细想想也没有什么区别,一方面,char有16个bit表示数值,而short用于表示数值大小的只有15个bit,因此,从char到short会“丢失数值精度”,而另一方面,short有1个bit表示数值的符号,而char却根本没有这么个符号位(所有的bit都用来表示数值大小了),所以从short到char也可能“丢失精度”,只是这里丢失的是有关正负的“精确程度”。
自动类型转换不仅发生在赋值过程,在进行数学计算时也会发生自动类型转换。在计算中往往是先将数据类型转换为同一类型,然后在进行计算。转换规则为:操作数只有byte、short与char三种类型,则将转换为int类型;操作数中包含除了byte、short及char之外的数据类型,则将转换为操作数中最大数值型的数据类型。
运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
Java语言中的运算符可以分为算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和类型相关运算符。
算术运算符
算术运算符执行基本的数学运算:加【+】、减【-】、乘【*】、除【/】、求余【%】、自加【++】及自减【–】。
【+】除了作为数学的加法运算符之外,还可以作为字符串的连接运算符;
【-】除了可以作为减法运算符之外,还可以作为求负的运算符(就是表示负数);
【变量A = 变量B++(–)】先赋再自加(自减),变量A与变量B等值;
【变量A = ++(–)变量B】先自加(自减)再赋值,变量A与变量B不等值;
赋值运算符
赋值运算符用于为变量指定变量值。
位运算符
Java支持7种位运算符:按位与【&】、按位或【|】、按位非【~】、按位异或【^】、左移运算符【<<】、右移运算符【>>】及无符号右移运算符【>>>】。
一般来说,位运算符只能操作整数类型的变量或值。将整数类型的变量或值转换成对应的二进制数值进行计算。
按位与【&】
将参加运算的数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1”,结果才为“1”,否则为0。另,负数按补码形式参加按位与运算。
“与运算”的特殊用途:清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零;取一个数中指定位。方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。【例:设X=10101110,取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到】
按位或【|】
将参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;即 :参加运算的两个对象只要有一个为1,其值为1。负数按补码形式参加按位或运算。
“或运算”特殊作用:将数据二进制形式的某些位置置1。【例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。】
按位非【~】
单目运算,参与运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
“按位非”的特殊用法:使一个数的最低位为0,可以表示为:X&~1。~1的值为11……110,再按“&”运算,最低位一定为0。因为,取反运算符的优先级比算数运算符、关系运算符、逻辑运算符和其他运算符都高。
按位异或【^】
参与运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;即:当两位相同时返回0,不同时返回1。
左移运算符【<<】
将一个运算对象的各二进制位全部左移若干位,左边超出的二进制位丢弃,右边补0。在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
例:3<<2首先将3转换为二进制数字00000011,然后把该数字高位(左侧)的两个0移出,其他数字朝左平移2位,低位(右侧)的两个空位补0。得到的最终结果为00001100,转换为十进制是12。
右移运算符【>>】
带符号右移,按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
例:11>>211的二进制形式为:0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。得到的最终结果是0000 0010,转换为十进制是2。
无符号右移运算符【>>>】
按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。 其他结构和>>相似。
【扩展】复合赋值运算符
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:“&=” 例:a &= b 相当于a=a & b“|=” 例:a |= b 相当于a=a | b“>>=” 例:a >>= b 相当于a=a >> b“<<=” 例:a <<= b 相当于a=a << b“^=” 例:a ^= b 相当于a=a ^ b
比较运算符
比较运算符用于判断两个变量或常量的大小,比较运算的结果是一个布尔值。
大于预算符【>】
只支持左右两边操作数是数值类型。如果前面变量的值大于后面变量的值,则返回true。
大于等于预算符【>=】
只支持左右两边操作数是数值类型。如果前面变量的值大于等于后面变量的值,则返回true。
小于预算符【<】
只支持左右两边操作数是数值类型。如果前面变量的值小于后面变量的值,则返回true。
小于等于预算符【<=】
只支持左右两边操作数是数值类型。如果前面变量的值小于等于后面变量的值,则返回true。
等于预算符【==】
如果进行比较的两个操作数都是数值类型,即使它们的数据类型不相同,只要它们的值相同,也都将返回true。【例如:97 == ’a‘;5.0 == 5】如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象才会返回true。
不等于预算符【!=】
如果进行比较的两个操作数都是数值类型,无论它们的数据类型是否相同,只要它们的值不相同,也都将返回true。如果两个操作数都是引用类型,只有当两个引用变量的类型具有父子关系时才可以比较,只有两个引用指向的不是同一个对象就会返回true。
逻辑运算符
短路与预算符【&&】
前后两个操作数必须都是true才返回true,否则返回false。如果前一个操作数为false,则跳过其余操作数,直接返回结果false,这就是所谓的短路。
不断路与预算符【&】
前后两个操作数必须都是true才返回true,否则返回false。不发生短路,即还会去判断其余操作数。
短路或预算符【||】
只要操作数中有一个是true,就可以返回true,否则返回false。如果前一个操作数为true,则跳过其余操作数,直接返回结果true,这就是所谓的短路。
不断路或预算符【|】
只要操作数中有一个是true,就可以返回true,否则返回false。不发生短路,即还会去判断其余操作数。
非预算符【!】
只需要一个操作数,如果操作数为true,则返回false;如果操作数为false,则返回true。
异或运算符【^】
当两个操作数不同时为true或为false,才返回true,如果两个操作数同时为true或为false,则返回false。
三目运算符
格式:(expression) ? if-true-statement : if-false-statement;
规则:先对逻辑表达式expression求值,如果逻辑表达式返回true,则返回第二个操作数(if-true-satement)的值,如果逻辑表达式返回false,则返回第三个操作数(if-false-statement)的值。
预算符的优先级
所有的数学运算都认为是从左向右运算的,Java语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,是从右向左结合的,也就是从右向左运算。
优先级顺序:分隔符【. [] () {} , ;】> 单目运算符【++ — ~ !】> 强制类型转换运算符【(type)】> 乘法/除法/求余【* / %】 > 加法/减法【+ -】> 移位运算符【<< 、>>、 >>>】> 关系运算符【< 、<=、>=、>、instanceof】 > 等价运算符【==、!=】 > 按位与【&】> 按位异或【^】> 按位或【|】> 条件与【&&】 > 条件或【||】 > 三目运算符 > 赋值【= 、+=、-=、*=、/=、&=、|=、^=、%=、<<=、>>=、>>>=】
原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/java/java-learn.html