黑马程序员_java语言基础
<span style="background-color: rgb(255, 255, 255);"> </span>
java语言基础组成部分
一,标示符
像类的名称,变量的名称 。注意名称一定要有意义,要方便阅读。而且必须遵循以下规则:
1、英文,数字,_$组成
2、数字不可以开头
3、不可以试用关键字
注意 :再次强调,java严格区分大小写,所以有些关键字开头大写,如果不是这样的话,会只是一个名称,或者程序报错。
一般规范命名要注意的,包名一般都是小写;类名首字母大写,多个单词组成,每个每个的开头都大写;变量名称,多个字母出去第一个每个单词首字母大写;常量就都大写。平常自己编写程序的时候要注意到这个规范,要成良好习惯。
二,java中的常量与变量
整数型(byte short int long)byte即是字节,由八个二进制位表示而成,其他依次是16个、32个、64个。long定义时要在数字后面加l 如:long k= 4567l;
浮点型(float double) float 定义是要在数字后面加f,如:float k=2.3f;
布尔型(boolean) true 、false注意只有这两个常量,就是真和假,有次可看出是用来判断的
字符型(char ) 使用时必须用单引号 'a' , '4' (0~~~6535)内存中占两个八位。
字符串常量 使用时必须用双引号"acd"
以上为基本数据类型
类(class) 接口(interface) 数组([])
这三位为引用数据类型
( 注意程序里java本身一般整数型的常量为int型,小树默认为double型,所以编程时当数据定义的时候要注意,不要溢出。)
例如:byte b=3;b = b+2; 此时b为byte型,而2为int型,所以当两个相加的时候,+号前的b会被系统升级为int型,相加后就不能赋值给byte b 了。如果想赋值,就得用强制类型转换。方式为:(需要转换的类型)变量。 看下面的比较:
System.out.println('a'); 打印字符 a
System.out.println('a'+1); 此时打印出结果为98 ,因为char为两八位,1为四八位,系统自动提升char类型,所以输出为整数类型。
System.out.println((char)('a'+1)); 强制转换方式,把结果以char类型输出。
注意需要记忆的东西:1)字符a在ASDII里面对应数字为97,A为65。
以上为基本数据类型
类(class) 接口(interface) 数组([])
这三位为引用数据类型
定义变量的使用格式为:数据类型 变量名 = 初始化值。例如 int x=4; 注意分号结束。改变x里面的值是这样的 直接 x=4; 如果再写 int x=4,就意味又定义一个变量名,和第一个定义的变量就冲突了。
三,进制和转换
计算机语言中常用到的进制有
八进制:0-7,满8进1。用0开头表示。就是把二进制位每三位表示为一个。
十六进制:0-9,A-F,满16进1,用0x开头。就是把二进制位每三位表示为一个。
不同进制其实是同一个数的不同表现形式。
1、1)二进制和十进制之间的转换,原理就是对十进制数进行除二运算
例如:把6换成2进制 6/2=3 余数为0
3/2=1 余数为1
而1不能被二整出
此时把0和1和1倒着写 为110 此时就是十进制6转换为二进制110
2)二进制转换为十进制 原理就是二进制乘以2的过程
例如:110 从零开始 第一位乘以2的0次方,第二位1乘以2的1次方,第三位为1乘以2的2 次方,依次类推。
3)二进制之间相加
101
+001 此处也是满2进1。
----------
110
其他进制转换也是类同的。十进制转换十六进制和八进制,先转换为二进制,然后转换为十六进制和八进制,即每四位为一位或者每三位为一位,这样计算比较方便。
负数的二进制表现形式。如6,二进制位110;-6 的二进制,其实就是6的二进制取反+1。一般正数的最高位为0,负数的最高位为1。
四,运算
% 取余 需要注意的是 1%5 , 结果为左边,就是说左边比右边小,取左边。-1%5 结果是-1 ,就是说正负号取决于左边。
区别a++和++a。 b=a++ 就是先把a的值赋予b,在自增。b=++a 就是先给自己自增,然后赋值与b。
字符串和任何数据使用+都是相连接,最终都会变成字符串。例子如下:
System.out.println("a="+a+","+"b="+b);结果为a=3,b=4
System.out.println("5+5="+5+5);结果为5+5=55
转义字符应用:\n:换行。\b:退格,相当于backspace。 \r:按下回车键。 \t:制表符,相当于tab键。转义字符就是通过\ 来改变后面字符或者符号的含义。例如:
System.out.println("\"hello world\"");结果为带双引号的“hello world” ,此处通过\转变后面双引号的意义。
赋值运算里要注意 += -= *= /= %= 的意义 。如+=就是把左右两天加起来的和付给左边,其他的类同。如:short s=4;
s=s+5; (不正确) 这一部丢失精度,不正确,此处变量不会自动更改类型,赋值不了左边
s+=5; (正确) 而+=会自动升级变量类型 正确
注意,比较运算里,不要把==写成=
逻辑运算
逻辑运算就是连接boolean类型的表达式。
逻辑运算符里注意 异或 ^ 记住,相同为假,不同为真。
&&和&的区别:用处上没有区别。&:无论左边是true是false,右边都运算。&&:当左边为false时,右边不运算。
||和|的区别 :用处上没有区别。|:无论左边是true是false,右边都运算。||:当左边为true时,右边不运算。
位运算
位运算,<< 左移,实质就是原来的数乘以2的n次方,移动几位n就等于几
位运算,>> 右移,实质就是原来的数除以2的n次方,移动几位n就等于几。注意右移的时候,高位时0,则补0,如果最高位是1则补1。
位运算,>>> 无符号右移,不管左端最高位是1或0,都补0。
位运算相对于乘除来说,运算效率比较高。
&、 |、! 三个也是位运算,只是有以前的boolean型运算变为二进制型的0和1,此时是1视为真,0视为假,逻辑方面和以前逻辑运算一样。例如:6&3=
110
& 011
------------
010 = 2 则 6 & 3 = 2
反码 ~ 就是取反。小知识,一个数异或同一个数两次结果还是原数,可以用于数据加密。(6^3^3=60)
程序里二进制转换为十六进制
原理图:
0000-0000 0000-0000 0000-1100 1110-0110
& 0000-0000 0000-0000 0000-0000 0000-1111
-------------------------------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0110
就是用最后四位为1的与原数 进行 与 运算 ,这就取到了第一组四位。
0000-0000 0000-0000 0000-1100 1110-0110
& 0000-0000 0000-0000 0000-0000 0000-1111
-------------------------------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-1110
取第二组四位的时候,可以把原数进行右移4位即可,然后在和下面的数进行与运算,依次类推即可
然后把相对应的数转换为十六进制即可。
具体程序:
class OperateDemo3
{
public static void main(String[] args)
{
int num = 60;
int n1 = num & 15;
System.out.println((char)(n1-10+'A'));
int temp = 60>>4;
int n2 = temp & 15;
if(n2>9)
System.out.println((char)(n2-10+'A'));
else
System.out.println(n2);
}
}
其中 ni 为与运算过后的值,结果为12,在十六进制里面是C。怎么变化,可以通过-10+'A',然后强制转化char类型即可。
三元运算符 (条件表达式)?表达式1:表达式2。条件表达式为true时,执行表达式1;条件表达式为false时,执行表达式2。
则上述程序输出语句可改为((n1>9)?(char)(n1-10+'A'):ni),用于判断n1是否大于9,n2同样。
流程控制部分
一,if语句 判断结构
格式 1、if(条件表达式) 2、if(条件表达式) 3、if(条件表达式)
{ { {
执行语句; 执行语句; 执行语句;
} } }
else(条件表达式) else if(条件表达式)
{ {
执行语句; 执行语句;
} }
........
else(条件表达式)
{
执行语句;
}
if语句如果其他控制语句只有一条的话,可不加大括号,为防止运行错误,最好加上大括号。
if语句在简单形式上来说,和三元运算符有相同之处,和不同之处:
if else 结构简写格式:变量 = (条件表达式)?表达式1:表达式2
三元运算符:1)可以简化if else 代码 2)因为是一个运算符,所以运算完必须得有结果。
例如: b = x>1?System.out.println("YES"):100 这样就不行,因为如果表达式为true ,则执行那个输出语句,二输出语句并没有实际的运算结果,只是把YES打印到屏幕上,没有运算结果,所以不同。
简单if else 语句:
class IfDemo
{
public static void main(String[] args)
{
int x = 3;
if(x>1)
{
System.out.println("YES");
}
else
{
System.out.println("ok");
}
System.out.println("NO");
}
}
当要多次判断是 用第三种if语句表达形式。
二,switch 选择结构 格式为:
switch(表达式) 注意此表达式 ,不是条件表达式
{
case 取值1: case 的取值 就是表达式的取值
执行语句;
break; break 执行后就会调出switch语句
case 取值2:
执行语句;
break;
.........
default: default为缺省表达,即上述所有值不成立后,执行default下的语句。
执行语句;
break;
}
其中default中的break可以省略,因为执行到最后语句完成后就会跳出switch语句
每个case中的break,回事当前case满足的情况下跳出switch语句
switch(表达式),此处的表达式值接收4中类型的值,byte,short,int ,char
switch语句中,每个语句case 没有顺序之分,只有case中没有才会执行default,所以default可以放到语句中任何地方。
break的作用,先看一个例子:
class SwitchDemo
{
public static void main(String[] args)
{
int x =2;
switch(x)
{
default:
System.out.println("d");
case 4:
System.out.println("a");
case 6:
System.out.println("b"); break;
case 5:
System.out.println("c");
break; }
语句结果是 d a b
就是说如果case或者default满足结果,没有break,那么就会执行当前语句以及以下可以执行的语句,不再判断case,知道语句switch语句结尾或者碰到break语句。
if和switch区别
1)相同点:都可进行判断
2)不同点:1.if进行区间和具体数值的判断,程序简单 switch语句进行区间判断程序冗长
2.if判断boolean类型的值 switch判断byte short int char 型的值,不能判断boolean类型的值
3.if语句范围更广一些 switch语句范围窄一些
根据情况选择两种语句
数值不多,而且符合byte short int char 四种类型用switch语句进行编写,此时效率比较高
其他一般情况,对区间判断,对结果为boolean类型的判断,就用if语句,if范围更广