【秋招冲刺-每日打卡】应届生JAVA岗-每日5道高频面试题【Day1】-JAVA基础篇(1)

简介: 【秋招冲刺-每日打卡】应届生JAVA岗-每日5道高频面试题【Day1】-JAVA基础篇(1)

文章大纲

一:什么是对象

追问问题1.1: 面向对象有什么特征

追问问题1.2: 多态有什么优点

追问问题1.3: 多态存在的必要条件

追问问题1.4: JAVA作为面向对象,它有什么特点或者好处

二: 多态的实现方式

追问问题2.1: 虚拟机是如何实现多态的

三: 重载(Overload)和重写(Override)的区别。重载能够根据返回值的类型区分?

追问问题3.1: 构造器(constructor)是否可被重写(override)?

四: 抽象类和接口有什么区别

追问问题4.1:访问修饰符public,private,protected,以及不写(默认)时的区别

五:String是最基本的数据类型吗?

追问问题5.1: JAVA中基本数据类型和包装类型的对应关系和占用字节

追问问题5.2: JAVA为什么要引入8中基本数据类型

每日小结

image.png

大家好,这里是IT学习日记,一个非双一流大学毕业的深漂族,年少曾憧憬大厂,面试过许多家公司,也曾踩过无数坑,深知面试技巧和知识广度与深度对一个应届生乃至工作多年的开发者的重要性。

故特意收集了各个公司、大厂的面试高频题,通过每天打卡的方式,和大家一起记录和学习,希望能够帮助到应届生和开发者们少走弯路,一起冲向大厂!

image.png

一:什么是对象


 回答思路: 这个问题的主要考察的是你对面向对象语言的理解,回答时除了回答面向对象的定义外,更重要的是要学会延伸说明和类相关的一些特性。


 定义: 在系统中,对象是用于客观描述一个事物的一个实体,而类则是这类实体的抽象,它是构成系统的一个基本单位。一个对象由一组描述对象的属性和一组描述对象的动作组成。


 类的实例化可以创建对象,每个对象都有它的生命周期,对象的生命周期可以简单的归为:生成、使用、销毁三个阶段。


 在JAVA语言中,一个类如果不存在引用时,那它就是一个无用的对象,JAVA的垃圾回收器会自动扫描JVM虚拟机,对这些没有被引用的垃圾对象进行回收。


 开发者也可以显示调用System.gc()方法告知垃圾回收器进行回收垃圾对象,但是并不意味着在调用完这个方法后垃圾回收器就会垃圾去回收,具体的回收时间是由垃圾收回器自己确定,调用这个方法只是给垃圾回收器发送一个“信号”,告诉它现在内存不够或者可以去存在垃圾对象需要它回收。



追问问题1.1: 面向对象有什么特征


 面向对象的三大特征:封装、继承、多态


 封装: 隐藏对象的属性和实现细节、只提供访问的公共方法,实现的方式是通过访问修饰符来限定。

image.png

继承: 继承表示的是一个类拥有另一个类的相关信息,通过关键字extends实现,被继承的类叫父类(基类、超类),得到继承信息的类也叫子类或派生类,JAVA中类只能单继承,但是可以实现多个接口。

image.png

多态: 同一个行为可以有不同的表现形式的能力。具体来说就是一个类型可以有多种表现的形式,如:动物可以是狗、也可以是猫,具体如图所示:

image.png

追问问题1.2: 多态有什么优点


 对类型解耦,可以使用父类或者接口接收子类对象


 可替换性,如实例一个猫对象,可以用动物接收:Animal cat = new Cat()


 可拓展性,多态是对象的多种表现形式的体现,很易于拓展,如动物除了猫狗外,还可以是鸡鸭鱼等


 更灵活,可以随意拓展新的表现形式而不影响其他的形式



追问问题1.3: 多态存在的必要条件


 1、继承父类或者实现接口


 2、重写


 3、使用父类/接口接收子类对象

image.png

class Animal2 {
    void draw() {}
}
class Dog extends Animal2 {
    @Override
    void draw() {
        System.out.println("汪汪");
    }
}
class Cat2 extends Animal2 {
    @Override
    void draw() {
        System.out.println("喵喵");
    }
}
class Fish extends Animal2 {
    @Override
    void draw() {
        System.out.println("泡泡");
    }

追问问题1.4: JAVA作为面向对象,它有什么特点或者好处


