Java面试被问了几个简单的问题,却回答的不是很好

这篇具有很好参考价值的文章主要介绍了Java面试被问了几个简单的问题,却回答的不是很好。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:逍遥Sean
简介:一个主修Java的Web网站\游戏服务器后端开发者
主页:https://blog.csdn.net/Ureliable
觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言!

前言

前几天参加了一个做web开发的面试,被问了几个问题,虽然有些题目比较偏,但是确实是Java开发必须了解的内容。我觉得比较简单的问题,却回答的不是很好,事后总结一下~

说一下finally吧

Java的finally关键字是用于定义在try/catch语句块中必须执行的代码块。不论是否有异常抛出,finally块都会被执行。通常在finally块中释放资源,如关闭文件、释放数据库连接等。finally块也可以用于判断try块中的异常是否被捕获和处理了,从而调用其他方法或抛出异常。finally块可以在try块和catch块之后添加,但只能有一个finally块。例如:

try {
  // 执行代码
} catch(Exception e) {
  // 处理异常
} finally {
  // 释放资源
}

说一下public吧

  1. 在Java中,public是一个访问修饰符,它用于指定一个类、方法或变量可以从任何其他类或代码中访问。
  2. 使用public修饰的类、方法或变量可以被任何其他的类或代码访问,而不限于同一个包。
  3. 对于面向对象编程来说,public是最常用的访问修饰符之一。
  4. Java一个源程序只能有一个public类存在,且类名与文件名相同。
  5. Java程序是从main方法开始执行的,public为类加载器提供入口,然后找到public类中的main方法开始执行。如果存在多个public类,程序将不知道该从哪里执行。
  6. 注意,内部类可以是public的,因为内部类是作为外部类的成员存在的。

静态成员和静态方法是什么

简单来讲:静态成员和静态方法,可以直接通过类名进行调用;其他的成员和方法则需要进行实例化成对象之后,通过对象来调用。

Java的静态成员和静态方法都是属于类而不是对象的,因此不需要实例化类就可以直接访问它们。静态成员通常用于保存所有实例共享的数据,而静态方法通常用于提供不依赖于对象状态的功能。

静态成员可以通过以下方式声明:

public class MyClass {
    public static int staticVariable;
    public static void staticMethod() {
        // do something
    }
}

静态成员可以通过类名直接访问,如下所示:

int i = MyClass.staticVariable;
MyClass.staticMethod();

注意到静态方法中不能访问非静态成员,因为非静态成员必须依赖于对象状态,而静态方法不依赖于对象状态。

说一下abstract

Java中的abstract是一个关键字,用于修饰类、方法或者成员变量。用abstract修饰的类称为抽象类,用abstract修饰的方法称为抽象方法,用abstract修饰的成员变量称为抽象成员变量。

抽象类是一种特殊的类,不能被实例化,只能被继承。抽象类中可以包含抽象方法和非抽象方法,抽象方法是没有实现的方法,需要子类去实现。

抽象方法必须在抽象类中声明,不能在普通类中声明。子类继承抽象类时,必须实现抽象方法,否则子类也必须是抽象类。

抽象成员变量必须被子类实现,否则子类也必须是抽象类。抽象成员变量必须以分号结尾,不可定义为private、static、final或native类型。
使用abstract应注意

  • abstract不能与final并列修饰同一个类 对的;
  • abstract类中不应该有private的成员 对的 :abstract类中可以有private 但是不应该有;
  • abstract方法必须在abstract类或接口中 对的 : 若类中方法有abstract修饰的,该类必须abstract修改。接口方法默认public abstract
  • static方法中能处理非static的属性 错误 :在JVM中static方法在静态区,静态区无法调用非静态区属性。

java的内存模型

Java的内存模型(Java Memory Model,JMM)指定了Java虚拟机如何管理内存和线程之间的交互。它定义了在多线程环境下共享变量的可见性和顺序性保证,以及线程之间的同步和互斥机制。
Java内存模型规定了所有的变量都存储在主内存中,但是每个线程会有自己的工作内存,线程的工作内存保存了该线程中使用了的变量(从主内存中拷贝的),线程对变量的操作都必须在工作内存中进行,不同线程之间无法直接访问对方工作内存中的变量,线程间变量值从传递都要经过主内存完成

Java面试被问了几个简单的问题,却回答的不是很好,面试问题,面试,职场和发展,java
Java内存模型中的主要概念包括:

  1. 主内存:Java虚拟机中所有线程所共享的内存区域,用于存储所有变量的值。
  2. 工作内存:每个线程独立拥有的内存区域,用于读写变量的值。线程之间不能直接访问对方的工作内存,所有的变量值都要先从主内存中读取到工作内存中,再进行操作。
  3. 内存屏障:Java虚拟机提供的一种同步机制,用于保证内存操作的可见性和顺序性。

