jdk是java开发工具包,里面包含了javac、jar、javadoc、java等工具,可以在bin目录中找到。有一个文件夹是jre,即jdk也包含了java运行环境。jre可单独安装,只是运行java程序。
jdk安装完之后还要设置执行路径,也就是把jdk/bin添加到执行路径中,所谓的执行路径是指操作系统搜索可执行文件的目录列表。p14
java中用到浮点数时大部分都是用double,因为float的7位有效数字在大部分情况下不能满足需要。float数字后面有一个F后缀,没有后缀的为double类型。p34
java没有内置的字符串类型,而是有一个预定义类String。p46
任何一个java对象都可以转换成字符串。p46
java中的字符串像数字一样不可修改。这样做可以共享字符串。p47
不能用“==”来判断两个字符串是否相等,这样做只是判断了两个字符串是不是放置在同一位置上。也就是说例如“zhangcaiwang“这样的字符串表达式的值是一个地址。从这一点来说,java中的字符串对象类似于C语言中的char[] *字符串指针。比如char[] * var = ”zhangcaiwang“。p48
java中的字符采样unicode编码,编码方式为utf-16,存储类型为char,占用两个字节。这其中,一个char变量表示一个代码单元,也就是表示单个字符的最小单位,代码点是字符的unicode值,有时候需要用两个代码单元表示,代码点的数量代表字符串实际长度。参考下面utf-8编码方式。p49
UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
因此UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的,位高低顺序也相同。 实际将UNICODE转换为UTF-8编码时应先去除高位0,然后根据所剩编码的位数决定所需最小的UTF-8编码位数。 因此那些基本ASCII字符集中的字符(UNICODE兼容ASCII)只需要一个字节的UTF-8编码(7个二进制位)便可以表示。
java中访问数组元素时下标不能超过(元素的个数-1)p79
与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。 p94
在java的源文件中只能有一个公共类,其他的类的个数不做限制。p107
构造器没有返回值。p110
如果在类的定义中放一些独立的代码块,那么这些代码块可以在构造类对象的时候被执行,可以用来初始化对象,但优先于构造器执行。p130
在java源文件中如果没有放置包名,则该源文件中的类将会放置在默认包中,默认包是一个没有名字的包。p137
如果子类的构造器中没有显式地调用超类的构造器则将自动地调用超类的默认构造器,如果超类没有默认的构造器则会编译出错,所以定义类时最好能写一个没有参数的默认构造器。p153
动态绑定步骤:前提是子类对象的引用赋给了父类变量。 p159
1.获取父类的类型和父类以及父类的父类中的签名列表。
2.如果子类中定义了符合该签名的方法则调用子类的方法,否则调用父类中符合签名的方法。
由上可看出如果把子类对象引用赋给了父类变量,那么该变量能够调用的方法一定是父类拥有的方法。
在将超类变量赋值给子类变量时要用instanceof判断一下是否能转换成功。p162
自动装箱规定boolean、byte、char<128,-127~128之间的int和short被包装到固定的对象中。也就是说用这些值进行自动装箱产生的对象是相同的,只需要用==进行比较是否相等即可。p188
允许将一个数组传递给可变参数方法的最后一个参数,此时可变参数只能接受一个该参数。p190
枚举类型中的类型其实是该类的一些实例,所以在创建新的枚举类型变量时其实就是把这些实例的引用赋给对应的变量,所以在对枚举类型的变量比较是否相等时用==就足够了,不需要使用equals()。p191
在反射中可以用newInstance()方法快速获取一个类的实例,比如xx.getClass().newInstance()。这个方法将调用对应类的默认构造器,如果没有默认构造器编译器会抛出异常。p194
java.lang.reflect包中有三个类用来分析类的能力,分别是Constructor,Field,Method,分别对应于分析构造器、域、方法。三个类都有一个getName方法返回项目名称,Filed还有一个getType方法返回描述域所属类型的Class对象,Method和Construct还有能够报告参数的方法,Method有可以报告返回值的方法,这三个类还有一个getModifiers的方法,该方法返回一个整数,用于描述修饰符。另外还可以利用该包中的Modifier类中的静态方法分析getModifiers方法返回的整数值。Modifier.toString把修饰符打印出来。p196
将一个类对象赋值给object类对象再转换过来是可以的,但是一开始就创建一个Object对象是不能转换成其它对象的。p206
建议java开发者不要使用Method对象的回调方法(invoke),使用接口进行回调会是代码的执行速度更快,更易于维护。p212
接口中所有的方法自动地属于public,所以不用添加关键字public。p216
接口中不能有实例域,也不能实现方法,提供实例域和方法实现的任务应该交给类。接口被称为接口而不是类,这应该就是接口和抽象类最本质的区别。p216
接口中的常量被自动地设置为public static final。p221
object类中clone方法只是对子类的各个域进行拷贝,拷贝的作用是对变量的内容进行复制,所以这个方法对对象中基本类型的克隆没有问题,但是对对象中对象实例域的克隆则是对对象引用的复制。这称为浅拷贝。p223
如果一个类能实现深度拷贝的功能则需要实现以下几点:
1.实现Cloneable接口;
2.调用Object类的clone方法:super.clone();
3.对于内容是对象变量的域,调用对象的clone方法对该对象域深度赋值,而这又要求该对象的类实现了深度拷贝功能。
在java的标准类库中,只有不到5%的类实现了clone方法,所以应该尽量避免使用clone方法。p226
匿名内部类没有构造器,因为构造器的名字要与类名一致,但是匿名内部类没有类名。 匿名内部类的构造器参数传递给超类的构造器。p242
匿名内部类的双大括号初始化技巧。p243
静态内部类对象除了没有对生成它的外围内部类的对象的引用特权之外,与其他所有内部类完全一样。只有内部类可以声明为static。p245
包装器类是final,不可被继承,同时也是不可变的,即一旦构造了包装器,就不允许改变包装在其中的值。p203.
对于可变参数方法,可变参数必须放在最后,相当于一个数组,在调用方法的时候,可以填充多个数组内容类型的值,也可以传递一个相同类型的数组,当传递数组的时候就不可以再填充其他值了。p206
反射是用来分析类的能力的一种技术,比如可以利用反射得到要分析的类的修饰符、类名、字段、方法、构造器等内容。而代理则是在运行时创建实现了一组接口的新类。
Proxy.newProxyInstance()把返回对象的引用传递给了一个Object变量。p248