第一部分 Java基础语法(上)
Java标识符
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
规范:
所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合
关键字不能用作标识符
标识符是大小写敏感的
类名最好要大写,用来区分他是一个类
java命名规范
(1)类名接口名:所有首字母大写XxxYyyZzz
(2)变量名,函数名:xxYyZz
(3)包名:xxyyzz
(4)常量名 XXX_YYY_ZZZ
格式问题
Java关键字
这些保留字不能用于常量、变量、和任何标识符的名称。(不用记,以后会接触)
Java注释:一定要写
(被注释内容不会被编译,仅仅起到提示的作用,便于后期review代码)
1.// 单行注释
2./*
多行注释
*/
3./**多行注释,可以生成文档,又叫文档注释 命令行输入javadoc xxx.java
*/
1.单行注释可以在单行注释里面。
2.多行注释不能嵌套在多行注释里面。
常量
常量表示不能被改变的数值
变量
变量指的是内存中的一块存储区域,该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以在同一类型范围内不断变化,变量的作用范围只在该“{}”中有效
int a; { a=6; } // a等于6 { int a =6;} //定义在{}内的变量,{}外不可以访问
所以说如果你想要在{}之后访问大括号里进行变化的变量,此变量必须在{}外声明
定义变量的格式
1.数据类型 变量名 = 初始化值(声明并初始化)
2.先声明,再初始化
注意:(1)变量的定义格式是固定的,变量就如同数学中的未知数
(2)变量被使用必须有初始值,它其实就是内存中的一小块区域,用变量名访问
(3)变量只能被声明一次
二进制(了解) 025表示八进制 0x256表示16进制
java二进制采用补码形式表示,正负数区分的标志:符号位(0正,1负)
正数补码是其本身,负数补码取反+1
所以计算机二进制与十进制转换,要先把二进制转换为原码作为过渡再进行转换。
1.十进制转换为二进制:除2取余,除尽为止,余数从上向下看为二进制源码结果,由于是正数所以原码和补码相同
2.二进制转换为十进制:累加求和
3.负十进制转换为负数二进制:取绝对值,转换为二进制,取反加1
4.负二进制:取反加1,转换为十进制,乘-1
拓展:为什么byte表示的是8个字节,范围却是-128到127呢?
-128到127.共256个数。刚好可以用一个字节(8位)表示出来(2^8=256);
01111111表示的是127 ,按道理128表示的是10000000,可是因为第一位是一个符号位,所以byte正数最大值就为127,当第一位等于1的时候就是负数,把10000000看作是一个负数的补码,转换为十进制就是把10000000取反加1为10000000十进制就是128,再乘-1为-128
127后面是-128,最大的正数之后是最小的负数。这就跟钟表一样,12点钟后面是1点中钟一样。
byte b=(byte)128, 把128赋值给b,计算机语言 是通过二进制补码表示的,但因为正数原码补码相同,所以b的值变成了10000000,这时你要输出b,计算机发现第一位的符号位是1,则把它看成是负数的补码,输出时再转换为十进制则变成负128(赋值时,计算机接收的是二进制的补码,输出的时候把补码转换为原码在转换为十进制然后再输出)
基本数据类型:四型八种(可以想象是一种容器,承装事物)
整型 (整数):byte(1个字节8位 -128-127)、short(2个字节)、int(4个字节)、long(8个字节)
浮点型(小数):float(4个字节,2的-149次方—2的127次方)、double(8个字节,非常大)
布尔型(表示真假):boolean(1字节)
字符型:char(2字节)用单引号括起来,只能是两个字母,一个汉字等于两个字符(0-65535)
ascii掌握 a-z(97-122),A-Z(65-90),1-9(48-57),每个ascii都对应一个字符
Java中默认的整数类型是int,如果要定义为long ,则要在数值后加上L或者l
默认的浮点型是双精度浮点,如果要定义float,则要在数值后面加上f或者F
一个字节等于8位,1个字节等于256个数。2^8
一个英文字母或者阿拉伯数字占一个字节
一个汉字占2个字节
可为数字加下划线,让人更易阅读,编译器自动去除
转义字符:具有特殊含义的字符
System.out.prinltn(‘\’’);
\’算是一个整体标识一个单引号
\v竖向跳格 \b退格
\r回车(表示的是回到本行行首)
System.out.println('h');
System.out.println('\r');
System.out.println('a'); //最后输出的是 a因为\r回到了行首,a覆盖了h
\\反斜线符"\" \n新行
\t跳向下一个tab位置(横向跳到下一制表位置) 缩进的时候都要写
数据类型转换
1.自动类型转换
小类型可自动转换为大类型
byte a=12; int b=a byte自动转换为int
特例:char和int型可以互相自动转换,例如char c='1' c不仅等于‘1’还等于49(因为在计算机内部是通过二进制进行交互的,char型在计算机中先转为int再转为二进制)
2.强制类型转换
(比如把装满水的大杯子往小杯子里倒水,多余的会溢出,而小向大倒没有问题。)
大类型转换为小类型,可能损失精度
int a=3;
byte b=(byte)a;
short s = 3; s = s+2; s+=2,有什么区别,为什么?
s=s+2不正确,因为运算的时候转为int型,不能把int型赋给short型,
s+=2会自动强转为short进行运算
字符串类型(引用类型)
String str = ""; // 这个跟"abc"、"中国",本质上这都一样,只是空串,长度为0罢了
""是空字符串,但是也是字符串,没有什么东西。 //字符串初始化用“”,不用null
而null是空的意思,什么都没有,没有地址。
字符串与基本数据类型的转换
String s=“”+123; //基本数据类型转换为字符串,空串加基本数据类型(+可用于字符串连接)
Integer.parseInt(数字字符串); //字符串转换为数字
Double.parseDouble(数字字符串);
s.charAt(index)//字符串转换为字符
java代码是顺序执行的
运算符(相等是== ,赋值是= 千万不要写错!)
算术运算符:+ - * / % ++ --
(1) int a=5; int b=2; int c=a/b; int表示整数,小数部分被舍弃,答案为2
(2) int a=3;int b=4;double c=a/b; a/b运算之后是int型,舍弃小数部分为0,自动转换为double增加精度变成0.0
(3) int i=3; int a=i/2 + i/4 =1+0 每一次i的运算返回值都是int型
(4) double a=3;int b=4;double c=a/b 两数想运算,返回的结果是两数据类型中较大的(精度)
整型运算自动转换为int进行运算,浮点型运算自动转换为double进行运算,因此要得到特定其它类型,需要进行强制转换
注:不知道有没有有这样的疑问:
为什么byte a=1+2; 是合法的而 byte a=1; byte b=2;byte c=a1+a2;就是非法的,这是因为a1+a2在运算的时候自动转成了int型然后再运算,返回值变成了int型,或许还会想为什么两者代表的都是1+2为什么第二个非法呢,因为在运算的时候第二个1和2从byte型的盒子里跑到了int型的盒子内,而第一个里的1和2不在任何盒子里,所以第二个如果要把它变成byte型,就要打破盒子也就是强转
i++先运算(包括比较),先赋值,先输出,再自加,自加表示对本身的操作等同于i=i+1(int i=5;int a=i++; 此时a=5,i=6 ) byte a=127 byte=++a; 是对a本身操作,a的类型并没有转换,而
byte c=a+1 右边变成一个运算,所以会自动转换为int型
int i=5;int a=i++ + i++; 此时a=11,i=7第一个i++是5++,第二个i++因为第一个i++结束变成6++ ,所以a=5+6=11; i=i+1+1=7
int b=i++ + i-- + i++ 5++ + 6-- + 5++ =16
++i 先自加,再赋值(int i=5;int a=++i; 此时a=6,i=6 )
面试题
int i=3; i=i++; i=i++; 输出的i都为3,不变
原因:其实a++的运算,是在a进行运算之前,先开辟一块内存用来存储变量a的复制,b真正指向的其实是a运算之前的复制,所以b的值为3
而i=i++,由于两边变量相同,i的复制最后覆盖了i++后的值
i++在内存中是比较奇特的,而a=b+c 在内存中,b和c并不会复制,而是直接将b和c相加,得到的值赋给a
i*=++i i= i* ++i=12*13
逻辑和关系运算符
!=表不等 == 表相等
&&短路与,||短路或 如果第一个表达式能确定结果,第二个表达式就不进行计算
&,| 两个表达式都进行计算
建议用短路与与短路或,避免一些错误产生,例:x!=0&&1/x 当x=0时确定结果,不会执行第二个表达式避免了错误的产生
expression1 ^ expression2 异或,两侧真假相同,为假
三元运算符
condition?expression1:expression2 当condition为真时计算第一个表达式,为假计算第二个表达式
面试题: System.out.println(3>2?2:3.0);
注:1.表达式1和表达式2决定返回值类型
2.如果表达式类型不一致,必须进行类型转换,转换为表达式类型中较大的一个类型,从而决定返回值
3.表达式1和表达式2中都可以再套一个三元运算符构成了复杂的三元运算符
位运算符(针对二进制),1表示true,0表示false (了解)
无符号右移:符号位不跟着移动,有符号右移>>>:符号跟着一起移动(不存在有符号左移)
5<<2左移两位 0000 0101 左移两位后0001 0100
5>>2
若是int型表32位,则 1<<35 与1<<3相同,因为需要进行模32的运算
1&1为1,否则为0 0|0为0,否则为1
异或:相同为false(0),不同为true(1)
4取反为-5 4二进制为0100取反为1011,第一位为1表负数,-1去反转换为十进制为-5
面试题:把8变成2最快效率,把8右移二位(因为8/2计算机也会先转换为2进制,再运算)
输入输出
控制台输入:构建Scanner对象,并与“标准输入流”System.in关联。
Scanner in=new Scanner(System.in);
String name=in.nextLine(); //nextLine()表示获取一行
使用println有可能读取的是一个空行
String firstName=in.next(); //读取一个单词,以空格为分隔符
int age=int.nextInt; //读取一个整数,举一反三可以读取其它基本类型
格式化输出(了解)实际调用了format
System.out.printf(“hello,%s,you‘ll be %d”,name,age) 表示以%s的形式表示name
每一个以%字符开始的格式说明符都用相应的参数替换,f表浮点,s表字符串,d表十进制
%8.2f 表示 打印8个字符,小数点后有两位
%,d 表示将整数以逗号进行间隔
print 表示不换行的打印
输出时不管任何类型都会先转换为String然后输出