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

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

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

前言

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

问题

    • 说一下`finally`吧
    • 说一下`public`吧
    • 静态成员和静态方法是什么
    • 说一下`abstract`
    • java的内存模型
    • 什么是原子性
    • 什么是可见性
    • 什么是有序性
    • volatile到底做了什么
    • 基本数据类型
    • 什么是内部类
    • 静态内部类里面一定是静态方法吗
    • 静态方法可以不可以使用非静态变量
    • 抽象方法可以不可以有函数体
    • 说一下抽象类和接口

说一下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内存模型中的主要概念包括:

  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

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

相关文章:

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

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

概率论几种易混淆的形式

正态分布标准型 x − μ σ \frac{x - \mu}{\sigma} σx−μ​ 大数定律形式 P { X ≤ ∑ i 1 n x i − n μ n σ 2 } ∫ − ∞ X 1 2 π e − x 2 2 d x P\{X \le \frac{\sum_{i 1}^{n}x_i -n\mu}{\sqrt{n\sigma^2}} \} \int _{-\infty}^{X}\frac{1}{\sqrt{2\pi}}e^{-\fr…...

PyTorch数据增强后的结果展示

from PIL import Image import torch from torchvision import transformstrans transforms.Compose([transforms.ToTensor(), transforms.RandomErasing(p0.9, value 120, inplaceTrue)]) # 这里Compose是所做的变换img_path 02-56-45-060-1454-camra1.bmp img Image.open…...

指定程序在哪个GPU上运行

摘要: 当本地(或服务器)有个多个GPU时,需要指定程序在指定GPU上运行,需要做以下设置。 目录 一、在终端上指定GPU二、在程序中指定GPU三、系统变量指定GPU四、pytorch中指定GPU 一、在终端上指定GPU 在终端运行程序时…...

Linux CentOS7 vim多文件编辑

使用vim编辑多个文件,十分常用的操作。本文从打开、显示、切换文件到退出,进行简单讨论。 一、打开文件 1.一次打开多个文件 vim还没有启动的时候,在终端里输入vim file1 file2 … filen便可以打开所有想要打开的文件。 执行命令 vim fil…...

PAT甲级真题1153: 解码PAT准考证

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...

linux信号

title: linux信号 createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linux tags: SIGHUP 终止进程 终端线路挂断[喝小酒的网摘]http://blog.hehehehehe.cn/a/16999.htm SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生…...

JavaWeb开发-05-SpringBootWeb请求响应

一.请求 1.Postman 2.简单参数 ​ package com.wjh.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/** 测试请求参数接受*/ R…...

Ubuntu下载

参考文档: 镜像文件:VMware下安装ubuntu 16.04(全步骤)_vmwaubuntu-16.04.4-desktop-amd64.iso_ST0new的博客-CSDN博客 vmware tools使用安装:VMware——VMware Tools的介绍及安装方法_William.csj的博客-CSDN博客 …...

Vue 的组件加载顺序和渲染顺序

1、结论先行 组件的加载顺序是自上而下的,也就是先加载父组件,再递归地加载其所有的子组件。 而组件渲染顺序是按照深度优先遍历的方式,也就是先渲染最深层的子组件,再依次向上渲染其父组件。 2、案例 下面是一个简单的示例代…...

leetcode Top100(17)矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…...

论文精读(2)—基于稀疏奖励强化学习的机械臂运动规划算法设计与实现(内含实现机器人控制的方法)

目录 1.作者提出的问题及解决方向 2.延深-用如何用强化学习对机器人进行控制 2.1思路 2.2DQN和DDPG在机器人控制中的应用 3.解决方案 3.1思路 3.2实验 3.3创新点 4.展望 1.作者提出的问题及解决方向 目的:使机械臂在非结构化环境下实现端到端的自主学习控制…...

快速安装keepalive

快速安装keepalive #安装 yum install keepalived -y# 查看版本: rpm -q -a keepalived#修改配置文件 vim /etc/keepalived.conf虚拟 ip :随意选一个,不被占用的ip即可。...

nginx实现反向代理实例

1 前言 1.1 演示内容 在服务器上访问nginx端口然后跳转到tomcat服务器 1.2 前提条件 前提条件:利用docker安装好nginx、tomcat、jdk8(tomcat运行需要jdk环境) 只演示docker安装tomcat: 默认拉取最新版tomcat docker pull t…...

使用Freemarker填充模板导出复杂Excel,其实很简单哒!

文章目录 1. 需求分析2. 对象生成3. 列表插值4. 另存xml格式化5. ftl修改6. 程序转化7. 犯的错误8. 总结 1. 需求分析 类似这样的一个表格 我们需要从数据库中查询对应的数据,将其汇总进该表格,并且可能还需要复制表格项,我这个案例中没有&a…...

windows环境下安装logstash同步数据,注册系统服务

windows环境下安装logstash同步数据,注册系统服务 此方法适用于Windows环境,同一个配置文件配置多个管道,并且配置系统服务,防止程序被杀进程 一、安装logstash (1)下载压缩包,解压后修改con…...

java服务内存说明及配置详解

java进程内存 JVM内存分布图: 【java进程内存】【堆外内存】 【jvm堆内存】 【堆外内存】 【Metaspace】 【Direct Memory】【JNI Memory】【code_cache】 … 堆外内存泄漏的排查在于【本地内存(Native Memory)】【Direct Memory】【JNI Memory】 一般…...

Mybatis-MyBatis的缓存

Mybatis-MyBatis的缓存 一、MyBatis的一级缓存二、MyBatis的二级缓存二级缓存的相关配置 三、MyBatis缓存查询的顺序 一、MyBatis的一级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从…...

计算机组成原理之硬件的基本组成,深入介绍两大计算机结构体系,从底层出发认识计算机。

大家好,欢迎阅读《计算机组成原理》的系列文章,本系列文章主要的内容是从零学习计算机组成原理,内容通俗易懂,大家好好学习吧!!! 更多的优质内容,请点击以下链接查看哦~~ ↓ ↓ ↓ …...

二十五、MySQL事务的四大特性和常见的并发事务问题

1、事务的四大特性 2、常见的并发事务问题 (1)并发事务问题分类: (2)脏读: 一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状态;…...

辨析常见的医学数据分析(相关性分析回归分析)

目录 1 常见的三种分类结果? 2 什么是相关性分析? 相关性分析的结果怎么看? 3 什么是回归分析? 1)前提 2)常见的回归模型 4 对于存在对照组实验的医学病例如何分析? 1)卡方检验…...