Java内存模型中规定了以下规则:

  1. 原子性:对于基本数据类型如int和long,读写操作具有原子性。对于引用类型和一些复合操作,如i++,并不具有原子性。
  2. 可见性:一个线程修改了变量的值,另一个线程必须能够看到变量的最新值。JMM通过内存屏障来保证可见性。
  3. 顺序性:在没有使用同步机制的情况下,JMM不能保证代码的执行顺序,可能会出现指令重排等情况。使用volatile和synchronized等机制可以保证代码的顺序性。
  4. 原则上不保证读线程能够获得写线程的最新值。使用volatile保证了变量的可见性和顺序性。
  5. 线程操作内存必须先将内存中的数据拷贝到线程的本地内存中,线程之间的共享变量只能通过主内存来传递。

什么是原子性

简单讲:一个操作是不可中断的,要么全部执行成功要么全部执行失败,比如银行转账

原子性是指一组操作要么全部完成,要么全部不完成,不会出现部分完成的情况,保证操作的完整性和一致性。在多线程编程中,如果一个操作需要被多个线程同时访问,为了保证正确性,必须保证操作的原子性。可以使用同步机制如锁或原子变量等来实现原子性。

什么是可见性

当多个线程访问同一变量时,一个线程修改了这个变量的值,其他线程就能够立即看到修改的值

可见性指的是一个程序中变量在多线程环境下的可见性。当一个变量被一个线程修改后,其他线程是否能够立即看到修改的结果就是可见性问题。如果一个变量的值被修改后,其他线程不能立即看到变量的修改结果,那么就会出现数据不一致的问题。在并发编程中,保证可见性是非常重要的一项技术。常见的解决可见性问题的方式包括使用volatile关键字、synchronized关键字、Lock对象等。

什么是有序性

程序执行的顺序按照代码的先后顺序执行
int a = 0; //1
int b = 2; //2
像这2句代码1会比2先执行,但是jvm在正真执行时不一定是1在2之前,这里涉及一个概念叫做指令重排,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。比如上面的代码语句1和语句2谁先执行对最终的程序结果并没有影响,那么就有可能在执行过程中,语句2先执行而语句1后执行。
在指令重排时会考虑指令之间的数据依赖性,比如2依赖了1的数值,那么处理器会保证1在2之前执行。
但是在多线程的情况下,指令重排就会有影响了。

volatile到底做了什么

在 Java 中,volatile 是一种关键字,用于修饰变量。当一个变量被声明为 volatile
时,它的值可能会被并发修改,因此多个线程之间对该变量的读写操作是相互可见的。 具体来说,当一个线程对一个 volatile
变量进行写操作时,它会强制刷新该变量的值到主内存中,并通知其他线程该变量的值已经发生改变。同理,当一个线程对一个 volatile
变量进行读操作时,它会从主内存中读取最新的值而不是寄存器缓存中的值。因此,volatile 变量的读写操作具有原子性,可以保证线程安全。
需要注意的是,volatile 变量不能保证多个线程对该变量的复合操作(例如 i++)是原子性的,因此对于这类操作,仍然需要使用
synchronized 或者使用原子类来保证线程安全。

volatile实现了以下工作:

  • 禁止了指令重排
  • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的
  • 不保证原子性(线程不安全)

基本数据类型

Java基本数据类型包括八种:

  1. byte(字节型):8位有符号二进制数,取值范围为-128~127。

  2. short(短整型):16位有符号二进制数,取值范围为-32768~32767。

  3. int(整型):32位有符号二进制数,取值范围为-2147483648~2147483647。

  4. long(长整型):64位有符号二进制数,取值范围为-9223372036854775808~9223372036854775807。

  5. float(单精度浮点型):32位IEEE-754标准浮点数。

  6. double(双精度浮点型):64位IEEE-754标准浮点数。

  7. char(字符型):16位Unicode字符,取值范围为0~65535。

  8. boolean(布尔型):true或false。

除了基本数据类型,Java还有引用数据类型,如类、接口、数组等。

什么是内部类

内部类是一个定义在另一个类中的类。它可以访问外部类的成员(包括私有成员),并且可以用来实现一些特定的功能,如事件处理、回调等。内部类的作用主要是为了增强可读性、安全性和封装性。内部类分为成员内部类、局部内部类、匿名内部类和静态内部类等几种类型。

静态内部类里面一定是静态方法吗

不是必须的。静态内部类可以声明静态方法,但也可以声明非静态方法。另外,非静态内部类则不能声明静态方法,因为它已经默认包含了外部类的实例,而静态方法不能访问任何实例变量和实例方法。

静态方法可以不可以使用非静态变量

静态方法不能直接使用非静态变量,因为非静态变量是属于对象实例的,而静态方法是独立于对象实例的。如果要在静态方法中使用非静态变量,需要通过实例化对象来访问非静态变量。或者将非静态变量作为参数传递给静态方法。

抽象方法可以不可以有函数体

抽象方法不能有函数体。抽象方法是一种特殊的方法声明,它没有具体的实现,只有方法名、参数和返回值类型。在Java中,抽象方法必须声明在抽象类中,并且抽象类必须用“abstract”关键字修饰。子类必须覆盖重写所有抽象方法才能被实例化,否则子类也必须是一个抽象类。因此,抽象方法不能有函数体,否则它就不再是一个抽象方法,而是一个普通的方法。

