地方行业网站,零售户订烟电商网站,建设银行官网的网站首页,公司注册费用与流程作者#xff1a;逍遥Sean 简介#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话#xff0c;可以三连支持一下~ 如有需要我的支持#xff0c;请私信或评论留言#xff01; 前言 前几天参加了… 作者逍遥Sean 简介一个主修Java的Web网站\游戏服务器后端开发者 主页https://blog.csdn.net/Ureliable 觉得博主文章不错的话可以三连支持一下~ 如有需要我的支持请私信或评论留言 前言 前几天参加了一个做web开发的面试被问了几个问题虽然有些题目比较偏但是确实是Java开发必须了解的内容。我觉得比较简单的问题却回答的不是很好事后总结一下~ 问题 说一下finally吧说一下public吧静态成员和静态方法是什么说一下abstractjava的内存模型什么是原子性什么是可见性什么是有序性volatile到底做了什么基本数据类型什么是内部类静态内部类里面一定是静态方法吗静态方法可以不可以使用非静态变量抽象方法可以不可以有函数体说一下抽象类和接口 说一下finally吧
Java的finally关键字是用于定义在try/catch语句块中必须执行的代码块。不论是否有异常抛出finally块都会被执行。通常在finally块中释放资源如关闭文件、释放数据库连接等。finally块也可以用于判断try块中的异常是否被捕获和处理了从而调用其他方法或抛出异常。finally块可以在try块和catch块之后添加但只能有一个finally块。例如
try {// 执行代码
} catch(Exception e) {// 处理异常
} finally {// 释放资源
}说一下public吧
在Java中public是一个访问修饰符它用于指定一个类、方法或变量可以从任何其他类或代码中访问。使用public修饰的类、方法或变量可以被任何其他的类或代码访问而不限于同一个包。对于面向对象编程来说public是最常用的访问修饰符之一。Java一个源程序只能有一个public类存在且类名与文件名相同。Java程序是从main方法开始执行的public为类加载器提供入口然后找到public类中的main方法开始执行。如果存在多个public类程序将不知道该从哪里执行。注意内部类可以是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 abstractstatic方法中能处理非static的属性 错误 在JVM中static方法在静态区静态区无法调用非静态区属性。 java的内存模型
Java的内存模型Java Memory ModelJMM指定了Java虚拟机如何管理内存和线程之间的交互。它定义了在多线程环境下共享变量的可见性和顺序性保证以及线程之间的同步和互斥机制。 Java内存模型规定了所有的变量都存储在主内存中但是每个线程会有自己的工作内存线程的工作内存保存了该线程中使用了的变量从主内存中拷贝的线程对变量的操作都必须在工作内存中进行不同线程之间无法直接访问对方工作内存中的变量线程间变量值从传递都要经过主内存完成 Java内存模型中的主要概念包括 主内存Java虚拟机中所有线程所共享的内存区域用于存储所有变量的值。工作内存每个线程独立拥有的内存区域用于读写变量的值。线程之间不能直接访问对方的工作内存所有的变量值都要先从主内存中读取到工作内存中再进行操作。内存屏障Java虚拟机提供的一种同步机制用于保证内存操作的可见性和顺序性。 Java内存模型中规定了以下规则 原子性对于基本数据类型如int和long读写操作具有原子性。对于引用类型和一些复合操作如i并不具有原子性。可见性一个线程修改了变量的值另一个线程必须能够看到变量的最新值。JMM通过内存屏障来保证可见性。顺序性在没有使用同步机制的情况下JMM不能保证代码的执行顺序可能会出现指令重排等情况。使用volatile和synchronized等机制可以保证代码的顺序性。原则上不保证读线程能够获得写线程的最新值。使用volatile保证了变量的可见性和顺序性。线程操作内存必须先将内存中的数据拷贝到线程的本地内存中线程之间的共享变量只能通过主内存来传递。 什么是原子性 简单讲一个操作是不可中断的要么全部执行成功要么全部执行失败比如银行转账 原子性是指一组操作要么全部完成要么全部不完成不会出现部分完成的情况保证操作的完整性和一致性。在多线程编程中如果一个操作需要被多个线程同时访问为了保证正确性必须保证操作的原子性。可以使用同步机制如锁或原子变量等来实现原子性。
什么是可见性 当多个线程访问同一变量时一个线程修改了这个变量的值其他线程就能够立即看到修改的值 可见性指的是一个程序中变量在多线程环境下的可见性。当一个变量被一个线程修改后其他线程是否能够立即看到修改的结果就是可见性问题。如果一个变量的值被修改后其他线程不能立即看到变量的修改结果那么就会出现数据不一致的问题。在并发编程中保证可见性是非常重要的一项技术。常见的解决可见性问题的方式包括使用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基本数据类型包括八种 byte字节型8位有符号二进制数取值范围为-128~127。 short短整型16位有符号二进制数取值范围为-32768~32767。 int整型32位有符号二进制数取值范围为-2147483648~2147483647。 long长整型64位有符号二进制数取值范围为-9223372036854775808~9223372036854775807。 float单精度浮点型32位IEEE-754标准浮点数。 double双精度浮点型64位IEEE-754标准浮点数。 char字符型16位Unicode字符取值范围为0~65535。 boolean布尔型true或false。
除了基本数据类型Java还有引用数据类型如类、接口、数组等。
什么是内部类
内部类是一个定义在另一个类中的类。它可以访问外部类的成员包括私有成员并且可以用来实现一些特定的功能如事件处理、回调等。内部类的作用主要是为了增强可读性、安全性和封装性。内部类分为成员内部类、局部内部类、匿名内部类和静态内部类等几种类型。
静态内部类里面一定是静态方法吗
不是必须的。静态内部类可以声明静态方法但也可以声明非静态方法。另外非静态内部类则不能声明静态方法因为它已经默认包含了外部类的实例而静态方法不能访问任何实例变量和实例方法。
静态方法可以不可以使用非静态变量
静态方法不能直接使用非静态变量因为非静态变量是属于对象实例的而静态方法是独立于对象实例的。如果要在静态方法中使用非静态变量需要通过实例化对象来访问非静态变量。或者将非静态变量作为参数传递给静态方法。
抽象方法可以不可以有函数体
抽象方法不能有函数体。抽象方法是一种特殊的方法声明它没有具体的实现只有方法名、参数和返回值类型。在Java中抽象方法必须声明在抽象类中并且抽象类必须用“abstract”关键字修饰。子类必须覆盖重写所有抽象方法才能被实例化否则子类也必须是一个抽象类。因此抽象方法不能有函数体否则它就不再是一个抽象方法而是一个普通的方法。
说一下抽象类和接口 一个子类只能继承一个抽象类虚类但能实现多个接口一个抽象类可以有构造方法接口没有构造方法一个抽象类中的方法不一定是抽象方法即其中的方法可以有实现有方法体接口中的方法都是抽象方法不能有方法体只有声明一个抽象类可以是public、private、protected、default, 接口只有public;一个抽象类中的方法可以是public、private、protected、default 接口中的方法只能是public和default。 从使用上来说抽象类适合用于创建一些共性较强的类和方法而接口则适合用于实现某些特定的行为以及在不同类之间进行统一的操作。通常情况下如果需要更好的扩展性和灵活性应该优先使用接口如果需要提供一些默认的实现或是定义某些共有的行为应该优先使用抽象类。