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修饰或者是构造器,编译器就可以确定调用哪一种方法,即采用静态绑定技术;如果不是上述情况,则执行动态绑定,继续后续过程;

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

    虚拟机搜索方法签名;

    调用方法;

  • 相关阅读:
    actionscript3.0 的一些小技巧
    Flash 安全沙箱的意义
    明明连上了网,但是打不开网页
    关于电脑上可用内存太小的问题
    AS3 Starling 学习杂谈 (一) Quad类
    更新flash builder4,6 的AIR版本
    软件工程实践2017第二次作业
    软件工程实践2017第一次作业
    微信小程序开发指南合集 各类组件用法技巧
    微信小程序视频教程合集 附带源码、PPT下载
  • 原文地址:https://www.cnblogs.com/mengyan/p/2712009.html
Copyright © 2011-2022 走看看