31道Java核心面试题,一次性打包送给你(4)

简介: 31道Java核心面试题,一次性打包送给你

19、main() 方法可以重载吗?


可以,一个类中可以有多个名称为“main”的方法:


public class MainTest {
    public static void main(String[] args) {
        System.out.println("main(String[] args)");
    }
    public static void main(String[] args,String arg) {
        System.out.println("(String[] args,String arg");
    }
}


但该类在运行的时候,只会找到一个入口,即 public static void main(String[] args)。


20、一个 Java 源文件中有多个 public 类吗?


一个 Java 源文件中不能有多个 public 类。


image.png


21、什么是 Java 的 package(包)?


在 Java 中,我们使用 package(包)对相关的类、接口和子包进行分组。这样做的好处有:


使相关类型更容易查找

避免命名冲突,比如说 com.itwanger.Hello 和 com.itwangsan.Hello 不同

通过包和访问权限控制符来限定类的可见性

可以使用 package 关键字来定义一个包名,需要注意的是,这行代码必须处于一个类中的第一行。强烈建议在包中声明类,不要缺省,否则就失去了包结构的带来的好处。


包的命名应该遵守以下规则:


应该全部是小写字母

可以包含多个单词,单词之间使用“.”连接,比如说 java.lang

名称由公司名或者组织名确定,采用倒序的方式,比如说,我个人博客的域名是 www.itwanger.com,所以我创建的包名是就是 com.itwanger.xxxx。

每个包或者子包都在磁盘上有自己的目录结构,如果 Java 文件时在 com.itwanger.xxxx 包下,那么该文件所在的目录结构就应该是 com->itwanger->xxxx。


默认情况下,java.lang 包是默认导入的,我们不需要显式地导入该包下的任何类。


package com.cmower.bb;

public class PackageTest {

   public static void main(String[] args) {

       Boolean.toString(true);

   }

}



Boolean 类属于 java.lang 包,当使用它的时候并不需要显式导入。


22、什么是访问权限修饰符?


访问权限修饰符对于 Java 来说,非常重要,目前共有四种:public、private、protected 和 default(缺省)。


一个类只能使用 public 或者 default 修饰,public 修饰的类你之前已经见到过了,现在我来定义一个缺省权限修饰符的类给你欣赏一下。


class Dog {

}



哈哈,其实也没啥可以欣赏的。缺省意味着这个类可以被同一个包下的其他类进行访问;而 public 意味着这个类可以被所有包下的类进行访问。


假如硬要通过 private 和 protected 来修饰类的话,编译器会生气的,它不同意。


image.png


private 可以用来修饰类的构造方法、字段和方法,只能被当前类进行访问。protected 也可以用来修饰类的构造方法、字段和方法,但它的权限范围更宽一些,可以被同一个包中的类进行访问,或者当前类的子类。


可以通过下面这张图来对比一下四个权限修饰符之间的差别:


image.png


同一个类中,不管是哪种权限修饰符,都可以访问;

同一个包下,private 修饰的无法访问;

子类可以访问 public 和 protected 修饰的;

public 修饰符面向世界,哈哈,可以被所有的地方访问到。


23、什么是 final 关键字?


final 关键字修饰类的时候,表示该类无法被继承。比如,String 类就是 final 的,无法被继承。


final 关键字修饰方法的时候,表示子类无法覆盖它。


final 关键字修饰变量的时候,表示该变量只能被赋值一次,尽管变量的状态可以更改。


关于 final 更详细的内容,可以参照我之前写了另外一篇文章:


我去,你竟然还不会用 final 关键字


24、什么是 static 关键字?


static 关键字可以用来修饰类变量,使其具有全局性,即所有对象将共享同一个变量。


static 关键字可以用来修饰方法,该方法称为静态方法,只可以访问类的静态变量,并且只能调用类的静态方法。


关于 static 更详细的内容,可以参照我之前写了另外一篇文章:


面试官:兄弟,说说Java的static关键字吧


25、finally 和 finalize 有什么区别?


finally 通常与 try-catch 块一起使用,即使 try-catch 块引发了异常,finally 块中的代码也会被执行,用于释放 try 块中创建的资源。


finalize() 是 Object 类的一个特殊方法,当对象正在被垃圾回收时,垃圾收集器将会调用该方法。可以重写该方法用于释放系统资源。


26、可以将一个类声明为 static 的吗?


不能将一个外部类声明为 static 的,但可以将一个内部类声明为 static 的——称为静态内部类。


27、什么是静态导入?


如果必须在一个类中使用其他类的静态变量或者静态方法,通常我们需要先导入该类,然后使用“类名.变量/方法”的形式调用。


import java.lang.Math;


double test = Math.PI * 5;



也可以通过静态导入的方式,就不需要再使用类名了。


import static java.lang.Math.PI;


double test = PI * 5;



不过,静态导入容易引发混乱(变量名或者方法名容易冲突),因此最好避免使用静态导入。


28、什么是 try-with-resources?


try-with-resources 是 Java 7 时引入的一个自动资源管理语句,在此之前,我们必须通过 try-catch-finally 的方式手动关闭资源,当我们忘记关闭资源的时候,就容易导致内存泄漏。


关于 try-with-resources 更详细的内容,可以参照我之前写了另外一篇文章:


我去,你竟然还在用 try–catch-finally


29、什么是 multi-catch?


Java 7 改进的另外一个地方就是 multi-catch,可以在单个 catch 中捕获多个异常,当一个 try 块抛出多个类似的异常时,这种写法更短,更清晰。


catch(IOException | SQLException ex){

    logger.error(ex);

    throw new MyException(ex.getMessage());

}



当有多个异常的时候,可以使用管道表示符“|”隔开。


30、什么是 static 块?


static 块是由 Java ClassLoader 将类加载到内存中时执行的代码块。通常用于初始化类的静态变量或者创建静态资源。


31、什么是接口?


接口是 Java 编程语言中的一个核心概念,不仅在 JDK 源码中使用很多,还在 Java 设计模式、框架和工具中使用很多。接口提供了一种在 Java 中实现抽象的方法,用于定义子类的行为约定。


关于接口更详细的内容,可以参照我之前写了另外一篇文章:


可能是把 Java 接口讲得最通俗的一篇文章


鸣谢


说句实在话,这 31 道 Java 核心面试题在面试的过程中还是很常见的,值得好好复习一遍。关键是还有下一波,同样 31 道,望眼欲穿吧?


好了,我亲爱的小伙伴们,能看到这里绝逼是最优秀的程序员,二哥必须伸出帅气的大拇指为你点个赞!


相关文章
|
19天前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
19天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
|
19天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
19天前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
19天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
19天前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
19天前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
19天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
19天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
下一篇
无影云桌面