返回顶部
首页 > 资讯 > 后端开发 > Python >Java面试之高级特性基础总结
  • 469
分享到

Java面试之高级特性基础总结

Java高级特性基础Java高级特性 2023-01-11 12:01:48 469人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1.为什么 Java 中只有值传递2.static 关键字使用场景3.Exception 和 Error 有什么区别4.Checked Exception 和 Unchecked

1.为什么 Java 中只有值传递

  • 值传递 :方法接收的是实参值的拷贝,会创建副本。
  • 引用传递 :方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。

很多程序设计语言(比如 c++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。

Java 中将实参传递给方法(或函数)的方式是 值传递 :

  • 如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。
  • 如果参数是引用类型,传递的就是实参所引用的对象在堆中地址值的拷贝,同样也会创建副本。

2.static 关键字使用场景

修饰成员变量和成员方法:

被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被 static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。

静态代码块:

静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块 —> 非静态代码块 —> 构造方法)。 该类不管创建多少对象,静态代码块只执行一次

静态导包:

格式为:import static

这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法

import static java.lang.Math.*;
public class Demo {
  public static void main(String[] args) {
    int max = max(1,2);
    System.out.println(max);
  }
}

静态内部类:

静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:

1.它的创建是不需要依赖外围类的创建。

2.它不能使用任何外围类的非 static 成员变量和方法。

例如:静态内部类实现单例模式:

public class Singleton {
    // 声明为 private 避免调用默认构造方法创建对象
    private Singleton() {
    }
    // 声明为 private 表明静态内部该类只能在该 Singleton 类中被访问
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getUniqueInstance() {
        return SingletonHolder.INSTANCE;
    }
}

当 Singleton 类加载时,静态内部类 SingletonHolder 没有被加载进内存。只有当调用 getUniqueInstance()方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例,并且 JVM 能确保 INSTANCE 只被实例化一次。

这种方式不仅具有延迟初始化的好处,而且由 JVM 提供了对线程安全的支持。

3.Exception 和 Error 有什么区别

在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类:

  • Exception :程序本身可以处理的异常,可以通过 catch 来进行捕获。Exception 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。
  • Error :Error 属于程序无法处理的错误 ,不建议通过catch捕获 。例如 Java 虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefFoundError)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。

4.Checked Exception 和 Unchecked Exception 有什么区别

Checked Exception 即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被 catch或者throws 关键字处理的话,就没办法通过编译。

比如下面这段 IO 操作的代码:

除了RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常 。常见的受检查异常有: IO相关的异常、ClassNotFoundException 、sqlException…

Unchecked Exception 即 不受检查异常 ,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。

RuntimeException 及其子类都统称为非受检查异常

常见的Unchecked Exception:

  • NullPointerException(空指针错误)
  • IllegalArgumentException(参数错误比如方法入参类型错误)
  • NumberFORMatException(字符串转换为数字格式错误,IllegalArgumentException的子类)
  • ArrayIndexOutOfBoundsException(数组越界错误)
  • ClassCastException(类型转换错误)
  • ArithmeticException(算术错误)
  • SecurityException (安全错误比如权限不够)
  • UnsupportedOperationException(不支持的操作错误比如重复创建同一用户)

5.Throwable 类常用方法有哪些

String getMessage(): 返回异常发生时的简要描述

String toString(): 返回异常发生时的详细信息

String getLocalizedMessage(): 返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同

void printStackTrace(): 在控制台上打印 Throwable 对象封装的异常信息

6.finally 中的代码一定会执行吗

在某些情况下,finally 中的代码不会被执行。

就比如说 finally 之前虚拟机被终止运行的话,finally 中的代码就不会被执行。

public static void main(String[] args) {
    try {
        System.out.println("Do something");
        throw new RuntimeException("RuntimeException");
    } catch (Exception e) {
        System.out.println(e.getMessage());
        // 终止当前正在运行的Java虚拟机
        System.exit(1);
    } finally {
        System.out.println("Finally");
    }
}

这个程序只会输出:

Do something
RuntimeException