SpringBoot项目中只执行一次的任务写法

SpringBoot项目中只执行一次的任务写法 有时候我们需要进行初始化工作,就说明只要进行一次的工作,那么,在Springboot项目中如何做到任务只进行一次呢 利用定时任务 在Spring Boot项目中,你可以使用Spring框架提供的Scheduled注解…...

TCK、TMS、TDI、TDO的含义

这四个信号是JTAG(Joint Test Action Group)界面的一部分。JTAG是一种用于测试和验证集成电路和印刷电路板的技术,也用于进行设备编程和调试。这四个信号分别是: TCK (Test Clock): 意义:测试时钟&#xff…...

R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...

全文链接:http://tecdat.cn/?p24456 如果你正在进行统计分析:想要加一些先验信息,最终你想要的是预测。所以你决定使用贝叶斯(点击文末“阅读原文”获取完整代码数据)。 相关视频 但是,你没有共轭先验。你…...

【PowerShell】PowerShell的Core版本的额外配置

在PowerShell 7.1 安装完成后,默认情况下打开PowerShell 会直接进入到系统内置的PowerShell,如果希望通过远程连接或者PowerShell Web Access 进入到PowerShell 7环境的界面,就需要进行环境的再配置才能实现PowerShell 7.1 的环境连接。需要为外部的环境提供连接的话需要按照…...

数据结构----链式栈

目录 前言 链式栈 操作方式 1.存储结构 2.初始化 3.创建节点 4.判断是否满栈 5.判断是否空栈 6.入栈 7.出栈 8.获取栈顶元素 9.遍历栈 10.清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法,(链接:线性表-----栈(栈…...

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是,过去以为AI智能化、大模型技术是很高深的事情。但现在,我们通过RPA等数字化工具,自主根据自己的工作岗位,完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…...

upload-labs文件上传1-5关

第一关 编写一句话木马1.php,编写完成后将后缀名修改为png 将1.png上传,上传时使用bp抓包 抓包后将后缀名修改为png 连接蚁剑 第二关 上传1.php,显示文件类型不正确 使用bp抓包发送重发器,修改文件后缀名后点击发送,…...

git的基本使用

查看当前分支 git branch //查看本地分支 git branch -a // 查看本地和远程的分支切分支 git checkout -b 分支的名字从当前分支切换到其他分支 拉取远程分支到本地 拉取远程develop分支代码到本地develop分支 git checkout -b develop origin/developgit merge B分支合并…...

Mac台式电脑内存清理方法教程

对于一些小白用户,如果觉得以上的清理方法比较复杂却又想要更好的优化Mac电脑内存,专业的系统清理软件是一个不错的选择。比起花几个小时时间浏览文件夹、删除临时文件、缓存和卸载残留。Cleanmymac X,只需单击几下即可完成所有内存清理工作&…...

邢台网站制作哪里做/大连seo网站推广

前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式 [本文]RabbitMQ六种队列模式-主题模式 本文带大家了解 RabbitMQ 队列模式中的路由模式。 其实只要看过上篇发布模式后,相信路由模式上…...

wordpress 编辑器/建个人网站的详细步骤

日期:2004-06-24 作者:chen123 配置要求:IIS(win2000 server 自带)、Java 2 SDK 1.4.2 (或更高版本)、Tomcat Web Server 连接器、 Tomcat 5.0.24 (或更高版本) 准备 一、Java 2 SDK 1.4.2 (或更高版本)…...

java做的网站/不受限制的搜索引擎

文章目录对称二叉树二叉树的镜像二叉树的层序遍历0102判断一个二叉树是否为完全二叉树二叉树的拓展问题对称二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeN…...

网站制作无锡/企业品牌策划

下面小编就为大家带来一篇PHP调用API接口实现天气查询功能的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧天气预报查询接口API,在这里我使用的是国家气象局天气预报接口使用较多的还有:新浪…...

网站架构图怎么做/市场调研一般怎么做

1.RIP基于UDP,BGP基于TCP,OSPF和EIGRP基于IP。这些在TCP/IP协议栈中定义的路由协议用于发现和维护前往目的地的最短路径。你可以认为它们不属于网络层协议(注意,是用,based on,而不是实现了,BGP用TCP&#…...

购物节优惠卷网站怎么做/广州疫情今天最新消息

这里为什么要写ef和mysql的使用,ef默认连接的sqlserver ,使用起来可能会比较顺手,ef和mysql使用的时候会出现各种问题,所以这里就搞mysql,要有一颗勇于出错的心。秉着不畏艰难的精神开始了ef和mysql之旅。ef和mysql的配…...