zoukankan      html  css  js  c++  java
  • 《你必须知道的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修饰或者是构造器,编译器就可以确定调用哪一种方法,即采用静态绑定技术;如果不是上述情况,则执行动态绑定,继续后续过程;

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

    虚拟机搜索方法签名;

    调用方法;

  • 相关阅读:
    HDOJ 1846 Brave Game
    并查集模板
    HDU 2102 A计划
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    POJ 1321 棋盘问题
    CF 999 C.Alphabetic Removals
    CF 999 B. Reversing Encryption
    string的基础用法
    51nod 1267 4个数和为0
  • 原文地址:https://www.cnblogs.com/mengyan/p/2712009.html
Copyright © 2011-2022 走看看