另外,在以下 2 种特殊情况下,finally 块的代码也不会被执行:

  • 程序所在的线程死亡
  • 关闭 CPU

7.如何使用 try-with-resources 代替try-catch-finally

面对必须要关闭的资源,我们总是应该优先使用 try-with-resources 而不是try-finally。try-with-resources语句让我们更容易编写必须要关闭的资源的代码,若采用try-finally则几乎做不到这点。

Java 中类似于InputStream、OutputStream 、Scanner 、PrintWriter等的资源都需要我们调用close()方法来手动关闭,一般情况下我们都是通过try-catch-finally语句来实现这个需求,如下:

public static void main(String[] args) {
    // 读取文本文件的内容
    Scanner scanner = null;
    try {
        scanner = new Scanner(new File("D://read.txt"));
        while (scanner.hasNext()) {
            System.out.println(scanner.nextLine());
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (scanner != null) {
            scanner.close();
        }
    }
}

使用 Java 7 之后的 try-with-resources 语句改造上面的代码:

public static void main(String[] args) {
    try (Scanner scanner = new Scanner(new File("D://read.txt"))) {
        while (scanner.hasNext()) {
            System.out.println(scanner.nextLine());
        }
    } catch (FileNotFoundException fnfe) {
        fnfe.printStackTrace();
    }
}

当然多个资源需要关闭的时候,使用 try-with-resources 实现起来也非常简单:

通过使用分号分隔,可以在try-with-resources块中声明多个资源:

try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
     BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
    int b;
    while ((b = bin.read()) != -1) {
        bout.write(b);
    }
}
catch (IOException e) {
    e.printStackTrace();
}

8.注解的解析方法有哪几种

注解只有被解析之后才会生效,常见的解析方法有两种:

  • 编译期直接扫描 :编译器在编译 Java 代码的时候扫描对应的注解并处理,比如某个方法使用@Override 注解,编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。
  • 运行期通过反射处理 :像框架中自带的注解(比如 spring 框架的 @Value 、@Component)都是通过反射来进行处理的。

9.泛型的使用方式有哪几种

泛型一般有三种使用方式:泛型类、泛型接口、泛型方法

10.项目中哪里用到了泛型

1.自定义接口通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型

2.定义 excel 处理类 ExcelUtil<T> 用于动态指定 Excel 导出的数据类型

3.构建集合工具类(参考 Collections 中的 sort, binarySearch 方法)。

到此这篇关于Java面试之高级特性基础总结的文章就介绍到这了,更多相关Java高级特性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java面试之高级特性基础总结

