【搞定面试】Java篇-Java基础

9、什么是JDK?什么是JRE?什么是JVM?三者之间的联系与区别?

  • JDK: java开发工具箱。是Java Development Kit,它是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。

  • JRE(Java Runtime Environment)是Java运行时环境,用于运行已编译 的Java 程序,包括 Java虚拟机(JVM),Java类库,java命令(解释器)和其他的一些基础构件。但是,它不能用于创建新程序。

  • JVM: Java虚拟机,提供了内存管理/垃圾回收和安全机制等。负责将字节码转换为特定机器代码,这种独立于硬件和操作系统,正是java程序可以一次编写多处执行的原因

    • Java 程序从源代码到运行一般有下面3步:
    • 我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言
      • HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。

10、什么是字节码?采用字节码的最大好处是什么?

  • Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行
  • 字节码的好处:Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

11、java中的编译器、解释器和即时编译(JIT)【Java的编译与解释并存】:

  • Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,
  • 虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。
  • JVM中还存在着即时编译器优化代码执行,他会检测代码中的热点代码(即多次调用的方法或循环的代码块),这些代码如果每次都通过解释器解释执行无疑大大降低了运行效率,因此Jit编译器将他们编译成本地代码,则下次调用时就不需要解释器再次解释执行。

12、Java和C++的区别?

  • 都是面向对象的语言,都支持封装、继承和多态
  • Java不提供指针来直接访问内存,程序内存更加安全
  • Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。
  • Java 有自动内存管理机制(内存分配和垃圾回收),不需要程序员手动释放无用内存

16、 面向对象和面向过程的区别

  • 面向过程
    • 优点: 性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发
    • 缺点: 没有面向对象易维护、易复用、易扩展
  • 面向对象【 易维护、易复用、易扩展】
    • 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
    • 缺点: 性能比面向过程低
  • 解释:
    • 面向过程程序是由一系列相互独立的常量、变量和函数组成,他们之间没有明显的关联和隶属关系。任意函数之间可以相互调用,任意函数也可以使用全局的常量、变量,甚至可以改变全局的变量。
    • 面向对象程序的代码则是由一系列对象组成,每个对象包含其所属的常量、变量、方法,一般来说,引用对象内部状态与修改对象内部状态必须通过对象自身来进行,不能或不允许直接从对象的外部修改和控制对象的状态。这样,就可以避免面向过程程序中的变量发生不可预料的改变或超出其范围的变化。【所以容易维护】
      • 易维护:(封装)【把一个对象相关的都放在了一块】
      • 易复用:继承
      • 易扩展:继承、多态

17、 Java 语言有哪些特点?

  • 简单易学;
  • 面向对象(封装,继承,多态);
  • 平台无关性( Java 虚拟机实现平台无关性);
  • 自动内存管理
  • 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
  • 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
  • 编译与解释并存【java,javac,JIT】
    • java解释器就是把在java虚拟机上运行的目标代码(字节码)解释成为具体平台的机器码的程序。即jdk或jre目录下bin目录中的java.exe文件,而javac.exe是编译器。
    • 运行java程序的过程是先用javac编译,然后用java解释。而一经编译成功后,就可以直接用java.exe随处解释运行了。
    • JIT编译器是JRE的一部分。原本的Java程序都是要经过解释执行的,其执行速度肯定比可执行的二进制字节码程序慢。为了提高执行速度,引入了JIT。在运行时,JIT会把翻译过来的机器码保存起来,以备下次使用。而如果JIT对每条字节码都进行编译,则会负担过重,所以,JIT只会对经常执行的字节码进行编译,如循环,高频度使用的方法等。它会以整个方法为单位,一次性将整个方法的字节码编译为本地机器码,然后直接运行编译后的机器码。

17、Oracle JDK 和 OpenJDK 的对比

  • 总结:
    • Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
    • OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
    • Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;
    • 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
    • Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
    • Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。

19、什么是 Java 程序的主类? 应用程序和小程序的主类有何不同?

  • 一个程序中可以有多个类,但只能有一个类是主类。 主类是 Java 程序执行的入口点。
    • 在 Java 应用程序中,这个主类是指包含 main()方法的类,应用程序的主类不一定要求是 public 类。
    • 而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类,小程序的主类要求必须是 public 类。

20、Java 应用程序与小程序之间有那些差别?

  • 简单说应用程序是从主线程启动(也就是 main() 方法)。
  • applet 小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。

22、字符型常量和字符串常量的区别?

  • 1、形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符
  • 2、含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
  • 2、占内存大小 字符常量只占2个字节; 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)
    • 注意:java规范中,没有明确指出boolean的大小。在《Java虚拟机规范》给出了boolean类型单独使用是4个字节(int 来实现),和boolean数组是1个字节的定义(byte数组),具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。
    • 那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。大多数人都会很自然的这样去想,我同样也有这个疑问,经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。

https://blog.csdn.net/YuanMxy/article/details/74170745

21、构造器 Constructor 是否可被 override?

  • 构造方法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。

22、自动装箱与拆箱

  • 装箱:将基本类型用它们对应的引用类型包装起来;

  • 拆箱:将包装类型转换为基本数据类型;

23、在一个静态方法内调用一个非静态成员为什么是非法的?

  • 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

24、在 Java 中定义一个不做事且没有参数的构造方法的作用

  • Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。
    • 因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

25、import java和javax有什么区别?【都是Java 标准API的组成部分】

  • 刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来使用。然而随着时间的推移,javax 逐渐地扩展成为 Java API 的组成部分。但是,但是,将扩展从 javax 包移动到 java 包确实太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部分。

所以,实际上java和javax没有区别。这都是一个名字

27、成员变量与局部变量的区别有那些?

  • 1、**从语法形式上看:**成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,protected、static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
  • 2、**从变量在内存中的存储方式来看:**如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。
  • 3、**从变量在内存中的生存时间上看:**成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
  • 4、成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量必须显示地赋值),而局部变量则不会自动赋值

28、 创建一个对象用什么运算符?对象实体与对象引用有何不同?

  • new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。

29、什么是方法的返回值?返回值在类的方法里的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

30、 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法

31、构造方法有哪些特性?

  • 1、名字与类名相同。
  • 2、没有返回值,但不能用void声明构造函数。
  • 3、生成类的对象时自动执行,无需调用。

32、 静态方法和实例方法有何不同

  • 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

    • OuterClass.InnerClass innerClass = new OuterClass.InnerClass(); //对静态内部类的访问

35、Java序列化中如果有些字段不想进行序列化,怎么办?

对于不想进行序列化的变量,使用transient关键字修饰。

transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。

36、获取用键盘输入常用的的两种方法

  • 方法1:通过 Scanner
    Scanner input = new Scanner(System.in);
    String s  = input.nextLine();
    input.close();

方法2:通过 BufferedReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
String s = input.readLine(); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值