《你必须知道的261个java语言问题》读书报告——第一弹

首先这本书简略介绍一下:主要讲了一些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修饰或者是构造器,编译器就可以确定调用哪一种方法,即采用静态绑定技术;如果不是上述情况,则执行动态绑定,继续后续过程;

虚拟机提取对象的实际类型的方法表;

虚拟机搜索方法签名;

调用方法;

原文地址:https://www.cnblogs.com/mengyan/p/2712009.html