一、Java的基本程序设计结构
类名一大写字母开头,若由多个单词组成则每个单词的第一个字母都应该大写。
源代码的文件名必须与公共类名字相同,并用.java作为扩展名。
编译得到字节码文件(存为.class文件于源文件同目录下),JVM对字节码文件进行解释。
Java1.4之后强制man方法必须是public。
静态函数只能访问静态函数。
Java有一个能够表示任意精度的算数包,“大数”,是一个Java对象。
长整型数值有L或者l后缀。十六进制有一个前缀0x或者0X,八进制有一个前缀0,二进制前缀为0b或0B
Java没有任何无符号的int、long、short、byte。
float有效位6~7,double有效位15位。float后缀为F或f,不带后缀默认为double。
可以用十六进制表示浮点数值,尾数采用十六进制,指数采用十进制,基数是2。
Double_POSITIVE_INFINITY、Double_NEGATIVE_INFINITY、Double.NaN(不是一个数字)。
不能用x==Double.NaN判断x是不是非数值,因为所有的非数值都认为是不同的,不过可以用Double.isNaN(x)。
由于在二进制系统中无法精确的表示十分之一,因此无法做到永远精确。
转义字符\u可以出现在双引号的字符串或字符常量之外(而其余所有转移序列都不可以)。
码元:字符的完整代码值。基本字符的码元由一个代码单元组成,辅助字符由一对代码单元组成。
整数型和布尔值不能相互转换。
Java中标识符可以是任何Unicode。
变量的声明尽可能的靠近变量第一次使用的地方。
从Java开始,对于局部变量,如果可以从变量的初始值就能推断其类型则无需声明类型,用var关键字,只能用于方法中的局部变量,参数和字段的类型必须声明。
final定义时必须赋值,static不必,凡是和static相关的都是类层面,而非对象层面。
Java中必须用final定义常量,static final 类常量。
特殊值null指变量没用设置任何值。
“/”,操作数都是整数,整数乘法,否则表示浮点除法。整数除0是异常,浮点数除0是无穷大或者NaN。
用strictfp修饰main则main方法中的所有指令都有严格的浮点计算(并不是指准确,而是不损失精度)。
pow的参数与返回值都是double。
默认小数转整形是截断,若四舍五入则用round函数,但是返回值是long,若需要int仍需转换。
如果运算符得到一个值,其类型与左侧操作数不一致,则会发生强制转换(向左)。
&&和||都是短路运算符,&和|。
>>>用0填充高位,>>用符号位填充高位。
任何一个Java对象都可以转换为字符串,字符串与非字符串进行拼接,后者会转换为字符串。
String不能修改某个字符,只能修改引用。
不能用==运算符检测两个字符串是否相等,这个运算符只能确定两个字符串是否在同一位置,当然如,如果在一个位置上,必相等,但是也存在值相当但是位置不同,因此不能仅仅依靠位置进行检测。
只有字符串字面量是共享的,而+或者substring等操作得到的字符串并不共享。
空串是一个Java对象,串长度为0,内容为空,而null表示没用任何对象与该变量关联。
Scanner in = new Scanner(System.in)。
printf中参数索引从1开始。
向文件写入时若文件不存在则创建文件。
不能再嵌套的两个块中声明同名的变量。
Java没有goto语句,但是有带标签的break语句,可以在任意语句中使用。
case标签可以是char、int、short、long、枚举、字符串字面量。
switch使用枚举常量时无需再指明枚举名。
知道数组元素创建(多维)数组对象并同时提供初始值的简写形式:int [] a={1,2,3};
用声明匿名数组来为数组重新初始化:a = new int[] {1,2,3,4} ;
for each 格式 for(variable:collention) statement
用Arrays.toString打印数组所有值更方便。
Java等号都是浅拷贝,深拷贝是copyof方法,copyOf(array,length)。
可以利用copyof方法增加数组大小,a = Arrays.copyOf(a,a.length*2),多出的长度为元素默认值。
Arrays.sort()采用快速排序。
Math.random返回一个0~1的浮点数,按需求乘以n即可。
多维数组底层每一维之间并不连续,因此可以单独访问每一行,所以可以让两行互换。
二、对象与类
对象变量就是引用变量,用于引用对象本体。
Java的对象都储存在堆中
更改器:改对象本身。访问器:改引用。
对象数组使用方式:
Employee[] staff = new Employee[3];
staff[0]=new Employee("jack");
一个源文件中有几个类编译后就会生成几个类文件。
每个对象默认有一个无参构造器,但是一旦自定义有参构造器,则自带的无参构造器失灵,需要显示定义一个无参构造器。
构造器没有返回值,权限没有限制。
一个方法有两个参数,隐式参数和方法名后方括号中的数值。隐式参数代表本对象(因此static方法不能使用this)。
静态方法只能访问静态字段,因为静态方法不属于任何一个对象。
静态方法可以用对象调用也可以用类名调用。
静态变量常被使用于工厂方法。
工厂方法适用条件:(1)无法命名构造器,构造的类与名字不同。(2)无法改造对象的类型。
如果需要返回以一个可变对象的引用,需要对其进行克隆。(书页码P113)
同一类的方法可以访问任何同类对象的私有字段。
每个类都可以有一个main方法,可以通过java+类名进行单元测试。
Java总是值传递,可以改变实参引用指向的对象的值,但是不能改变实参引用的对象。
方法名+参数类型为方法的签名,返回值不是签名的一部分。
显示字段初始化,如果一个类的所有构造器都希望把某个特定的字段设置为同一个值,将会很方便,不用再每次调用构造函数时传入同一参数。
构造器中可以用this调用另一个构造器
初始化块,只要构造这个类的对象就会被执行。
构造器具体步骤,若调用另一个构造器,则先执行第二个构造器,否则初始化所有字段为默认值,再按照顺序初始化所有字段初始化方法和初始化块最后执行构造器主体代码
如果类的静态字段需要很复杂的初始化代码可以用静态的初始化块
一个类可以使用所属包的所有类,自己其他包的公共类
只能用星号导入一个包
第五章 继承
super表示父类 并不是对象的引用 因此不能将其赋值给另一个变量
使用super构造器必须是子类构造器的第一条语句,如果子类的构造器没有显式的调用超类的构造器,将自动地调用超类的无参构造器,若超类中没有无参构造器,子类中又没有显式的调用有参构造器则会报错。
this构造和super构造不能同时出现
一个对象变量可以指向多个实际类型叫做多态,父类引用子类 因为子类一定属于父类
替换原则,程序中任何出现父类的地方都可以被子类替换。
子类引用的数组可以转换为父类引用的数组,且无需强制转换。
private static final 编译器可以知道具体调用哪个函数静态绑定