本文链接: https://lsjlt.com/news/177362.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java面试之高级特性基础总结
    目录1.为什么 Java 中只有值传递2.static 关键字使用场景3.Exception 和 Error 有什么区别4.Checked Exception 和 Unchecked...
    99+
    2023-01-11
    Java高级特性基础 Java高级特性
  • Java高级特性(基础)
    StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改...
    99+
    2023-05-31
    java高级特性 ava j
  • Java高级特性基础之反射五连问
    目录1.反射的作用2.反射的优缺点3.反射的应用场景4.说一下反射的相关类有哪些5.获取Class对象的六种方式1.反射的作用 它赋予了我们在运行时分析类以及执行类中方法的能力。通过...
    99+
    2023-01-11
    Java高级特性 反射 Java高级特性 Java反射
  • 详解高性能mysql之MySQL高级特性总结
    MySQL是一款广泛使用的关系型数据库管理系统,具有高性能和高可靠性的特点。在高性能MySQL中,有一些高级特性可以帮助提升数据库的...
    99+
    2023-09-22
    MySQL
  • Java并发基础常见面试题(总结)
    本篇文章给大家总结了一下Java并发基础常见面试题,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1. 什么是线程和进程1.1. 何为进程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程...
    99+
    2015-12-07
    java面试题 spring Java
  • Java基础面试题&知识点总结(上篇)
    大家好,我是栗筝i,从 2022 年 10 月份开始,我持续梳理出了全面的 Java 技术栈内容,一方面是对自己学习内容进行整合梳理,另一方面是希望对大家有所帮助,使我们一同进步。得到了很多读者的...
    99+
    2023-10-25
    Java面试题 Java知识点 Java基础面试题
  • java基础之String知识总结
    目录一、概念二、特点三、三种构造方式:四、字符串常量池一、概念 String代表字符串,java语言中所有双引号的字符串都是String的对象,不管是否是new出来的对象。 二、特点...
    99+
    2024-04-02
  • Java基础总结之Thymeleaf详解
    目录一、Thymeleaf语法1.1 变量表达式${…}1.2 选择变量表达式*{…}1.3 消息表达式 #{…}1.4 链接表达式 @{…}1.5 片段表达式 ~{…}二、基本使用...
    99+
    2024-04-02
  • Java基础知识总结之继承
    目录一、继承的基本概念二、继承的好处和弊端三、继承中变量访问的特点四、super关键字五、继承中构造方法的访问特点六、继承中成员方法的访问特点七、方法重写八、包九、修饰符十、stat...
    99+
    2024-04-02
  • 总结Golang的基础知识和高级技巧
    Golang是Google开发的开源编程语言,它旨在提高代码的可读性和可维护性。Golang在很多领域都很受欢迎,包括网络编程、云计算、数据处理等。本文将介绍一些关于Golang的基础知识和高级技巧,并给出一些实践建议。一、Golang基础...
    99+
    2023-05-14
  • java基础之泛型知识点总结
    目录一、什么是泛型?为什么要使用泛型? 二、泛型的特性是什么?三、泛型的使用方式 四、Java中的泛型通配符一、什么是泛型?为什么要使用泛型? 泛型,即“参数化...
    99+
    2024-04-02
  • Java基础之位运算知识总结
    目录一、位运算的分类与展现效果二、原理三、边界值测试一、位运算的分类与展现效果 java位运算可以分为左移和右移,其中右移还有无符号右移。   java只对整型位移,可...
    99+
    2024-04-02
  • Java基础面试题之volatile详解
    目录1、volatile保证可见性1.1、什么是JMM模型?1.2、volatile保证可见性的代码验证1.2.1、无可见性代码验证1.2.1、volatile保证可见性验证2、vo...
    99+
    2024-04-02
  • Java线程池高频面试题总结
    目录1、在启动线程时,为什么要通过调用方法start执行方法run,而不能直接执行方法run?2、方法sleep、join和yield的区别有哪些?3.为什么方法wait、notif...
    99+
    2024-04-02
  • Python面经之16个高频面试问题总结
    目录(一)Python 是如何进行内存管理的?(二)什么是 lambda 函数?它有什么好处(三)Python 里面如何实现 tuple 和 list 的转换?(四)请写出一段 Py...
    99+
    2024-04-02
  • Java基础之引用相关知识总结
    目录一、引用的定义二、问题三、引用的分类四、应用场景五、源码六、总结一、引用的定义 在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的...
    99+
    2024-04-02
  • Java基础之Math和Random类知识总结
    java的Math类 java中的java.lang.Math类可以直接使用,不需要导包,在JDK的API 中看到Math类被final修饰着,那么说明了这个Math类不能被继承,...
    99+
    2024-04-02
  • Java基础之并发相关知识总结
    目录一、Java并发是什么?二、怎么做?三、分工四、同步五、互斥六、总结一、Java并发是什么? 用学术定义来说就是 并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行...
    99+
    2024-04-02
  • Java面试之Java基础篇(offer 拿来吧你)
    现在关于Java面试的资料是层出不穷,对于选择困难症的同学来说,无疑是陷入了一次次的抉择与不安中,担心错过了关键内容,现在小曾哥秉持着"融百家之所长,汇精辟之文档"的思想,整理一下目前主流的一些八股文,以达到1+1 > 2 的效果! ...
    99+
    2023-08-22
    java基础 面试 java
  • Java基础之数组超详细知识总结
    目录一、一维数组二、二维数组三、总结一、一维数组 1、Java语言中的数组是一种 引用数据类型。不属于基本数据类型。数组的父类是 Object。 2、数组实际上是一个容器,可以同时容...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作