 1、易于理解,有更好的可读性


 2、平台无关性,一次编译,处处运行


 3、提供了许多类库,方便开发者的工作,减少开发时间


 4、提供了对web的支持


 5、具有较好的安全性和健壮性(如垃圾回收)


 6、去除了C++中难以理解,易于混淆的特性



二: 多态的实现方式


 1、继承父类重写父类方法,关键字extends

/**
 * 图形
 */
class Shape {
    void draw() {}
}
/**
 * 圆
 */
class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("Circle.draw()");
    }
}
/**
 * 正方形
 */
class Square extends Shape {
    @Override
    void draw() {
        System.out.println("Square.draw()");
    }
}
/**
 * 三角形
 */
class Triangle extends Shape {
    @Override
    void draw() {
        System.out.println("Triangle.draw()");
    }
}

2、实现接口,重写接口方法,关键字implements

/**
 * 图形
 */
interface Shape {
     void draw();
}
/**
 * 圆
 */
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Circle.draw()");
    }
}
/**
 * 正方形
 */
class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Square.draw()");
    }
}
/**
 * 三角形
 */
class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Triangle.draw()");
    }
}

3、同一个类中方法重载

class Animal3{
    /*
        重载实现多态
     */
    public void call(){
        System.out.println("无参数的叫声");
    }
    public void call(String mode){
        System.out.println("带参数的叫声");
    }
}

追问问题2.1: 虚拟机是如何实现多态的


 通过动态绑定技术(dynamic binding),执行期间判断所引用对象的实际对象类型,根据实际类型调用对应的方法。



三: 重载(Overload)和重写(Override)的区别。重载能够根据返回值的类型区分?


 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性,具体差别如下:


 1、重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;


 2、重写发生在子类与父类或者子类和接口之间,要求如下:


 (1)重写方法不能缩小访问权限;


 (2)参数列表必须与被重写方法相同(包括显示形式);


 (3)返回类型必须与被重写方法的相同或是其子类;


 (4)重写方法不能抛出新的异常,或者超过了父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。


 3、重载对返回类型没有特殊的要求,所以无法通过返回值类型来区分重载。


 4、父类的静态方法不能被子类重写。重写只适用于实例方法,不能用于静态方法,当父类和子类有相同名称的静态方法时,如果使用父类接收子类对象,则调用静态方法时,会直接使用父类的方法而隐藏掉子类的静态方法。

image.png

追问问题3.1: 构造器(constructor)是否可被重写(override)?


 不能,因为构造器不能被继承,因此不能被重写,但可以被重载。



四: 抽象类和接口有什么区别


 1、抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用(既使用抽象类或者接口接收实际的类型创建出来的对象,如Animal a =new Dog(),Animal可以是接口或者抽象类)


 2、一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。


 3、接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。


 3、抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。


 4、抽象类中可以定义成员变量,而接口中只能定义常量。


 5、有抽象方法的类必须被声明为抽象类,而抽象类不一定需要有抽象方法



追问问题4.1:访问修饰符public,private,protected,以及不写(默认)时的区别

image.png

五:String是最基本的数据类型吗?


 不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean,除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。



追问问题5.1: JAVA中基本数据类型和包装类型的对应关系和占用字节

image.png

注:《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。


 这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。



追问问题5.2: JAVA为什么要引入8中基本数据类型


 因为编码中使用到基本数据类型的场景非常多,为了减少使用时需要创建的的步骤,提升编码的编程的方便所以引入了基本数据类型。


 同时,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),如:int的包装类是Integer,且从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。



每日小结


  不积跬步,无以至千里;不积小流,无以成江海。今天播种努力的种子,总会有一天发芽!


  欢迎大家关注,如果觉得文章对你有帮助,不要忘记一键三连哦,你的支持是我创作更加优质文章的动力,希望大家都能够早日拿到心仪的Offer,有任何面试问题可以私信我,欢迎大家投稿面试题目哦!


相关文章
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
9天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
14天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
10天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
34 4
|
11天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
51 4
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
18天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
5天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
8天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
5天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin