1.基础概念与常识

  • Java 语言有那些特点

    简单易学、拥有面向对象编程思想、平台无关性(一次编译处处可用)【但现在已经不是最大的优势项了,市面上很多技术都已经成熟,可以通过某一种技术来实现跨平台这种类似的情况(Docker)】、支持多线程

  • JVM && JDK && JRE
    • JVM

      Java虚拟机,JVM 可以对不同的系统来特定的实现,是为了使用相同的字节码都可以给出相同的结果,这也是”一次编译,处处可用“的关键点

    • JDK

      给开发者使用的,用来创建和编译Java程序。也包含了编译 java 代码的编译器 比如 javac 和一些其它工具和 API

    • JRE

      是 Java 的运行环境,包含了程序运行的环境和必要的类库而JDK则包含了 JRE

  • 什么是字节码?采用字节码的好处是什么?
    • 字节码

      JVM 虚拟机可以理解的代码就是字节码(也就是扩展名为.class的文件)

    • 好处

      Java 程序不用重新编译就可以在不同操作系统上运行。是因为字节码不面向某一种特定的处理器,只面向虚拟机

  • 为什么说 Java 语言”编译与解释并存“?
    • 原因

      Java 语言即有编译型语言的特征也有解释性语言的特征。Java 程序是先经过编译生成字节码文件,再通过 Java 解释器来解释执行

    • 编译型语言

      是通过编译器将源代码一次性翻译为可以被平台执行的机器码。编译语言的执行速度比较快,开发效率比较低【C、C++等】(运行前就会吧程序编译为机器语言,运行时不需要重新编译,所以执行效率高)

    • 解释型语言

      是通过编译器一句一句的吧代码解释为机器代码后再执行。解释性语言开发效率比较快,执行速度比较慢【Python、JS等】(在程序运行的时候才翻译,这样每执行一次就要翻译一次,所以效率低)

  • Java 和 C++ 的区别?
    • Java 和 C++ 都是面向对象的语言,都有封装、继承、多态
    • Java 类是单继承,而 C++ 是多继承
    • Java 有自动内存管理垃圾回收机制,不需要程序员手动释放无用内存
    • C++ 支持方法重载和操作符重载,但 Java 只支持方法重载

2.基本语法

  • 注释有哪几种形式
    • 单行注释(//)、多行注释(/ /)、文档注释(/* /)
  • 标识符和关键字的区别是什么

    标识符也就是变量名,给变量起的名字。关键字是 Java 预先就用了的标识符

3.基本数据类型

  • 基本类型和包装类型的区别
    • 除了定义常量或者是局部变量外,比如在方法参数、对象属性很少会使用基本数据类型来定义变量。而且包装类型可用于泛型而基本数据类型不可以

    • 包装数据类型默认值为null,基本数据类型存在不同默认值

    • 基本数据类型通常使用 == 来比较,因为 == 比较的为值,而包装数据类型常用 equals() 来比较,因为包装类型使用 == 比较的是内存地址
  • 包装类型的缓存机制

    Byte、Short、Integer、Long 这四种包装类型默认创建了数值 [-128,127] 相应类型的缓存数据。Character 创建了数值在 [0,127] 范围的缓存数据

  • 自动装箱与拆箱了解么?原理是什么?
    • 装箱:吧基本类型用它们相对应的引用类型包装起来,其实就是调用了 xxx.valueOf()
    • 拆箱:将包装类型转换为基本数据类型,其实就是调用了 xxxValue()【Integer.intValue()】
    Integer i = 10;  // 装箱
    int n = i;  // 拆箱
    // 基本数据类型可以直接赋值给包装类型,这叫装箱。
    // 包装类型可以直接赋值给基本数据类型,这叫拆箱。
    
  • 为什么浮点数运算的时候会有精度失真的问题

    和计算机保存浮点数的机制有很大关系。计算机读取的是二进制,但计算机在表示数字的时候,宽度是有限的,无限循环的小数就会被截断,所以就会导致小数精度发生失真的问题【比如 0.2 转为二进制,会不断乘以 2,直到不存在小数为止 0.2 * 2 = 0.4 -> 0】

  • 超过 long 整型的数据应该如何表示

    使用 BigInteger 来表示。BigInteger 内容使用 int[] 数组的形式来存储任意大小的整型数据,但对于不是特别大的整数用 BigInteger 运算的效率会相对较低

4.变量

  • 成员变量与局部变量的区别?
    • 成员变量是属于类或者实例的,但局部变量通常在代码块中、方法中、方法的参数中定义。成员变量可以被修饰符所修饰,局部变量不能被修饰符所修饰。他们俩都可以被 final 修饰
    • 如果成员变量使用 static 修饰,那么这个成员变量是属于类的,如果没有被 static 修饰,则是属于实例的。而对象存在于堆内存,局部变量存在于栈内存
    • 成员变量是对象的一部分,随着对象的创建而创建,随着对象的销毁而销毁。局部变量随着方法的调用自动生成,随着方法的调用结束自动销毁
    • 成员变量如果没有被赋初始值,会有相应类型的默认值赋值,但局部变量没有默认值
  • 静态变量有什么作用

    可以节省内存(因为可以被这个类的所有实例所共享,所以静态变量也只会被分配一次内存),也方便调用

  • 字符型常量和字符串常量的区别
    • 字符常量是单引号一起来的一个字符,字符串常量是双引号引起的0个或多个字符。

    • 字符常量相当于一个整型值(ASCII值)可以参加表达式运算。字符串常量代表的是一个地址值

    • 字符常量只占 2 个字节,字符串常量占若干个字节

5.方法

  • 什么是方法的返回值?方法有哪几种类型
    • 方法的返回值

      某个方法中代码执行后产生的结果,返回值的作用就是接收结果,可以吧这个结果用于其它操作

    • 方法有哪几种类型

      无参数无返回值、有参数无返回值、有返回值无参数、有返回值有参数

  • 静态方法为什么不能调用非静态成员?

    静态方法是属于类的,在类加载的时候就会分配内存。而非静态成员属于实例对象,只有在对象实例化以后才存在。非静态成员不存在的时候静态方法就已经存在, 因此,无法在静态方法中调用内存中还不存在的非静态成员

  • 静态方法与实例方法有何不同?
    • 外部调用静态方法时,通过类名.方法名的方式【也可以使用对象.方法名,但这种方式容易混淆,静态方法不属于类的某个对象而是属于这个类】。而实例方法只能通过对象.方法名的方式来调用
    • 静态方法在访问本类成员的时候,只能访问静态的不能访问非静态的。而实例方法不存在这样的限制
  • 重载和重写有什么区别?
    • 重载

      在同一个类中(或者父类和子类之间),方法名相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符不同

    • 重写

      方法名和参数列表必须相同,子类方法返回值类型和抛出的异常范围 ≤ 父类,访问修饰符的范围 ≥ 父类。构造方法无法被重写

  • 什么是可变长参数?

    就是允许在调用方法时传入不定个数的实参,注意点是:可变长参数只能作为方法的最后一个形参

  • 遇到方法重载的情况,会优先匹配固定参数还是可变参数呢?

    优先匹配固定参数的方法,因为固定参数的方法匹配度更高

results matching ""

    No results matching ""