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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux安装配置 flume

目录 一 解压安装包 二 配置部署 (1)修改配置 (2)下载工具 (3)创建配置文件 (4)启动监听测试 (5)flume监控文件 一 解压安装包 这里提供了网盘资源 链…

1688-阿里巴巴批发网(获取商品的名称,价格,图片)

1688 item_get-获得1688商品详情 为了进行电商平台 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个1688 应用注册一个应用程序键(App Key) 。 3)下载1688 API的SDK并掌握基本的API基础…

2种方法,jmeter用一个正则提取器提取多个值!

jmeter中,用json提取器,一次提取多个值,这个很多人都会。但是,用正则提取器一次提取多个,是否可以呢? 肯定,很多人都自信满满的说,可以!形如:token":“…

前端项目练习(练习-005-webpack-03)

学习前,首先,创建一个web-005项目,内容和web-004一样。(注意将package.json中的name改为web-005) 前面的代码中,打包工作已经基本完成了,下面开始在本地启动项目。这里需要用到webpack-dev-serv…

Linux之进程

目录 一、冯诺依曼体系结构 二、进程 1、关于进程 关于PCB结构体 2、查看进程 ①ps ②/proc 3、getpid 4、getppid 5、fork() fork基本用法 6、进程状态 7、孤儿进程 8、进程优先级 修改nice值:top 9、进程的几个特性 一、冯诺依曼体系结构 冯诺依曼体…

2023年汉字小达人区级自由报名明天开赛,3个新问题和往年真题练一练

明天9月25日,备受关注的2023年第十届上海小学生汉字小达人区级自由报名的比赛就要开始了,最近还是有几个“小迷糊”家长刚听说这个活动,问了几个问题,我觉得挺有普遍性的,所以再次给大家回答一下,希望能够帮…

JavaWeb开发-07-MySQL(二)

一.数据库操作-DQL -- 准备测试数据 INSERT INTO tb_emp (id, username, password, name, gender, image, job, entrydate, create_time, update_time) VALUES (1, jinyong, 123456, 金庸, 1, 1.jpg, 4, 2000-01-01, 2022-10-27 16:35:33, 2022-10-27 16:35:35), (2, zhangwuji…

VUE使用DXFParser组件解析dxf文件生成图片

<template><div><input type"file" change"handleFileChange" /></div><el-table :data"tableData" style"width: 100%"><el-table-column prop"Control_No" label"序号" width…

Ubuntu 安装Nacos

1、官网下载最新版nacos https://github.com/alibaba/nacos/releases 本人环境JDK8&#xff0c;Maven3.6.3&#xff0c;启动Nacos2.2.1启动失败&#xff0c;故切换到2.1.0启动成功 2、放到服务器目录下&#xff0c;我的在/home/xxx/apps下 3、解压 $ tar -zxvf nacos-serve…

【计算机视觉】2.图像特征提取

图像特征提取 一、颜色特征量化颜色直方图聚类颜色直方图 二、边缘特征边缘边缘定义边缘提取边缘精细 三、特征点的特征描述子Harris角点FAST角点斑点SIFTHaar-like特征SURFORBLBPGabor 一、颜色特征 量化颜色直方图 HSV空间 优势&#xff1a;计算高效 劣势&#xff1a;量化问…

Linux基本操作符(1)

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 Linux的登录 Linux下基本指令 指令操作的理解 几个与用户操作符 ls 指令 pwd命令 cd 指令 touch指令 mkdir指令 rmdir指令 && rm 指令 什么叫操作系统&#xff0c;我相信如果是学计算机的都听说过&…

SpringBoot 学习(九)Redis

11. 集成 Redis 11.1 说明 SpringBoot 操作数据&#xff1a;sping-data、jpa、jdbc、mongodb、redis SpringBoot 2. 后&#xff0c;jedis 被替换为 lettuce jedis&#xff1a;采用直连&#xff0c;多线程操作不安全&#xff0c;增强安全性需使用 jedis pool 连接池&#xff0…

Java --- MySQL8之索引优化与查询优化

目录 一、索引失效场景 1.1、全值匹配 1.2、最佳左前缀规则 1.3、主键插入顺序 1.4、计算、函数、类型转换(自动或手动)导致索引失效 1.5、类型转换导致索引失效 1.6、范围条件右边的列索引失效 1.7、不等于(! 或者<>)索引失效 1.8、is null可以使用索引&…

vue3中的watch可能是比watchEffect更好的选择

vue3中的watch可能是比watchEffect更好的选择 vue 最强大的功能之一是能够根据基本数据的变化来执行响应式副作用。为此&#xff0c;vue3提供两个方法&#xff1a;watch 和 watchEffect 。虽然两个方法都可以监控响应式数据的变化&#xff0c;但他们有不同的使用方式和行为。本…

Go语言中的自定义函数类型

函数类型的基本概念 在Go语言中&#xff0c;函数类型是一种将函数作为值的数据类型。与其他类型一样&#xff0c;函数类型可以被声明、赋值给变量&#xff0c;作为参数传递和作为返回值返回。通过函数类型&#xff0c;我们可以将函数看作一种可执行的对象&#xff0c;对其进行…

asp.net企业生产管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 企业生产管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 二、功能介绍 (1)用户管理&…

Spring学习笔记11 GoF代理模式

Spring学习笔记10 JdbcTemplate_biubiubiu0706的博客-CSDN博客 新建个maven模块 static-proxy 演示静态代理 订单接口 测试 需求:统计每个业务方法的耗时 package com.example.proxy.service;/*** author hrui* date 2023/9/25 8:42*/ public class OrderServiceImpl implem…

分布式网络在移动医疗场景中的应用

随着医疗信息化建设实践的深入&#xff0c;越来越多的医疗机构开始借助网络信息技术改善其运营及管理模式&#xff0c;为患者提供更高质量、更高效率、更加安全体贴的医疗服务。移动医疗便是在此背景下产生的新业务需求。 常见的移动医疗场景 住院部&#xff1a;移动查房、智…

Java案例:判断质数

需求&#xff1a;键盘录入一个数&#xff0c;判断是否是质数 分析&#xff1a;从2到number-1开始循环&#xff0c;判断是否有数字能被number整除 import java.util.Scanner;public class demo {public static void main(String[] args){Scanner sc new Scanner(System.in);S…

使用JavaScript将数字格式化成千分位的n种方法

1,使用数组方法: 1) 数字转字符串,字符串按照小数点.分割 2) 整数部分拆分成字符串数组,并倒叙 3) 遍历, 按照每三位添加逗号,号 4) 拼接整数部分小数部分 function format_width_array(number) { // 将数字转换为千分位字符串const arr String(number).split(.);// 整数…