java “速成” (待续)

注意事项

  • 安装jdk时要注意jdk和jre的安装目录,不要让jre的目录和jdk的目录重叠,否则jre文件将覆盖jdk文件,这样会找不到javac。

特点

  • java版本:
    * java SE:standard edition,桌面、服务器、嵌入式环境和实时环境;
    * java EE:enterprise edition,服务器端;
    * java ME:micro edition,移动设备和嵌入式设备;
  • 单根继承结构(P11)
  • 在java中类的名字必须和文件名相同。
  • java完全采用动态内存分配方式(也就是说java中的对象都位于堆区而非栈区,只有“引用”位于栈区P22,基本类型是特例),每当创建新对象时,就要使用new关键字来构建对象的动态实例。还有一点就是java在创建对象之后不用像C或C++(不使用智能指针)那样显式的删除。
  • java强迫程序员使用异常。
  • 在java中一切都被视为对象,我们操作的标识符实际上是对对象的一个“引用”,这里的“引用”与C++类似但不完全相同。
    * 如果仅仅向这样定义字符串s:String s;然后向s发送消息则会出错,因为这里s仅仅是一个引用,需要给s“绑定”一个对象之后才可以向s发送消息:String s = "hello word!";这里对字符串的初始化不是一种通用的方式,仅适用于java中的字符串。
    * 通用的对象创建方法:String s = new String("hello word!")
  • 为了效率,java中的基本类型像C/C++ 那样保存在栈中。java中基本类型的长度是确定的(所以java中没有sizeof关键字),不像C/C++那样只规定了最小长度。java中的基本数据类型如下:boolean, char (16bits), byte(8bytes), short(16bits), int(32bits), long(64bits), float(32bits), double(64bits),void。java中没有无符号概念
  • 基本类型也可以保存在堆中(P23,包装器类):Character ch = new Character('c')
  • java中的数组操作都有下标检测,对于基本数据类型的数组其内容与C类似但java会初始数组;对于非基本类型的java数组,java会创建一个“引用”数组,数组的每个成员都是引用,对于没有“赋值”的成员其值为关键字null。
  • java与C类似,变量都是块级作用域。在C中子作用域中的同名变量将覆盖父作用域中的同名变量,在java中这是不允许的。
  • 在java中对象的生命周期与作用域没有直接的关系,在C或C++中超过作用域的临时变量将自动销毁,但java不是这样的
  • 在java中字段会默认初始化;但非字段基本类型就不会默认初始化。在java如果变量没有初始化则无法通过编译。
  • java中方法只能作为类的一部分来创建,因为java是完全面向对象的。java中没有类似于C/C++中那样孤立的函数,java中的任意方法必然属于某一个类。
  • java和其他面向对象的语言(python、C#、JavaScript等)一样,其对象均是以引用的方式进行传递的(这称之为“别名现象”,除了基本数据类型是pass-by-value)。
  • java中也有C++中类似于名字空间的方式来解决名字冲突的问题:反方向使用自己的域名,举个例子:thinking in java的作者的域名为mindview.net,那么其所写的类的全称为:net.mindview.utillty.foibles(java2之前net为大写),注意这里将域名“颠倒了”。
  • java中引入其他类库的方法:import java.util.ArrayList;import java.util.*;。java.lang将默认导入每一个java源文件中。
  • java类中的static关键字性质与C++类似(均可以直接使用类名访问static成员),都是将方法与类关联而不是对象。当然了因为相同的原因,java中static对象不能使用没有指定对象的非static成员。
  • java中没有操作符重载,故在java中操作符一般只作用于基本类型。但 = == != 可用于所有对象。String支持+和+=。
  • java中当比较运算符应用于对象时其比较的是对象的引用而非对象内容(类似于比较的是指向对象的指针)。如果想比较两个对象的内容,应该使用对象中的方法:equals()。在类中equals默认比较引用,故一般我们需要覆盖它。
  • java中的逻辑运算符只能用于布尔值(|| && !,与C/C++的区别)。java中也有按位运算符,| & ^ 。
  • java中的移位:左移补零,右移补符号;byte、char、short移动之前先转化为int,且移位之后的返回值也是int,故一般移位之后需要转型(使用符合运算符也可以:short a = 9;a>>=8;;java中的类型转化与C类似:(char)123;普通的浮点转整型将直接截断小数部分,Math.rount可实现四舍五入)。>>>java特有的右移,无论正负,左侧均补零。java中移位的位数是有限制的,例如向左移位100位,java并不会真的移动100位,把100转化为二进制1100100,java只会移动00100位,即只有100的低5位有效(对于long型,低6位有效)
  • java中不同类型在一起运算时会自动类型提升,而返回值是最大的类型,故这种情况下需要对返回值进行类型转换。
  • java可以执行低类型向高类型的自动转化(在基本类型提升过程中char会被直接提升到int而不经过short,因为short无法包含所有的char值。),但高类型向低类型的转化(有损失精度的风险)必须显式指明。对于基本类型,java中的布尔型不能做任何类型转化,例如:int型是不能转化为布尔型的。
  • 在java与C++中低类型向高类型的转化是自动的,一般会转化为与之“距离”最近的高类型。因为java中不允许隐式的向下类型转化所以java中没有高类型数据重载低类型方法的问题,但在C++中有这种问题,例如在C++中有两个重载方法:T::test(short )和T::test(int),那么T::test(3.5)无法通过编译,因为编译器认为有歧义。
  • java中的布尔值只能测试其真假与取反,不能进行其他运算。
  • java中的直接常量:4L、5F、7D(可以是小写,分别表示long、float、double),16进制和8进制与C类似。因为java中没有无符号数据所以byte类型的数据的最大值为0x7f(最高位表示符号)。
  • java使用double来处理指数3e3,所有float a = 3e3;将出错,正确的写法为:float a = 3e3Fdouble a = 3e3;
  • java中唯一使用到逗号运算符(非逗号分隔符)的地方是for语句内。
  • java中的“range for”:for(float x:f)...
  • goto是java中的一个保留字但java中不使用goto,但java中的break和continue配合标签可以实现类似goto的功能(P71)。
  • java中的构造函数与C++概念一致。
  • java类中也有关键字this,注意java中没有指针的概念,过意通过this调用方法的语法使用“成员操作符 .”:this.***。可以认为在java中this表示当前对象(的引用)。
  • java中没有运算符重载,所以this(***)将直接调用当前对象的某个构造函数(在构造函数中调用构造函数),但构造函数的调用只能使用一次并且必须放在起始处。
  • java中的垃圾回收器只能回收使用new关键字创建的资源,非使用new创建的资源需要使用java中的“析构”函数finalize()清理。java中没有C++中析构函数的概念,我们不能确定一个java对象什么时候“消失”,这一切由java垃圾回收器决定,如果垃圾回收器一直没有运行(内存使用不紧张)那么你最初创建的一个对C++而言是临时变量的对象可能会在程序退出的时候才被清除。finalize()是垃圾回收器在清除一个对象之前调用的一个方法。finalize()使用的场景十分特殊(不像C++那样普通)。在java中一般只有在java中嵌入C/C++或其他语言并请求了资源的时候才可能会用到finalize()P88
  • java中垃圾回收器:自适应的、分代的、停止-复制、标记-清扫 P91。java中的垃圾回收器并非使用引用计数的技术,因为自引用问题难以解决;java中一般使用停止-复制法:从栈中找到所有"引用链",引用链指向的对象必然“活着”,其他对象必然已经失效,然后再对象重排过程中不再复制这些对象。
  • java类中的数据成员的初始化与C++11类似,即在声明的时候赋初值,java没有构造函数初始化列表,java的初始化列表被系统“默认运行”。
  • 字段的初始化必然早于构造函数,构造的顺序只与字段的声明顺序有关,但静态对象要早于非静态对象
  • java类中的静态变量只有在使用的时候才会被初始化(这点与java类中的字段有区别,字段一定会被初始化),而且只会被初始化一次。
  • java中的构造器默认是静态方法(static),当创建一个对象时java解释器会通过构造函数找到类文件路径P96(java对象创建过程)。
  • java中的显式静态初始化:静态子句(“静态块”)P96;非静态实例初始化(没有static关键字)P9。

数组

  • java中定义数组的方式有两种:int[] a;类似C的形式:int a[];。在声明java中的数组名时是不能指定数组大小的,数组大小要在使用new关键字创建数组时指定(int[] a=new int[9];),所以java中的数组不是定义在栈中而是在堆中。java中数组的赋值只是数组引用之间的赋值。java中的数组可已使用花括号初始化:Interger[] a={new Interger(1),2};或者:Interger[] b = new Interger[]{new Interger(1),2}

语言之外的特性

  • 注释,java有很好的注释规则,javadoc可以提取注释来生成html文档,这些注释有固定的规则P32 2.8
  • java规定类名使用“驼峰“命名规则;字段、方法和引用亦使用“驼峰法”,只是首字母小写。

新的名词

  • 字段:数据成员
  • 方法:成员函数

常用类

  • BigInteger,任意精度整数
  • BigDecimal,任意精度定点数

7/31 P92

posted @ 2016-07-28 22:33  jiahu  阅读(390)  评论(0编辑  收藏  举报