本篇将由我分享一些Java面试过程中容易被问到的一些基础问题,篇幅不长,以后会陆陆续续总结分享出来,如果在学习过程中发现有什么错误的地方或者有异议的观点,欢迎提出,供大家一起探讨学习。好了,废话不多说,现在让我们一起来看看那些常被问到的基础面试题吧!

  • 面向过程和面向对象的区别
  • 面向过程:相比较于面向对象性能更高。面向过程语言大多是可以直接编译成机械码,直接就能在电脑上运行;而面向对象语言在运行时需要进行类的实例化,开销大并且消耗资源。而对于Java语言的性能较差问题,主要是因为它属于半编译语言,最终的执行代码不可以是直接被CPU执行的二进制机械码。比如单机片、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
  • 面向对象:易维护、易复用、易扩展。这些优点完全建立在面向对象语言的三大特性(封装、继承、多态)之上的,因此可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
  • Java语言的特点
  • 面向对象(封装继承多态)
  • 平台无关性(由JVM实现)
  • 可靠性
  • 安全性
  • 支持网络编程
  • 编译与解释并存
  • Java和C++的区别

虽然我们知道很多人没有学过C++,但面试官还是喜欢拿Java和C++作比较。出于这个原因,就算我们没有学过C++,它们之间的区别也要记下来!

  • 都是面向对象语言,都支持封装、继承和多态
  • Java不提供指针来直接访问内存,程序内存更安全
  • Java的类是单继承的,但C++可以实现多继承;虽然Java的类不可以多继承,但是接口可以实现多继承
  • Java有自动内存管理机制,不需要程序员手动释放内存
  • JVM、JDK和JRE的理解
  • JVM:Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows、Linux、macOS),目的是使用相同的字节码,产生相同的运行结果,即一次编译,到处运行(Compile once, run everywhere!),听起来是不是很酷呢,哈哈!

 

现在我们虽然知道了JVM是什么,但是还是有必要了解一下什么是字节码?采用字节码的好处是什么呢?

在Java中,JVM可以理解的代码叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统的解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点,所以Java程序运行时比较高效,而且由于字节码并不专对于一种特定的机器,因此,Java程序无需重新编译便可以在多种不同计算机上运行。

  • JDK:Java开发工具包(Java Development Kit),它是功能齐全的JavaSDK。它拥有JRE所拥有的一切,还有编译器(Javac)和工具(如Javadoc和jdb),它能够创建和编译程序。
  • JRE:Java运行时环境(Java Runtime Environment),它是运行已经编译Java程序所需的所有内容的集合,包括Java虚拟机,Java类库,Java命令和其他一些基础构件。但是要注意一点是,它不能用于创建新程序。

 

PS:如果你只是为了运行一下Java程序的话,那么你只需要安装JRE就行了;但是如果你需要进行一些Java编程方面的工作的话,那么就需要安装JDK了。但有时这也不是绝对的,即使你不打算在计算机上进行任何Java开发,仍然需要安装JDK,例如:如果你需要使用JSP部署web应用程序,那么从技术上讲,你只是在应用程序服务器上运行Java程序。那为什么需要JDK呢?因为应用程序服务器会将JSP转换成Java servlet,并且需要使用JDK来编译servlet。

  • Java面向对象编程的三大特性:封装、继承、多态
  • 封装:把一个对象的属性私有化,同时提供一些可以共外界访问属性的方法,如果属性不想被外界访问,大可不必提供方法给外界访问。但是如果一个类没有方法给外界访问的话,那么这个类也没有什么意义了。封装确保了数据的安全性。
  • 继承:使用已经存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或者功能,也可以使用父类的功能,但是不能选择性的继承父类。三个要点:1.子类拥有父类对象的属性和方法(包含私有),但是父类中的私有属性和方法子类是无法访问的,只是拥有;2.子类可以拥有子的属性和方法,即子类可以对父类进行扩展;3.子类可以用自己的方式实现父类的方法(方法重写)。提高了代码的复用性和扩展性。
  • 多态:指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向那个类的实例对象,该引用变量发出的方法调用到底哪个类中的实现方法,必须在由程序运行期间才确定。说了一大堆晦涩难懂的话,简单来说就是,相同类型的引用变量,调用同一个方法时呈现出多种不同行为的特征,表现为:不同对象,调用相同函数结果不同;相同对象,调用相同函数(参数列表可能不同),结果不同。多态存在的三个前提:1.要有继承关系;2.子类重写父类方法;3.父类引用指向子类。

在Java中有两种形式可以实现多态:继承和接口。

6. ==与equals的区别

        1.==:判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)

   2.equals():它的作用也是判断两个对象是否相等,但它一般有两种使用情况:

     情况一:类没有覆盖equals()方法时,等价于==比较这两个对象,即比较的是内存地址

       情况二:类覆盖了equals()方法时,比较对象的内容,内容相等,返回true,即这两个对象相等。

7.抽象类和接口:

     抽象类:含有abstract修饰符的类即为抽象类 ,不能被实例化(不能被new);抽象类可以没有抽象方法,但抽象方法所在的类必须是抽象类;abstract修饰的方法为抽象方法,没有方法体,必须由子类实现,若不实现会报错;子类若为抽象类,则其中的抽象方法可不实现;抽象类中不能由抽象构造方法和抽象静态方法。

 

     接口:可以说成是抽象类的一种特例,接口中的所有方法都是抽象方法,接口中的方法默认定义为public abstract类型,接口中的成员变量类型默认是public abstract final。

 

     语法区别:

         1.抽象类可以有构造方法,接口中不能有构造方法;

         2.抽象类中可以有普通成员变量,接口中没有普通成员变量;

         3.抽象类中可以包含非抽象的普通方法,接口中所有方法都是抽象的;

         4.抽象类中的方法访问类型可以是public、protected和default默认的,接口中的只能是public

         5.抽象类中可以包含静态方法,接口中不能包含静态方法

         6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意类型,但接口中定义的变量只能是且默认是public static final。

         7.一个类可以实现多个接口,但只能继承一个抽象类。

     应用上的区别:

         接口更多的是在系统架构设计方法上发挥作用,主要用于定义模块之间的通信。

         抽象类在代码实现方面发挥作用,可以实现代码的重用。

 

Ok,本篇分享到这里就结束了,不知道你理解掌握了多少呢?这篇讲的都是一些比较基础但是又特别重要的概念,希望大家仔细阅读并认真思考和理解。下篇也会继续分享Java中常见的面试题,一起来学习吧!

 

 

 

 

注:部分摘抄于动力节点官网

 

   ——城南