Java工程师面试题

本文详细解答了Java与C++的区别、自动装箱与拆箱原理、值传递特性、重载与重写概念、深拷贝与浅拷贝的差异。深入探讨了Java面向对象的特点,包括构造器、成员变量与局部变量的区别、对象的相等与引用相等、以及面向对象的三大特征:封装、继承和多态。此外,还解析了静态方法与实例方法的不同,接口与抽象类的对比,以及在面试中常考的Java核心概念。


前言

java基础:


一、基础

1.1 java和C++的区别?

答:(1)都是面向对象编程语言,都支持封装,继承和多态
(2)java不提供指针直接访问内存,程序内存更加安全
(3)Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口 可以多继承。
(4)Java有自动内存管理机制,不需要程序员手动释放无用内存
(5)在C语言中,字符串或字符数组最后都会有一个额外的字符“\0”来表示结束。但是,java语言中没有结束符这一概念。

1.2 自动装箱与拆箱

  • 装箱:将基本类型用应用类型包装起来。
  • 拆箱:将包装类型转换成基本类型

1.3 为什么java中只有值传递?

  • 按值调用表示方法接收的是调用者提供的值
  • 按引用调用表示方法接收的是调用者提供的变量地址
  • 一个方法可以修改传递的引用所对应的变量值,而不能修改传递值调用所对应的变量值。
  • Java程序设计语言总是采用按值调用。方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量内容。

1.4 重载与重写的区别

  • 重载:方法名相同,参数类型或个数不同,返回值和访问修饰符可以不同
  • 重写:就是当子类继承父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法

1.5深拷贝VS浅拷贝

  1. 浅拷贝:对于基本数据类型进行下值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝
  2. 深拷贝:对于基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝

二、java面向对象

2.1 面向对象与面向过程的区别

  • 面向过程:面向过程性能比面向对象的高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,一般采用面向过程开发。但是,面向过程没有面向对象以维护、易复用、易扩展。
  • 面向对象“容易维护、易复用、易扩展。但是,面向对象性能比面向过程低。
  • 面向过程也需要分配内存,计算内存偏移量,java性能差的主要原因并不是因为它是面向对象语言。而是java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制码。
  • 而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其他它一些面向过程的脚本语言性能也并不一定比java好。

2.2 构造器Constroctor是否可被override(重写)?

  • 不能重写(override)。但能重载(overload)所以一个类可以有多个构造函数

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

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

2.4 成员变量与局部变量的区别有哪些?

  • 从语法形式上看:成员变量属于类的,而局部变量时在方法中定义的变量或是方法的参数;成员变量可以被public、private、static、等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;但是,成员变量和局部变量都能被final所修饰。局部变量方法里,必须初始化,除了参数。
  • 从变量在内存的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

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

new运算符,new创建实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存里)。一个对象可以指向0个或1个对象;一个对象可以有n个引用指向它。

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

  • 主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有构造方法也会有默认的无参构造方法。如果我们自己添了类的构造方法(无论是否有参),java就不会再添加默认的无参构造方法,这个时候不能直接new一个对象而不传递参数了,所以我们一直在不知不觉的使用构造方法,这也是为什么我们在创建对象的时候后面加一个括号(因为要调用无参构造方法)。如果我们重载了有参的构造方法,记住都要在无参的构造方法也写出来。

2.7 构造方法有哪些特性?

  • 名字和类名相同。
  • 没有返回值,也不能用void声明构造函数
  • 生成类的对象是自动执行,无需调用。

2.8 在调用子类构造方法之前会调用父类无参构造方法,其目的是?

  • 帮助子类做初始化工作。

2.9 对象的相等与指向他们的引用相等,二者有什么不同?

  • 对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们的指向的内存地址是否相等

2…10 面向对象三大特征

  1. 封装
  • 封装是指把一个对象的状态信息隐藏在对象内部,不允许外部对象直接访问对象的内部消息。但是可以提供一些可以被外界访问的方法来操作属性。如果属性不想被外界访问,我们大可不必提供方法给外界方访问。
  1. 继承
  • 不同类型的对象,相互之间经常有一定的共同点。同时,每一个对象还定义了额外的特性使得他们与众不同。
  • 继承是使用已存在的类定义作为基础建立新的类的技术,新的类定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速的创建新的类,可以提高 代码的复用,程序的可维护性, 节省大量创建新类时间,提高开发效率。
  • 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
  • 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  1. 多态
  • 多态,顾名思义,表示一个对象具有多种状态。具体表现为父类的引用指向子类的实例
  • 多态特点:
  1. 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
  2. 对象类型不可变,引用类型可变;
  3. 方法具有多态性,属性不具有多态性;
  4. 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
  5. 多态不能调用"只在子类存在但在父类不存在"的方法;
  6. 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。

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

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

2.12 静态方法和实例化方法有何不同?

  • 在外部调用静态方法时,直接用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说静态方法可以不创建对象。
  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例化成员变量和实例方法;实例方法则无此限制

2.13 接口和抽象类的区别是什么?

  1. 接口的方法必须是public修饰,所以默认是public修饰,方法在接口中是不能实现的是抽象方法,在抽象类中可以是抽象方法,也可以是具体的实现方法。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  3. 一个类只能继承一个抽象类,而一个类却可以实现多个接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值