当前位置: 首页 > news >正文

春招准备之Java基础篇

本系列内容直接以八股文,即问题的形式总结,面试所需内容
(本章节并不是以后端的专业角度去编写的,本人面试的是测试开发)

1、面向对象的三大特征?

面向对象编程(OOP)的三大核心特征:封装、继承、多态

封装(Encapsulation)

定义:将数据(属性)和操作数据的代码(方法)绑定在一起,并隐藏对象的内部实现细节,仅通过公共接口与外界交互

目的:保护数据不被外部直接访问或修改、提高模块的独立性和可维护性

继承(Inheritance)

定义:子类可以继承父类的属性和方法,从而实现代码复用,并可以扩展或修改父类的行为

目的:减少重复代码、建立类之间的层次关系(“是一个”关系)

多态(Polymorphism)

定义:同一操作作用于不同对象时,可以有不同的解释和行为。通常通过方法重写(override)或接口实现来实现

目的:提高程序的灵活性和可扩展性、允许使用父类类型的引用来指向子类对象

2、面向对象和面向过程的区别?

面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一 一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发 
(面向过程关心“怎么做”,一步一步把数据喂给函数)

面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤, 而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特 性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。 性能上来说,比面向过程要低

(面向对象关心“谁来做”,把数据和职责打包成对象,让对象之间互相合作)

3、标识符的命名规则?

标识符的含义: 是指在程序中,我们自己定义的内容,譬如,类的名字,方法名称以及变量名称等等,都是标识符

命名规则:(硬性要求) 标识符可以包含英文字母,0-9的数字,$以及_ 标识符不能以数字开头 标识符不是关键字

命名规范:(非硬性要求)

类名规范:首字符大写,后面每个单词首字母大写(大驼峰式) 

变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)

方法名规范:同变量名

(命名规范要做到见名知意)

4、Java的自动装箱和拆箱?

装箱就是自动将基本数据类型转换为包装器类型(int-->Integer)

调用方法:Integer的 valueOf(int) 方法

拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)

调用方法:Integer的 intValue 方法

在通过 valueOf 方法创建 Integer 对象的时候,如果数值在 [-128,127] 之间, 便返回指向IntegerCache.cache 中已经存在的对象的引用;否则创建一个新的Integer对象

(如果数值是-128~127之间,则两个内容指向的是同一对象,如果超过范围,则两个内容指向是不同的对象)

5、重载和重写的区别?

重写(Override)

重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名, 参数列表,返回类型  (除过子类中方法的返回值是父类中方法返回值的子类时) 都相同的情况下, 对方法体进行修改或重写,但要注意子类函数的访问修饰权限不能少于父类的

总结:

  • 发生在父类与子类之间
  • 方法名,参数列表,返回类型必须相同
  • 访问修饰符的限制一定要大于被重写方法的访问修饰(public>protected>default>private)
  • 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
  • 发生在运行时,属于动态绑定

重载(Overload)

在一个类中,同名的方法如果有不同的参数列表则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载

(不同的参数列表:参数类型不同、参数个数不同甚至是参数顺序不同)

总结:

  • 重载Overload是一个类中多态性的一种表现
  • 重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
  • 重载的时候,返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准
  • 发生在编译时,属于静态绑定

6、equals与==的区别?

==:

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是 否是指相同一个对象,比较的是真正意义上的指针操作

== 比的是 “是不是同一块内存”(地址相等))

equals:

equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

equals 比的是 “里面的值是否一样”,除非类没重写 equals,此时退化成 ==

总结:

  • 基本类型只能用 == 比值
  • 引用类型想比“内容”务必用 equals,并把常量写前面防 NPE
  • 阿里规范:所有相等判断全用 equals,禁用 == 比引用

7、String、 StringBuffer 和 StringBuilder 的区别是什么?

String:

String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的 字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成 新的String对象

StringBuffer 和 StringBuilder:

都继承了AbstractStringBuilder 抽象类,他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer 和StringBuilder 来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全

总结:

Spring:不可变、实现原理:final char[ ] 、线程安全(对象只读)、性能慢(重复创建新对象)

适用于字符串内容不会频繁变化的场景,例如少量的字符串拼接操作或字符串常量

StringBuffer:可变、实现原理:可扩容的char[ ]、线程安全(同步锁)、最慢(同步开销)

适用于多线程中频繁修改字符串的场景

StringBuilder:可变、实现原理:可扩容的char[ ]、线程不安全(不加锁)、最快(无同步)

适用于单线程环境中需要大量修改字符串的场景,例如高频拼接操作

8、Collection包结构,与Collections的区别?

Collection:是集合类的上级接口,代表“容器”,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、Set

(Map与 Collection并列,不在其体系内(HashMap、TreeMap等))

Collections(java.util.Collections):是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架

9、Java的四种引用,强弱软虚?

强引用:强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收

软引用:软引用在程序内存不足时,会被回收