说一下抽象类和接口

  • 一个子类只能继承一个抽象类(虚类),但能实现多个接口;
  • 一个抽象类可以有构造方法,接口没有构造方法;
  • 一个抽象类中的方法不一定是抽象方法,即其中的方法可以有实现(有方法体),接口中的方法都是抽象方法,不能有方法体,只有声明;
  • 一个抽象类可以是public、private、protected、default, 接口只有public;
  • 一个抽象类中的方法可以是public、private、protected、default, 接口中的方法只能是publicdefault

从使用上来说,抽象类适合用于创建一些共性较强的类和方法,而接口则适合用于实现某些特定的行为,以及在不同类之间进行统一的操作。通常情况下,如果需要更好的扩展性和灵活性,应该优先使用接口,如果需要提供一些默认的实现或是定义某些共有的行为,应该优先使用抽象类。文章来源地址https://www.toymoban.com/news/detail-718017.html

到了这里,关于Java面试被问了几个简单的问题,却回答的不是很好的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React超级简单易懂全面的有关问题回答(面试)

    目录 React事件机制: 2、React的事件和普通的HTML有什么不同: - 事件命名的规则不同,原生事件采用全小写,react事件采用小驼峰 3、React组件中怎么做事件代理?他的原理是什么? 4、React高阶组件、Render props、Hook有什么区别,为什么要不断迭代? ✨HOC(高阶组件): ✨Render

    2024年02月02日
    浏览(35)
  • 软件测试培训了几个月,找到工作了,面试经验分享给各位

    功能方面:问的最多的就是测试流程,测试计划包含哪些内容,公司人员配置,有bug开发认为不是 bug怎么处理,怎样才算是好的用例,测试用例设计方法(等价类,边界值等概念方法),包含哪些内 容,怎样保证用例覆盖全面,马上要上线了发现bug怎么处理,怎么判断产品

    2024年02月03日
    浏览(101)
  • 面试题:String s = new String(“xyz“) 创建了几个对象?

    这个问题相信每个学习 java 的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的。 常量池存在于方法

    2024年01月16日
    浏览(27)
  • STM32/单片机企业面试150问,你能回答出来几个?

    1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中21,意思是APB2接高速设备。 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用。 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,

    2024年02月07日
    浏览(38)
  • 4年测试经验面试要20K,简单问了一下,连基础都不会,我也是醉了····

    现在招个合适的人可真难呀,不是这不会就是那不会,没有一个让我满意的··· 公司前段时间缺人,面试了不少的测试,结果居然没有一个符合要求的。一开始瞄准的就是中级测试工程师的水准,也没指望来技术大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失

    2024年02月08日
    浏览(53)
  • Dubbo面试回答简单版

    超时重试机制 地址缓存 多版本 负载均衡:随机、权重轮询、最少活跃调用、一致性哈希 集群容错:失败重试、快速失败、失败安全、失败自动恢复、并行调用、广播 服务降级:异常时返回mock FailOver 失败重试,读操作 FailFast 快速失败,只调用一次,失败后立即抛出异常。

    2024年04月14日
    浏览(26)
  • JavaWeb逐步深入提问(Java后端),你能回答第几个?

    标准回答: Java Web三层架构是一种将Web应用程序划分为三个主要层次的架构模式。这三层分别是表示层(View)、业务逻辑层(Service或Controller)、数据访问层(DAO)。表示层负责用户界面的展示,业务逻辑层处理请求的业务逻辑,数据访问层与数据库进行交互。这种分层架构

    2024年02月09日
    浏览(93)
  • 面试中会被问到的GIT问题解答(含答案)

    在现代软件开发中,Git已经成为了版本控制系统的事实标准。无论是在个人项目还是大型企业级开发中,Git都是不可或缺的工具。因此,掌握Git的基本操作和高级特性对于软件开发者来说是非常重要的。以下是根据提供的文件内容,总结出的30个Git面试中常被问到的问题及其

    2024年04月24日
    浏览(38)
  • Java面试被问Spring哑口无言?100道Spring面试考点解析

    对于开发同学来说,Spring 框架熟悉又陌生。 熟悉:开发过程中无时无刻不在使用 Spring 的知识点;陌生:对于基本理论知识疏于整理与记忆。导致很多同学面试时对于 Spring 相关的题目知其答案,但表达不够完整准确。 今天展示互联网公司Java面试高频常问的100道题及解析!

    2024年02月02日
    浏览(31)
  • 软件测试面试一定会被问到的10个技术问题(附答案)

    本文记得熟读并背诵,99%通过技术二 范例回答: 一般都是让你对一个“书本”“水杯”“电梯”这些老例子做测试用例,这些答案百度一下全部都是,掌握好测试用例的方法,换成什么例子都可以讲的全面。 对方还会根据这个问题衍生出:你觉得什么样算是好测试用例,好

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包