关键术语
- 简单性 剔除了部分C++的复杂结构,如头文件,指针运算,操作符重载等
- 面向对象 封装、继承、多态,其中与C++主要不同在于多继承,java取而代之的是接口概念
- 健壮性 能够检测编译错误和运行时错误
- 跨平台 实质是虚拟机不跨平台——java代码被编译成与平台无关的字节码文件,在适配当前系统的虚拟机中被解释执行(不直接接触系统),不会生成新的文件。代价是解释执行字节码效率较低,不过虚拟机经过不断优化性能已经提升,且它还有监控经常执行的代码并优化以提高速度,比如知道当前哪些类已经加载,可以消除部分函数调用(内嵌,前提是特定的函数不被覆盖)
- 可移植性 java中数据类型有固定的大小,消除了字节顺序的困扰。字符串是标准的Unicode格式存储的。如java中int永远为32位的整数,而C++中可能是16位,32位整数,也可能是处理器厂商指定的大小。
以上未完...
基本常识
java文件
- 类名首字母大写,驼峰命名法
- 源码文件名必须与公共类名字相同,一个文件中有且仅能有一个public class。但可以拥有多个class,其访问权限为包权限,如果一个文件中只有class,那么文件名命名为其中任意一个名字即可,不过这样不容易维护。这里补充一下java中访问修饰符的用法:
public: 最简单,所有类可见;
private:最简单,同一类内可见,但不能修饰外部类;
default:成员在同一包内可见,在包外不可见
protected:成员在同一包内可见,在包外仅子类中可见(子类能访问继承来的方法但不能访问父类实例的方法),不能修饰外部类
java数据类型
- byte = 8 bit,int 4 byte, short 2 byte, char 2 byte, long 8 byte,float 4byte, double 8byte,boolean 1byte, java中所有数值类型所占的字节数和平台无关
- long型有后缀L, 16进制数有一个前缀0x,8进制数有前缀0,显然8进制语法比较容易混淆,尽量不要采用8进制。
- 从java7开始,加上前缀0b即可表示二进制,也可以为数字加下划线,如1_000表示1000,仅为了提升易读性,对编译无影响
- 浮点类型float占据4字节,double占据8字节,即精度为float的两倍(尾数更长),java中小数默认为double类型,也可以在数尾添加D如3.14D,若表示float类型则在数字后面加F
- char类型用于表示单个字符通常表示单个字符,嗯字符集中的单个字符,这里补充一点,所有的字符集本质都是赋予每个字符一个字符编号,存储时候将字符编号转换成二进制编码即可。最原始的字符集是ASCLL编码,各个国家都有自己的字符集,因为同样的编号在不同的编码方案下可能对应不同的字符,且不同的字符集其编码长度也可能不同,这就造成了严重的兼容性的问题,所以后来才有了Unicode字符集,占两个字节(65535个编号),为世界上所有语言符号都进行了编码,java字符集就是Unicode,所以可以表示各种洋文。由于计算机保存的是字符对应的编号,所以char类型可以直接作为整型值来使用,相当于一个16位的0~65535的无符号整数
字符型有三种表示形式:
1.单个字符'a','9','0'等等;
2.转义字符表示特殊字符类型如'\n','\t'等;
3.直接用Unicode值表示字符型值,如'\u9999'
他们的本质都是Unicode值,存储时变成二进制码。
char achar = 'a';
char enterChar = '\r';
char ch = '\u9999';
char zhong = '好';
int hao = zhong;
char c = 97; //0~65535之内的整数可以这么赋值。
- C++中数值或指针可以表示boolean值,0相当于false, 非0值相当于布尔值true
变量间的运算
- 自增减运算
n++; 因为改变了变量的值,所以操作数不能是数字,如4++就是错误的。
前缀形式和后缀形式的区别在于前缀方式先进行+1运算,后缀方式先使用变量原来的值。 - 逻辑运算符号&&和||都是采用短路的方式,如果第一个表达式已经能确定整体表达式的值,第二个操作数就不用计算。&和|的运用方式类似,只是不采用短路机制
- 三元表达式condition?expression1:expression2;
- & 与,| 或,^ 亦或, ~ 非。中前两个运算方式已经提到过,放在数值上讲就是&运算位都为1,数值才为1;|运算位有一个为1就为1,^运算位相同取0,不同取1;~运算位为1取0,位为0取1;
- '>>和<<运算符将二进制位右移或者左移。>>>用0填充高位,>>用符号位填充高位,没有<<<运算符。
- 数据类型转换的原则为:不同类型数值需要先转换成同一类型才能进行计算,有double时都会转化为double,否则有float时候都会转化为float,否则有long时另一个操作数就为long,否则都是int。强制类型转换不会进行四舍五入,如果想要进行四舍五入,就要用Math.round方法,其返回值为long。如果强制转换为一个类型时,超出了目标类型的表示范围,就会产生截然不同的值,如(byte)300实际为44.
- 运算符优先级,如果没有括号,按照优先级运算,同一个级别运算符按照从左到右次序运算,但右结合运算符除外,比如+=
字符串
字符串就是Unicode字符序列,它们是标准java类库中的一个标准类String的实例.
- substring(index1,index2)方法提取字符串。从index1到index2之前的一个位置
- 当字符串与一个非字符串的值进行拼接时候,后者被转换成字符串,任何一个java对象都可以转换为字符串
- 检查字符串是否相等,用s.equal(t)方法,如果判断是否相等且不区分大小写,则用equalsIgnoreCase方法。不要用==运算符检测是否相等,这是确定两个字符串是否在同一个位置上(虽然这样也必然相等,但有可能内容相同的不同字符串的拷贝放在不同位置上)。
- 检查一个字符串时不时空串可以用if(str == null)
控制流程
- break用于跳出当前循环体,continue用于跳到当前循环首部;
- 可以使用带标签的break在多重循环中跳转
label:
while(condition) {
for(conditions) {
if(condition) break label;
}
}
如果有误,则跳转到标签末尾,其实这种机制也可以用在任何语句中,不仅仅是循环语句。
数组
- 创建数组并初始化三种方式
int[] arr1 = {1,2,3};//静态初始化一
int[] arr2;
arr2 = new int[] {1,2,3};//,静态初始化二,显示初始化并赋值
int[] arr3;
arr3 = new int[3];//显示初始化并赋予默认值
- 上述三种方式的区别:第一种在声明数组变量的时候就分配空间并赋值,声明和分配空间是不能分开写的;第二种和第三种声明和分配内存是分开的,两者区别在于赋值不同。对于引用类型数组,内部存储的实际是对象的引用地址。
- 对于数组的定义,初始化时用new与不用new 没区别,只是两种方式罢了,因为数组是引用数据类型,建立对象时,无论用不用new,都会分配空间,数组实体都是放在堆内存中,引用变量放在栈内存。这点不同于String类,String由于实现了常量池 所以new 和不new 有区别:new的话,引用变量指向堆区。不new的话,引用变量指向常量池。
- 创建数组时候,会默认初始化元素,数字元素初始化为0,boolean数组元素为false,对象数组则初始化为null。
- 创建后就不能改变数组大小,如果需要,就要使用arraylist
- 将数组中的所有值拷贝到一个新数组中,一般可以使用Arrays.copyOf方法
int[] forturNumbers = Arrays.copyOf(luckyNumbers,luckyNumbers.length);
//第二个参数是新数组的长度,这个是可以改变的,故此方法可以
- for each循环的结构为:
for(int element : array){
do something about element;
}//其中array必须是一个数组或者实现了Iterable接口的对象
- java程序的main方法接受一个命令行参数,在控制窗口中的命令为:java ClassName command line parameter
- Arrays类中提供了sort方法为数组排序,其实现是快排
- 二维数组可以看成是元素为数组的数组,其使用方法和一维数组类似,double[][] arrays = new double[row][column]; 也可以进行静态初始化,如:
int[][] magicSquare = {
{1,2,3},
{4,5,6},
{7,8,9}
}
- 遍历二维数组需要使用两层for循环或者两个for each循环
for(double[] row : a)
for(double value : row)
do something about value;
想要快速打印一个二维数组可以使用System.out.println(Arrays.deepToString(a));
网友评论