弱引用:弱引用就是只要JVM垃圾回收器发现了它,就会将之回收

虚引用:虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中,虚引用大多被用于引用销毁前的处理工作,虚引用创建的时候,必须带有 ReferenceQueue

总结:

  • 强到软:内存不够才放手
  • 弱:GC 路过就带走
  • 虚:人已走,只留影子让你收尸

10、Java创建对象有几种方式?

java中提供了以下四种创建对象的方式:

  • new创建新对象
  • 通过反射机制
  • 用clone机制
  • 通过序列化机制

1、使用 new 关键字:这也是我们平时使用的最多的创建对象的方式,示例:

User user=new User();

2、使用反射方式创建对象:使用 newInstance(),但是得处理两个异常 InstantiationException、

IllegalAccessException

User user=User.class.newInstance();

Object object=(Object)Class.forName("java.lang.Object").newInstance()

3、使用 clone 方法:所以所有对象都有这个方法

4、使用反序列化创建对象:调用 ObjectInputStream 类的 readObject() 方法

11、深拷贝和浅拷贝的区别是什么?

浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指 向原来的对象

换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象

深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向 被复制过的新对象,而不再是原有的那些被引用的对象

换言之,深拷贝把要复制的对象所引用的对象都复制了一遍

  • 浅拷贝:只复制对象本身(第一层属性),不复制嵌套对象。新旧对象共享嵌套对象的引用。

  • 深拷贝:递归复制对象及其所有嵌套对象,完全独立的新对象,不共享任何引用

12、final有哪些用法?

  • 被final修饰的类不可以被继承
  • 被final修饰的方法不可以被重写
  • 被final修饰的变量不可以被改变,如果修饰引用,那么表示引用不可变,引用指向的内容可变
  • 被final修饰的方法,JVM会尝试将其内联,以提高运行效率
  • 被final修饰的常量,在编译阶段会存入常量池中

13、Java 中 final、finally 和 finalize 各有什么区别?

final:用于修饰类、方法、和变量,主要用来设计不可变类、确保类的安全性、优化性能(编译器优化)
fina1ly:与 try-catch 语句块结合使用,用于确保无论是否发生异常,finally 代码块都会执行。
主要用于释放资源(如关闭文件、数据库连接等),以保证即使发生异常,资源也会被正确释放
finalize():是 0bject 类中的方法,允许对象在被垃圾回收前进行清理操作
较少使用,通常用于回收非内存资源 (如关闭文件或释放外部资源),但不建议依赖于它,因为JM 不保证 finalize()会被及时执行

14、static都有哪些用法?

static关键字这两个基本的用法:静态变量和静态方法,也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享

除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作

此外static也多用于修饰内部类,此时称之为静态内部类

最后一种用法就是静态导包,即 import static .import static 是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名

总结:static 可以用于静态方法,静态变量,静态块,静态内部类,静态导包

15、try catch finally,try里有return,finally还执行么?

处理Java异常:

try --catch --finally

try:负责监控可能出现异常的代码

catch:捕获可能出现的异常并解决

finally:清理各种资源

结论:执行,并且finally的执行早于try里面的return

1、不管有木有出现异常,finally块中代码都会执行

2、当try和catch中有return时,finally仍然会执行

3、finally 是在return 后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的 值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数 返回值是在finally执行前确定的

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

唯一“不会执行”的极端场景:

1、调用 System.exit(int) 杀掉整个 JVM 进程

2、当前线程被 Thread.stop()(已废弃)或 kill -9 级信号强制终止

3、机器断电、操作系统崩溃

16、Excption与Error包结构?

Java可抛出(Throwable)的结构分为三种类型:

被检查的异常(CheckedException)、运行时异常(RuntimeException)、错误(Error)

1、运行时异常(非检查型异常 unchecked)

定义:RuntimeException 及其子类都被称为运行时异常

包:java.long.RuntimeException

特点:Java编译器不会检查它,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用 try-catch 语句捕获它",还是会编译通过

常见的运行时异常:ClassCastException(类转换异常)、IndexOutOfBoundsException(数组越界)、NullPointerException(空指针异常)、ArrayStoreException(数据存储异常,操作数组是类型不一致)、BufferOverflowException

2、被检查异常 (已检查异常 checked)

定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常

特点:Java编译器会检查它。 此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕 获处理,否则不能通过编译

被检查异常通常都是可以恢复的,如:IOException、FileNotFoundException、SQLException

3、错误

定义:Error类及其子类

包:java.long.Error

特点:和运行时异常一样,编译器也不会对错误进行检查

当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修 复这些错误的。如:OutOfMemoryError、StackOverflowError、VirtualMachineError

17、throw 和throws的区别?

  • throw:一条执行语句,负责在方法体内当场生成并抛出一个异常对象,使程序立即从正常流程跳转到异常处理流程

  • throws:一条方法签名修饰符,写在参数列表之后,用来声明该方法可能抛出哪些受检异常,把处理义务甩给调用者

