黑马程序员_编程基础之第一篇---java语言基础一
java语言基础
java语言基础组成包括:
关键字、标识符、注释、常量和变量、运算符、语句、函数、数组
1.关键字---被java赋予了特殊含义的单词称为关键字;
2. 注释-----分为单行注释//、多行注释/**/、文档注释/** **/,注意文档注释是java语言所特有的。注释的作用:
一是用来注解说明程序的。
二是用来调试程序的。
注释是一个程序员必须要有的良好的变成习惯;
初学者编写程序可以养成习惯:先写注释再写代码;
3. 标识符----在程序中自定义的一些名称。
规则:由数字0-9、大小写字母a-z、另外两种符号_$组成。
定义合法标识符规则:
1.数字不可以开头
2.不可以使用关键字
例如:class、static、1demo等都是不被允许的。
java中是严格区分大小写的,大小写不同的两个名称代表了不同的含义。
需要注意的一点是:main并不是关键字,却是被虚拟机所识别的一个名称。
作为了解的java的名称规范(多单词组成时):
包名:多单词组成时,所有字母都小写;xxyyzz
类名接口名:多单词组成时,所有单词的首字母大写;XxYyZz
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写;
xxYyZz
常量名:所有字母都大写,多单词时,每个单词用下划线连接。
XX_YY_ZZ
4.常量
常量指java当中固定不变的数据。
分类:
1.整数常量
2.小数常量
3.布尔类型常量,只有两个数值true和false
4.字符常量---字母、数字符号,用单引号’‘区分,只能存放一个字符。’ab‘是错误的
5.字符串常量--"ab"存在好多字符;“”空字符串
6.null常量--只有一个数值null
对于整数,java有三种表现形式:
十进制:0-9满十进一(23)
八进制:0-7满八进一,用0开头(023)
十六进制:0-9 A-F 满十六进一,用0x开头表示(0x23)
计算机内存中存放的都是二进制数据。
规律:进制越大,表现形式越短!
进制的转换:
1.二进制和十进制的转换
十进制---->二进制
原理:对十进制进行除2运算。
6的二进制=110
6除2 余数为0
3除2 余数为1
1除2 余数为1
二进制---->十进制
原理:二进制乘以2的过程
110的十进制
0*2的0次方+1*2的1次方+1*2的2次方=6
0110101的十进制=
1*2(0)+0*2(1)+1*2(2)+0*2(3)+1*2(4)+1*2(5)+0*2(6)=52
八进制和十六进制的转换
2.转成十六进制(0-9 A-F)
0101-1010的十六进制
四个二进制位就是十六进制:
0101=5
1010=10
在十六进制中没有10,用A表示
所以结果为0x5A。
---------------------------------------
3.八进制转换
0101-1010
001 011 010的八进制:
三个二进制位就是八进制
001=1
011=3
010=2
结果为:0132
总而言之,二进制转换成任意进制,都是乘法运算;十进制转换成二进制是除法运算;
负数的二进制表现形式:
6=110
-6:其实就是6的二进制取反,然后加1
0000-0000 0000-0000 0000-0000 0000-0110
1111-1111 1111-1111 1111-1111 1111-1001
+ 0000-0000 0000-0000 0000-0000 0000-0001
=1111-1111 1111-1111 1111-1111 1111-1010
规律:负数的最高位是1。
5.变量
就是将不确定的数据进行存储,也就是需要在内存中开辟一个空间。
如何开辟内存空间呢?通过明确数据类型,变量名称,数据来完成。
格式: 数据类型 变量名=值;
A.基本数据类型
1.数值型
byte short int long (整数)
byte -2(7)-2(8)-1 1B short -2(15)-2(15)-1 2B
int -2(31)-2(31)-1 4B long -2(64)-2(64)-1 8B
float double(浮点)
单精度和双精度区别在于数字精度不同,float 占4B,double占8B,默认为double。
2.字符型
char------ 0-65535 2B
3.布尔类型
boolean------- true和false两种类型。
什么时候定义变量呢?
当数据不确定的时候,需要对数据进行存储时,就定义一个变量来 完成存储动作。
B.类型转换
自动类型提升(隐式转换)
byte b=3;
b=b+2;
第一步:b在运算时在计算机中占1B,而2占4B,1B(自动提升)+4B
第二步:b+2的结果赋给byte类型的b,可能会丢失精度,此时可以把运算结果强制转换一下
b=(byte)(b+2);
char类型也是可以进行运算的。'a'+1=98因为,char类型有对应的asc码表。
6.运算符
算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符
1.算术运算符+ - * / % ++ -- 、+(字符串连接符)
%规律:进行模运算时,左边如果小于右边,结果为左边;
左边如果等于右边,结果为0;
负数进行模运算时,结果等于左边。
++:int a=3,b;
b=a++;
结果b=3;a=4;
a++这句话的意思是说,给a变量的值进行+1操作,并把操作后的值重新赋值给a;
相当于a=a+1;
b=a++;运算顺序是,先将a的值赋给b,然后a再自增1;
b=++a;运算顺序是,a先自增1,然后赋值给b;这样运算的结果是a=4;b=4;
+(字符串相加):字符串数据和任何数据使用+相连接,最终都会变成字符串。
字符串数据和任何数据使用+都是相连接,最终都会变成字符串。
7.转义字符
通过反斜线\来转变后面字母或者符号的含义。
\n:换行;\r:按下回车键;都是换行
\b:退格(backspace);\t:制表符(tab);
反斜线只对后面的一个字母或者符号进行转义。
8.赋值和比较运算符
a.赋值运算符
= += -= *= \= %=
面试题可能会遇到:
short s=4;
s=s+5;与short s=4;
s+=5;的区别在于:
前者是进行了先做加法,然后再赋值的运算,有一次自动提升的过程;
而后者只进行了一次赋值运算,把左右两边的和赋给左边;
两者最大的区别是后者会进行一次自动转换的动作,而前者是不会的。
b.比较运算符
== !- < > <= >=
instanceof(检查是否是类的对象)
==是比较运算符,它运算完的结果非真即假;
=是赋值运算符
注意:比较运算符“==”不能误写为“=”
9.逻辑运算符
&与 |或 ^异或 !非 && ||
6>x>3在程序中是不被允许的;因此,逻辑运算符用于连接布尔类型的表达式;
&---必须两边的布尔表达式都为真,结果才为真;
| ----只要有一个布尔表达式为真,结果就为真;
^----两个布尔表达式结果不相同,结果就为真;
!true=false; !!true=true
&&双与(短路)
&和&&的区别:两者在运算结果上没有任何区别;
两个布尔表达式都为真的情况下,运算结果是没有任何区别的;
&&的时候,只要前者为false,后边的表达式压根就不会再执行了,也就是短路了;
&的时候呢,即使前者为false,后边的表达式也还会再执行一遍;
使用双与:执行效率大大提高,
||(双或)---有一个为真就行
|和||的区别:同样的,在运算结果上是没有任何区别的;
|:两边都参与运算;
||:只要检测出第一个表达式结果为true,第二个表达式也是不会执行的;
10.位操作符
<<左移 >>右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码
这里要牵扯到二进制运算了。
<<:3<<2=12 (3的二进制表示为011)
在内存中表示为:0000-0000 0000-0000 0000-0000 0000-0011
左移两位之后,后边两位补0,变成
0000-0000 0000-0000 0000-0000 0000-1100
这种情况下:计算出二进制对应的数字,便是3左移两位之后的结果啦!
>>:6>>2= 1 (6的二进制表示为110)
在内存中表示为0000-0000 0000-0000 0000-0000 0000-0110
右移两位之后,前边两位补0,后边的两位去掉
0000-0000 0000-0000 0000-0000 0000-0001
规律就是:一个数左移,数字会变大;右移的话,数字会变小;
3<<1=6;3<<2=12; 3<<3=24;
规律可想而知:在左移的情况下,一个数乘以2的(移的位数)的次方;
6>>1=3;6>>2=1;
在右移的情况下,结果就等于一个数除以2的(移的位数)的次方;
>>>:无符号右移
在>>的时候,最高位补0或1,由原有数据的最高位的值来定;
如果最高位是0,右移后,用0补空位;如果最高位是1,右移后,用1补空位;
在>>>的时候,无论最高位是0或1,右移后,都用0补;
& | ^:也可以作为位运算符来操作,简单来说就是对二进制进行操作;
原理如同逻辑操作符中&|^是一样的。
&:两者为真,结果为真;|:一者为true,结果为真;^:两者不同,结果为真;
6&3=2; 6|5=7; 6^5=3;
反码:就是取反;
小细节:^一个数异或同一个数两次,结果还是这个数;(可以用于加密)
位运算符联习:
1.最有效率的方式算出2乘以8等于几
思路:左移的原理:一个数乘以2的移的位数的次方
而8又恰好是2的3次方
代码如下:
System.out.println(2<<3);
2.对两个整数的值进行互换(不需要第三方变量)
思路:在不能使用第三方变量的情况下,可以引用异或的一个小细节:
一个数异或同一个数两次,结果还是这个数,由此可以进行互换而不使用第三方变量;
n=n^m;
m=n^m;//m=n^m^m
n=n^m;//n=n^n^m
使用第三方变量进行数值互换:
int a=3,b=8;
System.out.println("a="+a+",b="+b);
int temp;
temp=b;
b=a;
a=temp;
System.out.println("a="+a+",b="+b);
·位运算符(练习2&三元运算符)
获取一个数的十六进制的方法:
例如60;
int num=60;
//获取60的最低4位,通过&15;
int n1=num &15=12;
System.out.println(n1>9?char(n1-10+'A'):n1);
//获取下一组四位,将60右移4位,用一个变量接收
int temp=60>>>4;
//对temp的值进行最低四位的获取;
int n2=temp&15=3;
System.out.println(n2>9?char(n1-10+'A'):n2);
出现了一个问题:十六进制里没有12,该怎么办呢?
十六进制:0-9 A B C D E F
asc码: 65 66 67
10 11 12
12-10=2+‘A’=(char)67='C'
但是:怎么判断n1的值是否大于9呢?这里要用到三元运算符了;
11.三元运算符
格式:(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
int x=3,y;
y=(x>1)?100:200;
System.out.println("y=")+y;
程序流程控制分为四种:
顺序结构
判断结构
选择结构
循环结构
12.判断结构
if语句有三种格式:
1.if(条件表达式)
{
执行语句1;
}
2.if(条件表达式)
{
执行语句1;
}
else
{
执行语句2;
}
3.if(条件表达式)
{
执行语句1;
}
else if
{
执行语句;
}
。。。
else
{
执行语句;
}
练习:
//需求1:根据用户定义的数值不同,打印对应的星期英文
/*思路:用户定义的值不确定,可以定义一个变量
输入1-7,输出对应的星期的英文
可能会有用户输错的情况,这时候输出,您输入的数字无效*/
int week=8;
if(week==1)
{
System.out.println("Monday");
}
else if(week==2)
{
System.out.println("Monday2");
}
else if(week==3)
{
System.out.println("Monday3");
}
else if(week==4)
{
System.out.println("Monday4");
}
else if(week==5)
{
System.out.println("Monday5");
}
else if(week==6)
{
System.out.println("Monday6");
}
else if(week==7)
{
System.out.println("Monday7");
}
else
{
System.out.println("您输入的数字无效");
}
//需求2:根据用于指定月份,打印该月份所属的季节
//3,4,5春季 6,7,8夏季 9.10,11秋季 12 1 2 冬季
/*思路:定义一个变量,用于存储指定的月份
if变量值==3,4,5,输出春季
夏秋冬同理;
如果变量不在1-12之间,输出数字无效*/
int month=13;
if(month>=1&&month<=12)
{
if(month>=3&&month<=5)
{
System.out.println("month="+month+"对应的季节是春季");
}
else if(month>=6&&month<=8)
{
System.out.println("month="+month+"对应的季节是夏季");
}
else if(month>=9&&month<=11)
{
System.out.println("month="+month+"对应的季节是秋季");
}
else
{
System.out.println("month="+month+"对应的季节是冬季");
}
}
else
{
System.out.println("数字无效");
}
另一种做法:
if(x>12||x<1)
System.out.println(x+"月份不存在");
else if(month>=3&&month<=5)
{
System.out.println("month="+month+"对应的季节是春季");
}
else if(month>=6&&month<=8)
{
System.out.println("month="+month+"对应的季节是夏季");
}
else if(month>=9&&month<=11)
{
System.out.println("month="+month+"对应的季节是秋季");
}
else
{
System.out.println("month="+month+"对应的季节是冬季");
}
13.循环结构
switch语句
格式:
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
。。。。
default:
执行语句;
break;
}
break作用是跳出switch语句;
当所有都不对的情况下,默认default;
特点:1.switch里面的表达式的值只接收四种类型 byte short int char
2.switch当中的case是没有顺序的
3.switch有两种结束方式;一种是break结束,另一种是大括号结束;
需求:根据用于指定月份,打印该月份所属的季节
int x=4;
switch(x)
{
case 3:
case 4:
case 5:
System.out.println(x+"春季");
break;
case 6:
case 7:
case 8:
System.out.println(x+"夏季");
break;
case 9:
case 10:
case 11:
System.out.println(x+"秋季");
break;
case 12:
case 1:
case 2:
System.out.println(x+"冬季");
break;
default:
System.out.println(x+"无效");
}
switch和if的区别:
1.if除了能判断具体数值和区间,switch对于区间比较大的很不好判断;
2.if能够判断布尔值,而switch不可以;
开发时候如何选择if还是switch呢?重点
如果要对具体数值进行判断,而且数值不多,(而且符合byte、short、 int、 char这四种类型)用switch最好;
对区间判断,对结果为布尔类型判断,用if最合适;