Java知识点总结 (一)

  1. 什么是Java的字节码?

    字节码是一序列代码和数据组成的二进制文件,是程序的低级表示,比机器码更抽象,能运行在java虚拟机,程序抽象为字节码能保证代码运行于各种设备之上。

  2. Java允许整形溢出并返回错误值,Java为什么不自动检查溢出

    之所以成为原始数据类型就是缺乏溢出检查,避免此类问题只要在合适的场景使用合适的数据类型,小于10位十进制的整型用int,大于则用long。

  3. double值初始化为无穷大

    DOUBLE.POSITIVE_INFINITY和DOUBLE.NEGATIVE_INFINITY。

  4. 不同数据类型值相互比较?

    需要先进行类型转换,Java一般会在比较前自动转换。

  5. 1/0和1.0/0.0值分别是?

    除以零异常,无穷大。

  6. 负数的除法和求余

    除法会向零取整,求余则基于(a/b)*b + a%b = a,所以当a为14,b为-3,余数为2。

  7. &,|,^与&&,||

    &,|,^为整数位逻辑操作,如10|6 = 1010|110=1110=14,10^6=1100=12

    后者是短路求值逻辑判断,从左向右一旦整个表达式已知则停止求值。

  8. for循环和while循环的区别

    区别主要在递增变量,while循环递增变量循环结束还是可以使用的,for循环则不行。

  9. 为什么数组起始索引是0不是1?

    源于机器语言,当尝试获取数组某元素的地址时,需要使用数组的起始地址加上元素的索引若起始索引为1则每次都要减一

  10. Java中的e的用法?

    e表示10的次方,如2.0e-6为2.0*10^(-6)。

  11. Java中的抽象数据类型ADT?

    所有对象的三大特性:状态,标识,行为。

    • 状态:即数据类型中的值
    • 标识:即内存中的位置
    • 行为:即数据类型的操作

    Java对象用引用类型来区别于原始数据类型,可以认为引用就是内存地址。

  12. Java中一个静态方法可以将另一个静态方法作为参数吗?

    不可以,虽然很多语言都可以。

  13. 静态方法与非静态方法

    静态方法的主要作用是实现函数,方便在不创建对象的情况下调用方法和变量。

    static方法不能调用非静态方法,反之则可以。

    • static方法:不依赖于对象,所以没有this,因此不能访问非静态变量和方法,因为它们的调用要依赖于具体的对象。
    • static变量:静态变量被所有对象共享,内存中只能有一个,仅在类加载时被初始化。static不允许修饰局部变量,局部就说明方法的生命周期决定变量的存活时期,static修饰的变量会扩充到整个类,有语法冲突
    • static代码块:静态代码块来优化程序性能,类初次加载时会执行一次静态代码块,可以将一些只需要初始化的操作和数据放在静态代码块中。

    执行顺序:父类静态变量->父类静态代码块->子类静态变量->子类静态代码块->父类非静态变量(父类实例成员变量)->父类构造函数->子类非静态变量(子类实例成员变量)->子类构造函数

  14. 赋值与复制,副本

    赋值语句给对象传递的是同个内存位置的引用,即起别名

    对于原始数据类型则是拷贝值,生成副本

    而引用类型则复制的是引用,仍是同一对象。

  15. 数组

    Java中所有非原始数据类型都是对象,所以字符串String,数组都是对象。

  16. 字符串

    String和数组类似,但二者有区别,数组通过内置语法访问每个字符,而字符串为索引访问,为字符串操作准备了很多实例方法。

    为什么不用字符数组替代String?

    • 为了让代码简洁清晰,String是更高级别的封装,有面向对象的思想。
  17. 重载和重写

    • 重载overloading
      同一类中,体现多态性,相同名字的方法,参数个数或类型不同,返回值可同或不同,但不能以返回值区别,访问修饰可以不同,异常也可以不同。
      对于继承,访问权限也会影响重载,父类private时子类认为是新建了方法。
    • 重写overrite
      不同类中,受限于父方法的访问修饰类型,如默认default时只能被同包内的子类重写,protected能被不同包子类重写,参数列表要相同,返回类型也要相同。访问修饰符要大于父类方法,不能抛出新的或更广泛的异常检查。
  18. 维护多个实现

    同一份API的多个实现可能会有维护和命名问题,而且常常需要维护多个版本,通常采用前缀命名约定来应付这种问题,但当系统庞大时,这样不算十分理想,当API维护后还需要修改用例代码,当与泛型和迭代器一起使用会有问题。

  19. 原始数据类型和封装类型

    Java中封装的引用类型称为封装类型,在需要的时候Java自动将原始数据类型转换为封装类型,如int和String拼接时,int自动转为Integer并调用toString方法。

  20. 对象的等价性

    == 对于原始数据类型比较的是值,对于非原始数据类型则判断引用或者说标识是否相同,但封装类型有特例,如Integer若值为-128到127则存入常量池比较的是值。

    要调用equals方法,自定义数据类型时需要重载equals方法
    要求:

    1. 自反性:x.equals(x)=true
    2. 对称性:y.equals(x)=true 则 x.equals(y)=true
    3. 传递性:x.equals(y)=true,y.equals(z)=true 则 x.equals(z)=true
    4. 一致性:值未更改时x.equals(y)=true恒定
    5. 非空性:x.equals(null)=false恒定
  21. Java中的引用和指针

    指针可以看作机器地址,Java创建引用只能通过new,改变引用只能通过赋值,所以Java的引用叫安全指针


参考博客和文章书籍等:

《Java核心技术-卷1》

因博客主等未标明不可引用,若部分内容涉及侵权请及时告知,我会尽快修改和删除相关内容