java 核心技术精简总结知识点

来源:互联网 发布:java手机api 编辑:程序博客网 时间:2024/05/17 07:01
1.  Java没有任何unsigned类型
2.  float类型的数值后面有一个后缀F,没有后缀F的浮点数默认为double类型
3.  if(x = 0)在C++中可以编译通过,其结果总为false,而在Java中,整数表达式x = 0不能转化为布尔值
4.  不能使用一个未被初始化的变量
5.  使用strictfp关键字标记的方法或者类要使用严格计算,这种方式计算可能产生溢出
6.  &&和||按照短路的方式求值,如果第一个操作数已经能够确定值,第二个操作数就不必计算&和|不是按短路运算,在得到结果之前一定要计算两个操作数的值
7.  +=是又结合的a+=b+=c就是a+=(b+=c)
8.  代码点和代码单元?
9.  String对象称为不可改变的字符串,编译器可以将字符串共享
10.只有字符串常量是共享的,而+或者substring等操作产生的结果都不是共享的。不要用==测试字符串的相等性,==运算符只能确定两个字符串是不是被放置在同一个位置
11.不能在嵌套的两个块中声明相同的变量,但在C++中可以
Public static void main(Stirng[] argc){
    Int n;
    {
        Intn;//这是错误的
}
}
12.Case标签必须是整数或者枚举常量,不能检测字符串
13.带标签的break只能跳出程序快而不能跳入程序块
14.两个大数值类的应用:BigInteger和BigDecimal任意精度的数值(在java.math.*)中
15.Java中可以允许数组的长度为0  newelementType[0]数组长度为0和nul值不同
16.一个数组的所有元素拷贝到另一数组中的方法System.arrayCopy(from,fromIndex,to,toIndex,count);
17.Java数组与C++数组在堆栈上有很大不同,不过基本上与分配在堆上的数组指针一样,也就是int[] a = new int[100],不同于int a[100]而等同于int * a = new int[100];
18.对数组排序使用Arrays类中的sort方法,此方法使用的快速排序
19.for each 循环访问二维数组:
for(type[] row:Arrayname){
    for(type x:row){
        do something
}
}
20.一个对象变量并没有实际包含一个对象,而仅仅引用一个对象,在Java中任何对象的变量都是对存储在另外一处的一个对象的引用,new操作符的返回的值也是一个引用。下面的语句:Date deadline = new Date();有两个部分,表达式new Date()构造了一个Date类型的对象,并且它的值是对新创对象的引用,这个引用被存储在变量deadline中。
21.可以将Java的的对象变量看做C++的对象指针,Date birthday 等同于 Date * birthday
22.Java中所有的对象都存储在堆中,当一个对象包含另一个对象变量时,这个变量依然包含的是指向另一个堆对象的指针。
23.对实例属性做出修改的方法被称为更改器方法,仅访问实例属性而不加修改的方法被称为访问器方法。
24.构造函数总是伴随着new操作符的执行被调用,Java对象都是在堆中构造的
25.将某个方法设置为内联方法是Java虚拟机的任务
26.不要编写返回引用可变对象的访问器方法(get方法)。在Employee类中
class Employee{
    public Data getHireDay(){
        return hireDay;
}
}
这样会破坏封装性
Employee harry =...;
Date d =harry.getHireDay();
double tenYear =10 * 365.25 * 24 * 60 * 60 *1000;
d.setTime(d.getTime()– (long)tenYear);
 
