开发细节
一个源文件最多只能有一个public类,但其他类不受限制.
如果源文件包含一个public类,则文件名必须按该类名命名.
一个源文件中最多只能有一个public类.其他类的个数不限,也可以将main方法写在非public类中,然后指定运行非public类,这样入口方法就是非public的main方法.
文档注释:
//javadoc标签 /** * @author * @version */ //命令行 //javadoc -d 文件夹名 -xx -yy Demo.java javadoc -d d:\\temp -author -version Demo.java
代码规范:
- 类、方法的注释,要以javadoc的方式来写。
- 非Java Doc的注释,往往是给代码的维护者看的,着重告诉读者为什么这样写,如何修改,注意什么问题等。
- 运用tab操作,实现缩进,默认整体向右边移动,用shift+tab整体向左移
- 运算符和 = 两边习惯性各加一个空格。
- 源文件使用utf-8编码。
DOS原理
Dos系统:
- 接受指令
- 解析指令
- 执行指令
相对路径:从当前目录开始定位,形成的一个路径
绝对路径:就是完整路径,从顶级目录例如D:\开始定位,形成的路径
常用dos命令:
查看当前目录是有什么内容:dir
dir
dir d:\abc\test100
切换到其他盘下:cd
cd /D d:
切换到D盘切换到当前盘的其他目录下(使用绝对路径和相对路径演示)
cd d:\abc2\test200
cd ..\..\abc2\test200
切换到上一级:
cd ..
切换到根目录:
cd\
查看指定的目录下所有的子级目录:
tree
清屏:
cls
退出:
exit
md[创建目录],rd[删除目录],copy[拷贝文件],del[删除文件],echo[输入内容到文件],move[剪切]
基本类型
变量
- 变量必须先声明,后使用,即有顺序。
- 该区区域的数据/值可以在同一类型范围内不断变化。
- 变量在同一个区域内不能重名。
- 变量三要素:变量名,值,数据类型。
+号的使用
- 当左右两边都是数值型,则做加法运算。
- 当左右两边有一方为字符型,则做拼接运算。
- 运算顺序是从左到右的。
System.out.println(100+98);//198
System.out.println("100"+98);//10098
System.out.println(100+3+"hello");//103hello
System.out.println("hello"+100+3);//hello1003
数据类型
基本数据类型:数值型:整数类型:
byte[1] \ short[2] \ int[4] \ long[8]
基本数据类型:数值型:浮点类型:
float[4] \ double[8]
基本数据类型:字符型:
char[2],存放单个字符’a’
基本数据类型:布尔型:
boolean[1]
引用数据类型:类(class)、接口(interface)、数组([ ])
注:【2】表示存放两个字节
整型细节
Java的整型常量默认为int,声明long型常量须后加”l“或者”L“
int n1 = 1;//4个字节 int n2 = 1L;//不对的 long n3 = 1L;//对的
Java程序中变量常声明为int。
计算机中最小存储单位:bit。计算机中基本存储单元:byte。一个byte=8个bit。
浮点数细节
浮点数 = 符号位+指数位+尾数位
Java的浮点型常量默认为double,声明float型常量须后加”f”或者“F”
float n1 = 1.1;//不对的 float n2 = 1.1f;//对的
通常使用double。
浮点型使用陷阱:2.7和8.1 / 3 比较
后者结果是2.6999999997,是以精度显示的。
所以当我们对运算结果是小数的进行相等判断时,要小心
double num11 = 2.7; double num12 = 8.1 / 3; //2.7 System.out.println(num11);//2.7 System.out.println(num12);//接近2.7的小数,而不是2.7 //错误写法 if( num11 == num12) { System.out.println("相等"); } //正确的写法: if( Math.abs(num11 - num12) < 0.000001 ) { System.out.println("差值非常小,到我的规定精度,可以认为相等."); } //细节:如果是直接查询得到的小数或者直接赋值,是可以判断相等
字符型细节
字符常量是用单引号括起来的单个字符.
Java允许使用转义字符’\‘来将其后的字符转变为特殊字符型常量. 例如: char c3 = ‘\n’; 表示换行符
在java中,char的本质是一个整数,在默认输出时,是Unicode码对应的字符.
char c1 = 97; System.out.println("c1"); //a char c2 = 'a'; System.out.println((int)c2); //输出'a' 对应的 数字 System.out.println('a' + 10); //107
//测试 char c5 = 'b' + 1; //98+1 == 99 System.out.println((int)c5); //99 System.out.println(c5);//99对应的字符 c
字符类型本质:
字符型存储到计算机中,需要将字符型对应的码值(整数)找出来,比如’a’ 存储 ==> 码值97 ==> 0110 0001
ASCII编码表是一个字节表示,一个128个字符,实际上一个字节可以表示256个字符,只用128个.
Unicode编码表 固定大小的编码 使用两个字节来表示字符,字母和汉字统一都是占用两个字节.
utf - 8 编码表.大小可变的编码字母占一个字节,汉字使用3个字节.(表示的汉字更多)
gbk编码表,字母占一个字节,汉字占2个字节.
数据类型自动转换
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算.
(byte , short)与char 之间不会相互自动转换.
//当把具体数赋给byte时,先判断该数是否在byte范围内,如果是就可以 byte b1 = 10; //对,-128~127 int n2 = 1;//n2 是int byte b2 = n2;//错误,原因:如果是变量赋值,先判断类型 char c1 = b1;//错误,原因:byte不能自动转成char
byte, short, char 他们三者可以计算,在计算时首先转换为int类型.
byte b2 = 1; byte b3 = 1; short s1 = 1; short s2 = b2+s1;//错误,b2 + s1 => int //只要出现byte\short\char都会转换成先int再计算 byte b4 = b2 + b3; //错误:b2 + b3 => int
自动提升原则:表达式结果的类型自动提升为 操作数中最大的类型.
强制类型转换
使用时,要加上强制转换符( ),但可能造成精度的损失!!!
强转符合只针对最近的操作数有效,往往使用小括号提升优先级
int x = (int)10*3.5*6*1.5;//编译错误:double -> int int x = (int)(10*3.5*6*1.5); //44
基本数据类型和String类型的转换
基本类型转String类型
String类型转基本数据类型
通过基本类型的包装类调用parseXX方法
运算符
// / 除法的使用
System.out.println(10 / 4); // 2
System.out.println(10.0 / 4);//2.5
double d = 10 / 4; //2.0
// % 取模,取余
// 在 % 的本质 看一个公式 a % b = a - a / b * b
//当a是小数时, 即公式 = a - (int)a / b * b
System.out.println(10 % 3); //1
System.out.println(-10 % 4);//-1
System.out.println(10 % -3);// 1
System.out.println(10 % 4);// -1
// ++的使用
// ++作为单独语句使用都是 i = i + 1;
// ++作为表达式使用:前++ : ++i先自增后赋值/后++ : i++先赋值后自增
int i = 1;
i = i++;
System.out.println(i);
//java规则使用到了临时变量:(1)temp = i;(2)i=i+1;(3)i=temp;
1. result = 59 / 7 // 8
result = 59 % 7 // 4 8个星期4天
2. double huas = 234.5;
double ss = 5/9*(234.5-100);
逻辑运算符
&& 和 & 使用区别
- &&短路与: 如果第一个条件为false, 则第二个条件不会判断,最终结果为false, 效率高.
- & 逻辑与: 不管第一个条件判断是不是false,第二个条件还是会判断,效率低.
- 开发中,我们使用短路与&& ,效率高
|| 和 |使用区别
赋值运算符
复合赋值运算符会进行类型转换.
byte b = 3;
b += 2;//b = b + 2; 实际上真正等价于 b = (byte)(b + 2);
b++;// 等价于 b = (byte)(b + 1);
//如果直接写
b = b + 2;//是错误的,类型是int型
三元运算符
条件表达式 ? 表达式1 : 表达式2;
运算规则:
如果条件表达式为true, 运算后的结果是表达式1;
如果条件表达式为false, 运算后的结果是表达式2;
口诀: 一真大师
int a = 10;
int b =99;
int result = a > b? a++:b--
//条件表达式为假/运行b--
//结果为:先返回b的值,然后在 b-1
//返回结果为99
细节:
表达式1和表达式2要为可以赋给接收变量的类型(或自动转换)
int a = 3; int b = 8; int c = a > b? 1.1 : 2.3//语法错误 int c = a > b? (int)1.1 : (int)2.3//可以的 double d = a > b? a : b + 3;//可以的,满足int -> double
三元运算符是一个整体
Object obj1 = true? new Integer(1) : new Double(2.0); System.out.println(obj1); //输出的是1.0,而不是1 //注意三元运算符是一个整体,会优先转换成最高精度的类型,再计算输出等
三元运算符可以转换从if(…)else 语句
//实现三个数的最大值 int n1 = 553; int n2 = 33; int n3 = 123; //思路 //1.先得到 n1 和 n2 中最大数,保存到 max1 //2.然后再 求出 max1 和 n3中的最大数,保存到 max2 int max1 = n1 > n2? n1 : n2; int max2 = max1 > n3? max1 : n3; System.out.println("最大数=" + max2);
四种进制
二进制, 满2进1. 以0b或0B开头.
//二进制转换成八进制
//从低位开始,将二进制数每三位一组,转成对应的八进制数即可
//二进制转换成十六进制
//从低位开始,将二进制数每四位一组,转成对应的十六进制数即可
十进制, 满10进1.
//十进制转换成二进制
//将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
//十进制转换成八进制
//将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
//十进制转换成十六进制
//将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
八进制, 0-7, 满8进1. 以数字0开头表示.
//八进制转换成十进制
//从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,求和
eg:0234转成十进制的数
0234 = 4*8^0 + 3*8^1 + 2*8^2 =
4 +24 +128 =156
//八进制转换成二进制
//将八进制数每1位,转成对应的一个3位的二进制数
十六进制, 0-9及A-F, 满16进1. 以0x或0X开头表示
//十六进制转换成十进制
//从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,求和
eg:0x23A转成十进制的数
0x23A = 10*16^0 + 3*16^1 + 2*16^2 = 570
//十六进制转换成二进制
//将十六进制数每1位,转成对应的一个4位的二进制数
原码\反码\补码
- 二进制的最高位(最左边)是符号位: 0表示正数, 1表示负数(老韩口诀:旋转90° 0 -> 0 1 -> -)
- 正数的原码, 反码, 补码都一样(三码合一)
- 负数的反码 = 它的原码符号位不变, 其他位取反(0 -> 1, 1 -> 0)
- 负数的补码 = 负数的反码 + 1, 负数的反码 = 负数的补码 - 1
- 0的反码,补码都是0
- java没有无符号数,换言之, Java中的数都是有符号的
- 在计算机运算的时候, 都是以补码的方式来运算的
- 当我们看运算结果的时候, 要看他的原码(!!!)
位运算符
7个位运算符(& , | , ^ , ~ , >> , << , >>>)
按位与&
按位或 | : 两位中有一个为1,结果为1
按位异或^ : 两位不同时为1, 相同为0
算术右移 >> :低位溢出, 符号位不变, 并用符号位补溢出的高位 (如果是正数的话 本质是右移几位就除几次2)
算术左移 << :符号位不变, 低位补0 (如果是正数的话 本质是左移几位就乘几次2)
逻辑右移也叫无符号右移 >>> : 低位溢出, 高位补0
经典面试题
//计算 -10.5%3 = ?
//a % b 当a是小数时,公式 = a - (int)a/b*b
//-10.5%3 = -10.5 - (-10)/3*3 = -10.5 + 9 = -1.5
//注意: 有小数运算,得到结果是近似值
System.out.println(-10.5%3);
程序流程控制
switch
- switch 关键字, 表示switch分支
- 表达式 对应一个值
- case 常量1: 当表达式的值等于常量1, 就执行 语句块1
- break: 表示退出switch
- 如果和case 常量1匹配, 就执行语句块1, 如果没有匹配, 就继续匹配case 常量2
- 如果一个都没有匹配上, 执行default
switch细节
表达式数据类型, 应和case后的常量类型一致, 或者是可以自动转成可以相互比较的类型, 比如输入的是字符, 而常量是int
char c = 'a'; switch(c){ case 20 : System.out.println("ok"); break; case 'a': System.out.println("ok1"); default : System.out.println("ok2"); }
switch(表达式)中表达式的返回值必须是:(byte, short, int, char, enum[枚举], String)
case子句中的值必须是常量, 而不能是变量
default子句是可选的
break语句是用来在执行完一个case分支后使程序跳出switch语句块, 如果没有写break, 会出现穿透现象(程序会顺序执行到switch结尾)
return
当return用在方法时, 表示跳出方法, 如果使用在main, 表示退出程序
谁调用(接收), 就返回给谁
int returnRes = p1.getSum(10,20);
//把方法 getSum 返回的值 ,赋给 变量 returnRes