首先这本书简略介绍一下:主要讲了一些java中比较容易让菜鸟困惑的问题,对于求职中的一些笔试(仅仅相对于应届生)还是很有帮助的。下面我将自己认为的比较重要的问题摘录如下:
1.static关键字及其是否能够修饰构造方法
static关键字修饰的变量都被放在了JVM中的常量池里,这是单独为static开辟的存储区域。
static不能够修饰构造函数。static可修饰一般的变量,方法,及代码块。其特点是不依靠其依附类的实例化对象而存在。在类加载时,其修饰的对象就已经存在,而且不管依附类的实例被创建了多少次,static修饰的对象只有一个(也就是共享的)。
由于static的唯一性特性,static修饰的方法不能够在子类中进行重写。
2.基本类型之间的数据转换
语句:float flo=3.0;这个语句是错误的,必须写成float flo=3.0f;
解析:在java中整形数据是被默认为int的,而非整型数据都被默认为double;所以3.0是double类型,将它赋予一个float类型就牵涉到数据类型转换的问题。
java中的数据类型转换分为:强制类型转换和自动类型转换两种情况。要实现自动类型转换必须同时满足以下两种情况:
(1)转换双方必须兼容,int和long兼容,而int和boolean不兼容。
(2)必须是由低位数据向高位数据的转换。比如:int是4字节的数据,而long是8字节的数据,所以int可以自动转化为long,而long不能自动转化为int。
上文中提到的float是4字节的,而3.0的默认类型double是8字节的,所以不能自动进行转换,需要进行强制类型转换或加入标志。而 long lo=3L,中的L也是必须要添加的。
3. x=x+y与x+=y的区别
上述的两端代码在一般情况下是等价的,但在2中所述的类型转换中是不能通用的:
short sho=3;
sho+=1;//编译通过
sho=sho+1;//编译不通过
在上述代码中,sho+1的结果返回的是一个int类型的值,而int要转换为short是需要进行强制类型转换的;而sho+=1是因为+=运算符在java环境中会根据接受变量的类型进行类型的强制转换!
PS:在这里会有一点疑问,那就是short sho=3,怎么会通过编译,不是3被默认为int类型的么?在这里需要继续寻找原因。。。。
4.创建类对象时,类中个成员的执行顺序是什么
父类的静态区域——子类的静态区域——父类的全局变量定义——父类的构造函数——子类的全局变量定义——子类的构造函数
PS:静态区域包括:静态的全局变量定义,静态的代码块;
全变量定义包括:非静态全局变量,非静态代码块
5. Java中的动态绑定
(1)绑定
将一个方法调用同一个方法主体连接到一起称为“方法绑定”;将一个变量同一个对象主体中的属性进行连接,称为“变量绑定”;eg:
public class T
{
int k=0;
void method()
{
}
}
T t=new T();
t.method();
其中t.method();方法调用就与Class T中的method方法绑定在一起了,当这条调用语句执行时,JVM会自动寻找它绑定的方法进行执行。
(2)动态绑定与静态绑定
如果在程序运行前执行绑定,由 编译器 决定方法调用的程序,称为“早期绑定”或“静态绑定”;
如果绑定过程发生在程序的执行过程中,以对象的类型为基础,则称为“后期绑定”或“动态绑定”;
在java中,方法的执行主要依靠动态绑定技术,在程序运行中,虚拟机将调用对象实际类型所限定的方法。而属性的绑定属于静态绑定。这也是java中可以运用多态的原因,eg:
package cn.edu.zjut.Test; public class T { int k = 2; void method() { System.out.println("静态绑定"); } public static void main(String[] args) { T ts = new Ts(); ts.method(); System.out.println(ts.k); } } class Ts extends T { int k = 3; void method() { System.out.println("动态绑定"); } }
该段程序的输出结果将为:
动态绑定
2
这就是在编译过程中,没有根据t的类型将方法静态绑定到T中,而是在执行的过程中,根据对象ts的实际类型TS进行绑定。而属性k则在编译过程中就静态绑定到了类T之中。
PS:动态绑定也可以理解为指针与方法调用的问题,ts引用实际是指向Ts对象的,所以调用的方法理所当然应该为Ts对象中的方法。
(3)java方法在调用过程中的历程
编译器查看对象变量的声明类型和方法名,通过声明类型找到方法列表;
编译器查看调用方法时提供的参数类型;
如果方法由private,static,final修饰或者是构造器,编译器就可以确定调用哪一种方法,即采用静态绑定技术;如果不是上述情况,则执行动态绑定,继续后续过程;
虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法;