田园牧歌桃源乡

柔风,细雨,黛码,好时光

Latest

Java学习笔记之十 继承

继承,inheritance。利用继承,人们可以基于已经存在的类构造一个新类。 继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加新的方法和域。 反射,reflection。反射,指在程序运行期间发现更多的类及其属性的能力。 类、超类、子类 class Manager extends Employee { ... } is-a关系是继承的一个明显特征。 关键字extends表示继承。 在Java中,所有的继承都是公有继承。 关键字extends表明正在构造的新类派生于一个已经存在的类。已存在的类被称为超类,superclass、基类,base class,或父类,parent class。新类被称为子类,subclass,派生类,derived class,或孩子类,child class。 如果需要调用超类的方法,可以使用关键字super。 super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。 在子类中可以增加域、增加方法或覆盖(override)超类的方法。

Java学习笔记之九 对象与类

面向对象程序设计概述 在20世纪70年代,流行“结构化”过程化程序设计开发技术。 在20世纪末,面向对象程序设计成为主流的程序设计范型。 面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。 程序中的许多对象来自于标准库,还有一些是自定义的。 是自己构造对象,还是从外界购买对象,完全取决于预算和时间。 从根本上说,只要对象能够满足要求,就不必关心其功能的具体实现过程。 结构化程序设计通过设计一系列的过程(算法)来求解问题。这些过程一旦被确定,就要考虑存储数据的方式。所以,Pascal语言设计者Niklaus Wirth说:算法+数据结构=程序。(他1975年发布的书名)。这里,算法是第一位的,数据结构是第二位的。 面向对象程序设计中,数据被放在了第一位,之后再考虑操作数据的算法。 类(class)是构造对象的模板或者蓝图。由类构造(constuct)对象的过程称为创建类的实例(instance)。 用Java编写的代码都位于某个类的内部。 封装(encapsulation,有时称为数据隐藏)是与对象有关的一个重要概念。对象中的数据称

Java学习笔记之三十三 括号与运算符级别

运算符有优先级。 如果不使用圆括号,则按运算符优先级次序进行计算。 除了右结合运算符外,同一个级别的运算符按从左到右的次序进行计算。 Java不使用逗号运算符,但在for语句中,可以使用逗号分隔表达式列表。 运算符 结合性 [ ] . ( ) (方法调用) 从左向右 ! ~ ++ -- + (一元运算) () (强制类型转换) new 从右向左 */ % 从左向右 + - 从左向右 << >> >>> 从左向右 < <= > >= instanceof 从左向右 == != 从左向右 & 从左向右 ^ 从左向右 | 从左向右 && 从左向右 || 从左向右 ?: 从右向左 = += -= *= /= %= &= |= ^= <<= >>

Java学习笔记之三十二 强制类型转换

在Java中,允许没有信息丢失的数值类型的转换。 有时候,需要将double类型转换为int类型。这种情况可能会丢失一些信息。这种转换需要通过强制类型转换来实现。 强制类型转换:cast。 强制类型转换的语法是在圆括号中给出想要转换到的目标类型,后面紧跟带待转换的变量名。 例如: double x = 9.997; int nx = (int)x; // x is 9 强制类型转换通过截断小数部分将浮点数转换为整型。 如果需要对浮点数舍入,则需要用Math.round方法。 double x = 9.997; int nx = (int) Math.round(x); // nx is 10 不要再boolean类型和任何数值类型之间进行强制转换。 极少数情况下,需要将布尔类型转换为数值类型,可以使用条件表达式:b ? 1 : 0。

Java学习笔记之三十一 数值类型之间的转换

在程序运行时,经常需要将一种数值类型转换为另一种数值类型。 数值类型之间的合法转换: 实线箭头表示无信息丢失的转换。虚线箭头表示可能有精度损失的转换。 在两个数值进行二元计算时,会将两个操作数转换为同一种类型,再行计算。 * 两个操作数,其一为double类型,另一个会转换为double类型。 * 否则,其一为float类型,另一个会转换为float类型。 * 否则,其一为long类型,另一个会转换为long类型。 * 否则,两个操作数都被转换为int类型。

Java学习笔记之三十 数学函数与常量

Math类包含了各种各样的数学函数。 一些数学函数: * Math.sqrt 平方根 * Math.pow 幂运算 * Math.sin 三角函数 * Math.cos 三角函数 * Math.tan 三角函数 * Math.atan 三角函数 * Math.atan2 三角函数 * Math.exp 指数函数 * Math.log 对数函数。指数函数的反函数。 这些方法都是Math类的静态方法。或者被称为类方法。 一些数学常量 * Math.PI 近似值 * Math.E 近似值 这些变量时Math类的静态变量。或者被称为类变量。 从JDK 5.0开始,不必在数学方法名和常量前面添加前缀Math.。只要在源文件顶部导入Math类即可。 import static java.lang.

Java学习笔记之二十七 自增运算符和自减运算符

对数值变量进行加一和减一的运算。 这两个运算符改变了变量的值,因此它的操作数不能是数值。 这两个运算符有两种形式:前缀形式和后缀形式。 前缀形式将运算符放在操作数的前面。++n 后缀形式将运算符放在操作数的后面。n++ 在表达式中,前缀方式先进行+1运算,后缀方式使用变量原来的值。 不要再其他表达式内部使用++,会造成误解和困惑。 int m = 7; int n = 7; int a = 2 * ++m; // now m is 8, a is 16 int b = 2 * n++; // now n is 8, b is 14

Java学习笔记之二十六 浮点数算术精度问题

在Java中,double类型的数值采用64位存储。 在一些处理器中,使用80位的浮点寄存器。 这些寄存器增加了中间过程的计算精度。 这样导致的一个结果是,与一些64位浮点寄存器的机器的计算结果不同。 默认情况下,Java虚拟机设计者允许对中间计算结果采用扩展的精度。 对使用strictfp关键字标记的方法,必须使用严格的浮点计算。 如果将一个类标记位strictfp,则这个类中的所有方法都要执行严格的浮点计算。 实际的计算方式,依然取决于处理器。