一句话总结:throw 负责“出事”,throws 负责“贴告示”;一个动手,一个动口

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

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

(transient = 临时,无需序列化)

transient 关键字的作用是:

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

19、a=a+b与a+=b有什么区别吗

在Java这类强类型语言中,a=a+b 与 a+=b 并不总等价

区别:

a+=b,自带隐式强制类型转换,把结果转成左侧变量a 的类型再赋值

a=a+b,没有这层自动转换,编译器按普通表达式规则检查类型,通不过就报错

总结一句话:a += b 是“先加完再悄悄强转”,a = a + b 是“加完算数,类型不对就报错”

20、说说Java 中 IO 流?Java 中 IO 流分为几种:

按照流的流向分,可以分为输入流和输出流

按照操作单元划分,可以划分为字节流和字符流

按照流的角色划分为节点流和处理流

Java Io 流共涉及 40 多个类,此之间存在非常紧密的联系,这些类都是从如下 4 个抽象类基类中派生出来:

InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流

OutputStream/Writer:所有的输出流的基类,前者是字节输出流,后者是字符输出流

21、Java IO与 NIO的区别?

NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标 准输入输出NIO,另一套就是网络编程NIO

22、Object 有哪些常用方法?大致说一下每个方法的含义

java.long.Object

clone 方法

保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出CloneNotSupportedException 异常,深拷贝也需要实现 Cloneable,同时其成员变量为引用类型 的也需要实现 Cloneable,然后重写 clone 方法

finalize 方法

该方法和垃圾收集器有关系,判断一个对象是否可以被回收的最后一步就是判断是否重写了此方 法

equals 方法

该方法使用频率非常高,一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的

子类一般都要重写这个方法

hashCode 方法

该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法,这个方法在一些具有哈 希功能的 Collection 中用到

一般必须满足 obj1.equals(obj2)==true ,可以推出 obj1.hashCode()==obj2.hashCode() ,但是

hashCode 相等不一定就满足 equals,不过为了提高效率,应该尽量使上面两个条件接近等价

wait 方法

配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥 有者,也就是具有该对象的锁。wait() 方法一直等待,直到获得锁或者被中断。wait(long timeout) 设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生

notify 方法

配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是给 抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)

notifyAll 方法

配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程

23、java反射的作用于原理?

1、定义:

反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象, 都能够调用它的任意一个方法

在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息

2、哪里会用到反射机制

JDBC 就是典型的反射,如hibernate,struts等框架使用反射实现

Class.forName('com.mysql.jdbc.Driver.class');     /加载MySQL的驱动类

3、反射的实现方式

第一步:获取Class对象,有4中方法:

1)Class.forName(“类的路径”)

2)类名.class

3)对象名.getClass()

4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象

4、实现Java反射的类

1)Class:表示正在运行的Java应用程序中的类和接口 。注意: 所有获取对象的信息都需要Class类来实现

2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限

3)Constructor: 提供关于类的单个构造方法的信息以及它的访问权限

4)Method:提供类或接口中某个方法的信息

http://www.dtcms.com/a/531987.html

相关文章:

  • 有哪几个网站可以做贸易网站备案要多少天
  • 【编程语言】Java基础语法回顾,大学期末考试速通版(选择填空、程序、实践)
  • Redis(85)Redis缓存与Memcached缓存有何区别?
  • 【iOS】自动引用计数(一)
  • 有什么免费的网站wordpress 采集器
  • 网站建设创新成果网站营销如何做
  • 设计模式-享元模式(Flyweight)
  • TMS320C6000 VLIW架构并行编程实战:加速AI边缘计算推理性能
  • 算法学习记录08——并归的应用(LeetCode[315])
  • 【机器人学中的状态估计】3.6.6 习题证明
  • Kafka生产者详解(下):数据去重(幂等性)与数据有序
  • Data Ingestion: Architectural Patterns
  • 网站建设心得体会范文郑州男科医院排行哪家最好
  • 【datawhale秋训营】动手开发RAG系统(应急安全方向) TASK02
  • 怎么搜索整个网站内容网站怎么做成app
  • Python3 集合
  • 九冶建设有限公司官方网站sem优化怎么做
  • MATLAB基于灰靶决策模型的高校信息化设备供应商选择研究
  • java类与对象
  • AI 应用层革命(一)——软件的终结与智能体的崛起
  • Linux Crontab命令详解:轻松设置周期性定时任务
  • beef-xss网页无法访问
  • JavaEE初阶——多线程(3)线程安全
  • AI 开发告别 “孤岛”:MCP + 火山引擎
  • 做网站怎么开发程序建设网站改版
  • 招生管理平台需求分析文档
  • 设计模式-代理模式(Proxy)
  • Apache IoTDB(8):时间序列管理——从创建到分析的实战指南
  • IntelliJ IDEA 四种项目构建:从普通 Java 到 Maven Web 项目
  • 深入浅出数据结构:堆的起源、核心价值与实战应用