出错的原因是d和harry.hireDay引用同一个对象,对d的使用set方法就能够自动的改变这个雇员对象的私有状态。
如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone).对象克隆指存放在另一个位置的对象副本
修改后的代码
calss Employee{
    public Date getHireDay(){
        return (Date)hireDay.clone();
}
}
27.将属性设置为final,构建对象时必须初始化这样的属性。
28.public  staticfinal PI = 3.1415;类访问 而public final PI= 3.1415类的实例访问
29.System类中的setOut方法是一个本地方法,不是用Java语言实现的,本地方法可以绕过Java语言的存取控制机制
30.静态方法是没有this参数的方法,在一个非静态的方法中,this参数是表示该方法的隐式参数,因为静态方法不能操作对象,所以不能在静态方法中访问非静态属性,但是可以访问自身类中的静态属性。
31.public static getNextId(){
returnnexId;//nextId是静态属性
}访问 : int n = Employee.getNextId();
在这里是可以省略static的,但是要通过Employee类的实例来访问
32.使用静态方法的两种情况:
1.  当一个方法不需要访问对象的状态,其所有的参数都是通过显示参数提供的(ex:Math.pow())
2.  当一个方法只需要访问类的静态属性
33.值调用表示方法接收的是调用者提供的值,而引用调用表示方法接收的是调用者提供变量的位置,Java程序设计语言使用的值调用
34.1.一个方法不能修改一个基本数据类型的参数(即数值型和布尔型值)
2.一个方法可以改变一个对象参数的状态
3.  一个方法不能让对象参数引用另一个新的对象
35.对象属性和局部变量的不同之处,必须明确的初始化方法中的局部变量,但是如果没有初始化类中的属性,将会被初始化为默认值(0或者false或者null)。
36.在一个构造函数中调用另一个构造函数用this(...)参数列表
37.初始化块:首先运行初始化快,然后在运行构造函数的主体部分,建议将初始化块放置在属性定义之后
38.在类第一次加载的时候将会进行静态块的初始化,可以写一个没有main方法的打印
39.可以为任何类添加finalize方法,finalize方法将在垃圾回收器清楚对象之前被调用,在实际应用中不要使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法在什么时候被调用,有个名为System.runFinalizersOnExit()的方法可以确保finalize在Java关闭前被调用,但是这个方法不安全,一种替代的方法是使用RunTime.addShoutdownHook()添加关闭钩。
40.导入静态方法和静态属性两个实际应用:1.算术运算2.笨重的常量
41.没有指定public和private,这个部分(类、方法、变量)可以被同一个包中的所有方法访问
42.Java中所有继承都是公用继承
43.通过super实现对父类构造函数的调用,使用super调用构造函数的语句必须是子类构造函数的第一条语句,如果子类的构造函数没有显式的调用构造函数父类的构造函数,则将自动调用父类默认的构造函数。
44.this的用途:1.引用隐式参数2.调用该类的其他的构造函数
45.super的用途:1.调用父类的构造函数2.调用父类的方法
46.一个对象变量可以引用多种实际类型的现象被称为多态。在运行是能够自动的选择调用适当的方法的现象称为动态绑定。
47.允许子类将覆盖方法的返回类型定义为原返回类型的子类型
48.如果方法是private、static、final或者构造函数,那么编辑器将可以准确的知道该调用那个方法,这种调用方式称为静态绑定。
49.在覆盖父类一个方法的时候,子类的方法不能低于父类方法的访问权限,父类是public子类一定是public
50.阻止继承final类和final方法,类中的方法被声明为final,子类就不能覆盖这个方法,final类中的方法自动成为final方法。但是属性不成为final
51.如果一个方法很短并且没有被覆盖,编译器能够对它进行优化处理这个过程称为内联
52.只有在继承层次内进行类型转换,在将父类转换成子类之前,应该使用instance of进行检查。
53.如果x为null,那么进行x instance of C不会产生异常,只是会返回false,null没有引用任何对象,当然也不会引用C类型的对象。
54.包含一个或者多个的抽象方法的类必须被声明成抽象的。
55.扩展抽象类的可以有两种选择:一种是在子类中定义部分抽象方法或者抽象方法也不定义,这样就必须将子类也标记成抽象类,另外一种是定义全部的抽象方法,这样子类就不是抽象的了。
56.抽象类不能被实例化。可以定义抽象了的变量,只能够引用非抽象子类的对象。
57.Java中protected部分对所有子类和同一包中的所有其他类可见。
58.在子类中定义equals方法时,首先要调用父类的equals方法,如果父类中的属性都相等,就需要比较子类中的属性
59.equals方法具有下面的特性:
1.  自反性:对于任何非空引用x,x.equals(x)应该返回true
2.  对称性:对于任何引用x,y,如果x.equals(y)返回true那么y.equals(x)也应该返回true
3.  传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4.  一致性:对于x,y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回相同的结果
5.  对于任何非空引用x,x.equals(null)应该返回false。
60.用instance of 用缺陷,比如说父类引用子类的对象,但是子类的对象拥有和父类某个对象相同的属性,如果没有考虑子类特有的信息,则instance of 就不怎么好。
61.如果子类能够拥有自己的相等的概念,那么对称性需求将强制采用getClass进行检测。如果父类决定相等的概念,那么就可以使用instance of进行检测,这样就可以在不同的子类的对象之间进行相等比较。
62.编写完美equals方法的建议:
1.  显示参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。
2.  检测this与otherObject是否引用同一个对象:if(this == otherObject) return true;
3.  检测otherObject是否为null,如果为null,返回false,这项检测是很必要的,if(otherobjec == null) return false;
4.  比较this和otherObject是否属于同一类,如果equals的语义在每个子类中有所改变,使用getClass检测 
if(getClass() !=otherObject.getClass) return false;
如果所有的子类都拥有统一的语义,就是用instance of 进行检测
if(!(otherObjectinstance of ClassName)) return false;
5.  将otherObject转换为相应的类类型变量:
ClassName other= (ClassName)otherObject
6.  现在开始对所有需要比较的属性进行比较了  使用 == 比较基本类型,使equals比较对象属性,如果所有都匹配返回true,否则返回false。
7.  如果子类中重新定义equals就要在其中包含调用super.equals().
63.hashCode方法,注意String类的hashCode方法,见源代码。两个相等对象要求返回相同的散列码。
64.使用add方法为ArrayList添加新元素,而不用set方法,它只能替换数组中已存在的元素。
65.自动装箱与拆箱中注意基本类型与包装器的关系,自动打包规boolean,byte,char<=127,介于-128-127之间的short和int被包装到固定的对象中。Integer a = 100,Interger b = 100 ,a == b是成立的。但是大于127就是不成立的。
66.包含在包装器中的内容不会改变,不能使用包装器类创建修改数值参数的方法。
67.Class类的使用
68.异常有两种类型,一种是未检查异常,另一种是已检查异常。
69.反射的机制:在java.lang.reflect包中有三个类Field,Method,Constructor分别描述类的属性,方法和构造函数。Field中有一个getType函数,由于描述属性所属类型的Class类对象。Method和Constructor类含有能够报告参数类型的方法,Method类还可以报告返回值类型,这三个类还有一个getModifiers的方法,它将返回一个整型数值,用不同的位开关设置描述public和static这些修饰符的使用状况,还可以利用java.lang.reflect包中的Modifier类的静态方法分析getModifiers返回的整型数值。可以使用Modifier类中的isPublic、isPrivate,isFinal判断方法或者构造函数是否是public,private,或final。调用Modifier类的相应方法,并对getModifiers返回的整型数值进行分析,另外还可以利用Modifier.toString方法将修饰符打印出来。
70.getFields()方法返回包含Filed对象的数组,这些对象记录了该类或其父类的公有属性,getDeclaredField()方法返回包含Field对象的数组,这些对象记录了该类的全部属性。getMethod()将返回所有的公有方法,包括从父类继承的公有方法,getDeclared()返回该类或者接口的所有方法,但是不包括由父类继承的方法。
71.反射机制的默认行为受限于Java的访问控制,如果一个Java程序没有受到安全管理器的控制,就可以覆盖访问控制,为了达到目的,需要调用Field,Method,或Constructor对象的setAccessible方法。
72.为了编写通用扩展数组的代码,需要能够创建与原数组类型相同的新数组,为此,需要java.lang.reflect包中的Array类中的一些方法,其中最关键的是Array类中的静态方法newInstance,它能够构造新数组,在调用时必须提供两个参数,一个是数组元素的类型,另一个是数组的长度。
Object newArray= Array.newInstance(componentType,newLength)为了执行这条语句,需要知道新数组的长度和元素类型,书上有一段很有水平的代码,ArrayGrowTest.java
73.Java没有提供方法指针,即将一个方法的存储地址传给另一个方法,以便第二个方法能够随后调用它。
74.Method类中的invoke方法  Objectinvoke(Object obj,Object...args)第一个参数是隐式参数,其余的对象提供了显式参数,以前的版本中,必须传一个对象数组,如果没有显式参数就传递一个null,对于静态方法,第一个参数可以被忽略,即可以将它设置为null。Invoke的参数和返回值必须是Object类型的。
75.在比较两个枚举值时,永远不需要调用equals方法,而直接使用 == 就行了。
原创粉丝点击