java基础面试

java基础

1.抽象类和接口

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口,接口也可以继承多个接口。

结口的设计目的是对类的行为进行约束,可以强制要求不同的类具有相同的行为。

抽象类的设计目的是代码复用,当不同的类具有相同的行为时,可以让这些类都派生于一个抽象类。

2.final,finally,finalize()

2.1 final

  • 修饰类:表示类不可以被继承。
  • 修饰方法: 表示方法不可被子类覆盖,但是可以重载(重载肯定是本类)。
  • 修饰变量:表示变量一旦被赋值就不可以更改他的值。

修饰成员变量:

  1. 如果final修饰的是类变量,只能在静态代码块中指定初始值或者声明该变量的时候赋初始值。
  2. 如果final修饰的是成员变量,可以在非静态代码块,声明该变量或者构造器中赋初始值。

修饰局部变量:

  1. 修饰局部变量,系统不会为局部变量赋初值,局部变量必须由程序员显示的指定初始值。

修饰基本类型数据和引用类型数据

  • 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改。
  • 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个方向。但是引用的值是可变的。

2.2finally

finally异常处理的一部分,它只能用在try/catch语句中,表示希望finally语句块中的代码最后一定被执行。

2.3finalize()

是在java.lang.Object里定义的,对象被回收时会被调用。

3.原生类

原生类指的是基本数据类型。

4.装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

装箱转换是指将一个值类型转换成一个对象类型,拆箱是指将一个对象类型转化为值类型。

使用场景:

但是,在某些时候,基本数据类型会有一些制约,例如当有个方法需要Object类型的参数,但实际需要的值却是2、3等数值,这就比较难以处理了。因为,所有引用类型的变量都继承了Object类,都可当成Object类型变量使用,但基本数据类型的变量就不可以了。

类型转换:

boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换),或则,将编译出错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fp1WZ0WX-1636121884349)(/Users/suhang/Library/Application Support/typora-user-images/image-20210901211502135.png)]

byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。

当对小于int的数据类型(byte, char, short)进行运算时,首先会把这些类型的变量值强制转为int类型进行计算,最后会得到int类型的值。因此,如果把2个short类型的值相加,最后得到的结果是int类型,如果需要得到short类型的结果,就必须显示地运算结果转为short类型。

5.BIO,NIO,AIO区别

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

  • 同步阻塞BIO:线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。
  • 同步非阻塞NIO:线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。
  • 异步非阻塞AIO:线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败。

首先我们了解下,同步,异步阻塞的概念:

同步与异步

  • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
  • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

阻塞和非阻塞

  • 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
  • 非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

那么同步阻塞、同步非阻塞和异步非阻塞又代表什么意思呢?

举个生活中简单的例子,你妈妈让你烧水,小时候你比较笨啊,在哪里傻等着水开(同步阻塞)。等你稍微再长大一点,你知道每次烧水的空隙可以去干点其他事,然后只需要时不时来看看水开了没有(同步非阻塞)。后来,你们家用上了水开了会发出声音的壶,这样你就只需要听到响声后就知道水开了,在这期间你可以随便干自己的事情,你需要去倒水了(异步非阻塞)。

计算机网络
Java基础
垃圾回收
IO流
Mysql
异常
Spring

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你复习Java基础面试题。以下是一些常见的Java基础面试题及其答案: 1. Java中的基本数据型有哪些? 答:Java中的基本数据型包括byte、short、int、long、float、double、boolean和char。 2. Java中的包装是什么? 答:包装是一种将基本数据型封装成对象的方式。Java提供了对应于每个基本数据型的包装,如Integer、Double、Boolean等。 3. Java中的String是可变的吗? 答:String是不可变的,即一旦创建就不能被修改。如果需要对字符串进行修改操作,可以使用StringBuilder或StringBuffer。 4. Java中的final关键字有什么作用? 答:final关键字可以用来修饰、方法和变量。当修饰时,表示该不能被继承;当修饰方法时,表示该方法不能被重写;当修饰变量时,表示该变量的值不能被修改。 5. Java中的抽象和接口有什么区别? 答:抽象是一种不能被实例化的,它可以包含抽象方法和非抽象方法。接口是一种完全抽象的,它只能包含抽象方法和常量。一个可以实现多个接口,但只能继承一个抽象。 6. Java中的异常处理机制是什么? 答:Java中的异常处理机制通过try-catch-finally语句块来实现。当可能发生异常的代码放在try块中,如果发生异常,则会被catch块捕获并进行处理,最后无论是否发生异常,都会执行finally块中的代码。 7. Java中的多线程是如何实现的? 答:Java中实现多线程有两种方式,一种是继承Thread,另一种是实现Runnable接口。通过重写Thread的run()方法或实现Runnable接口的run()方法来定义线程的执行逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值