八股文-基础知识-面试题汇总(一)

面向对象和面向过程的区别?

面向对象和面向过程是两种不同的编程范式,它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目,尤其是需要维护和扩展的系统;而面向过程更适合小型、线性的任务或对性能要求较高的情况。下面是两者的主要区别:

面向对象编程

数据封装:数据和操作数据的函数被封装在类中,形成对象。这种封装隐藏了数据的具体实现细节,只暴露出必要的接口供外部调用。
继承性:允许创建类的层次结构,子类可以继承父类的属性和方法,这有助于代码的复用和模块化。
多态性:同一个接口或方法名可以有多种实现方式,具体实现取决于调用它的对象类型。这增加了代码的灵活性和扩展性。
抽象:提供抽象类和接口,允许定义行为的规范而不提供具体的实现,从而支持更高级别的设计。
强调对象:关注于对象之间的交互,每个对象都有自己的状态和行为,通过消息传递来实现功能。

面向过程编程

数据与函数分离:数据和处理数据的过程通常是分开的,没有像 OOP 那样严格的封装。
流程控制:面向过程的编程更侧重于算法和步骤的顺序执行,通常使用函数(或子程序)来组织代码,但这些函数并不一定绑定到特定的数据上。
简单和直接:对于简单的任务,面向过程的编程可能更为直观和容易理解,因为它直接描述了问题的解决步骤。
不支持继承和多态:语言通常不支持继承和多态这样的概念,虽然可以通过其他方式(如函数重载)实现类似的效果。

Java 语言有哪些特点?

简单性:Java 的设计目的是使语言简单且易于学习。自动的垃圾回收机制,减少了程序员对内存管理的负担。
跨平台性:Java 代码被编译成字节码,由 Java 虚拟机(JVM)解释执行,实现“一次编写,到处运行”的理念。
面向对象:Java 是一种纯面向对象的语言,支持封装、继承和多态。
安全性:Java 通过严格的类型检查、禁止指针访问、代码验证等机制提高了安全性。
多线程:Java 内置了对多线程的支持,允许多个线程并发执行,提高了程序的响应性和资源利用率。
动态性:Java 支持运行时动态加载类和动态链接,使得代码可以在运行时进行修改和扩展。
健壮性:Java 的异常处理机制帮助开发者捕获和处理运行时错误,增强程序的稳定性和可靠性。
支持网络编程:Java 提供了丰富的网络通信库,如 Socket 编程,支持网络应用的开发。
编译和解释性:Java 源代码被编译成字节码,由 JVM 解释执行或通过即时编译器(JIT)转换为本地代码。

JVM JDK 和 JRE 有什么区别?

JVM

JVM 是一个虚拟机,用于执行 Java 字节码。它是一个抽象的计算机,提供了运行 Java 程序所需的基本运行环境,包括: 字节码解释器:读取并解释执行 Java 字节码。 垃圾回收器:自动管理内存,回收不再使用的对象所占用的空间。 安全管理器:确保运行中的应用程序不会违反安全策略。 JIT 编译器:将频繁执行的字节码编译成本地机器代码,以提高运行效率。

JRE

JRE 包含了 JVM 和运行 Java 程序所需的类库,是运行 Java 应用程序的基础。当你想要在一台计算机上运行 Java 程序时,只需要安装 JRE 即可。JRE 不包含开发工具,因此无法用来编译 Java 源代码。

JDK

JDK 是完整的 Java 软件开发工具包,它包含了 JRE 和额外的开发工具,例如: Java 编译器(javac):用于将 Java 源代码编译成字节码。 Java 调试器(jdb):用于调试 Java 程序。 文档生成工具(javadoc):用于从源代码注释中生成 API 文档。 打包工具(jar、zip):用于创建和管理 Java 归档文件。 其他工具:如 java、javap(反汇编器)、jps(进程状态工具)等

Java 面向对象编程三大特性: 封装 继承 多态

封装

封装是将数据(变量)和操作数据的方法(函数)组合在一个单独的单元(类)中,并对外部隐藏对象的内部状态和实现细节。封装的好处在于:
隐藏内部实现:通过设置访问修饰符(如 private、protected 和 public),可以控制哪些成员变量和方法对外界可见,哪些不可见。
增强安全性:封装保护了数据不受外部非法访问和修改,通过提供公共的 getter 和 setter 方法,可以对外部访问施加控制。
简化接口:封装后的类提供了一个清晰的接口,外界仅需关注如何使用类提供的方法,而无需关心其实现细节。

继承

继承允许创建新类(子类)继承现有类(父类)的属性和方法,从而促进代码的重用和扩展。继承的好处包括:
代码重用:子类可以直接使用父类的成员变量和方法,避免了重复编写相同的代码。
层级关系:继承可以建立类之间的层级关系,使得代码结构更加清晰,易于理解和维护。
多态性基础:继承为多态性奠定了基础,因为子类对象可以被视为父类对象。

多态

多态是指一个接口或方法名可以有多种实现方式,具体实现取决于调用它的对象类型。多态分为静态多态和动态多态:
静态多态:通常指的是方法的重载(Overloading),即在同一个类中定义多个同名方法,但参数列表不同。
动态多态:也称为运行时多态,通常指的是方法的重写(Overriding),即在子类中重写父类的方法,具体调用哪个方法取决于对象的实际类型。

java 字符型常量和字符串常量的区别?

字符型常量

定义:字符型常量在 Java 中表示单个字符,使用一对单引号(' ')包围,其数据类型是 char
存储:字符型常量在内存中占据两个字节的空间(Java 的 char 类型是 16 位的),存储的是该字符的 Unicode 编码。
使用:字符型常量主要用于存储和操作单个字符,比如在循环中逐个字符处理字符串,或者在字符数组中存储和检索字符。

字符串常量

定义:字符串常量是由零个或多个字符组成的不可变序列,使用一对双引号(" ")包围,其数据类型是 String 类的对象。
存储:字符串常量在 Java 中是不可变的(immutable),这意味着一旦创建,其内容就不能更改。字符串字面量会被存储在字符串常量池中,以节省内存和提高性能。如果相同的字符串字面量多次出现,它们将共享同一块内存空间。
使用:字符串常量通常用于处理文本数据,如用户输入、文件路径、数据库查询语句等。由于 String 类提供了丰富的字符串操作方法,如 concat(), substring(), replace(), equals() 等,因此非常适合文本处理任务。

主要区别

类型:字符型常量是基本数据类型 char,而字符串常量是引用数据类型 String 类的对象。
长度:字符型常量只能表示单个字符;而字符串常量可以表示任意长度的字符序列。
可变性:字符型常量的值是固定的,不可改变;字符串常量在创建后也是不可变的,但可以使用 String 类的方法创建新的字符串对象。

构造器 Constructor 是否可被 override?

在 Java 中,构造器(Constructor)不能被重写(override),但可以被重载(overload)。

public class Person {private String name;private int age;// 无参构造器public Person() {}// 带两个参数的构造器public Person(String name, int age) {this.name = name;this.age = age;}
}

重载和重写的区别?

重载和重写是多态性的两个重要方面,它们分别应用于不同的场景:

重载

定义:重载是在同一个类中定义多个同名的方法,但这些方法的参数列表必须不同。参数列表的不同可以是参数的数量、类型或顺序不同。
作用:重载提供了一种使用相同方法名而根据传入参数的不同执行不同行为的方式,提高了代码的可读性和整洁度。
编译时决策:重载的选择是在编译时确定的,根据传入的实际参数类型和数量,编译器会决定调用哪个方法。

重写

定义:重写发生在子类中重新定义父类的虚方法(非 final 的实例方法)。子类方法必须与父类方法具有完全相同的方法签名(方法名、参数列表和返回类型),并且子类方法不能比父类方法有更严格的访问级别。
作用:重写允许子类提供与父类相同方法的不同实现,以适应子类特有的行为,这是实现运行时多态的关键。
运行时决策:重写的选择是在运行时确定的,根据对象的实际类型,JVM会调用相应的子类或父类方法。

区别点重载方法重写方法
发生范围同一个类子类 中
参数列表必须修改一定不能修改
返回类型可修改一定不能修改
异常可修改可以减少或删除,一定不能抛出新的或者更广的异常
访问修饰符可修改一定不能做更严格的限制(可以降低限制)
发生阶段编译期运行期

静态方法内可以直接调用非静态成员吗?

在 Java 中,静态方法不可以直接访问非静态成员(包括非静态变量和非静态方法)。这是因为静态方法属于类本身,而不是类的实例。当静态方法被调用时,不需要创建类的任何实例,因此没有上下文来访问非静态成员,因为非静态成员是在类的实例被创建后才存在的。 可以通过以下是几种方式实现:
创建实例并调用
在静态方法内部创建类的实例,然后通过该实例访问非静态成员。

public class MyClass {private int myVar;public MyClass() {myVar = 10;}public void nonStaticMethod() {System.out.println("Non-static method called.");}public static void staticMethod() {MyClass instance = new MyClass();System.out.println(instance.myVar); // 访问非静态变量instance.nonStaticMethod();         // 调用非静态方法}
}

作为参数传递
将非静态成员作为参数传递给静态方法。

public class MyClass {private int myVar;public void setMyVar(int var) {this.myVar = var;}public int getMyVar() {return myVar;}public static void staticMethod(MyClass instance) {System.out.println(instance.getMyVar());}
}
public class Main {public static void main(String[] args) {MyClass obj = new MyClass();obj.setMyVar(20);MyClass.staticMethod(obj);}
}

构造方法有哪些特性?

名称与类相同: 构造方法的名字必须与它所在的类名完全相同,这是构造方法与其他普通方法最显著的区别。
无返回类型: 构造方法没有返回类型声明,即使是 void 也不行。这是因为它用于创建和初始化对象,而不是返回一个值。
自动调用: 每当使用 new 关键字创建一个类的新实例时,构造方法会被自动调用。如果没有显式定义构造方法,Java 编译器会默认提供一个无参构造方法。
可以重载: 在同一个类中可以定义多个构造方法,只要它们的参数列表不同即可。这被称为构造方法重载(Constructor Overloading),允许以不同的方式初始化对象。
初始化对象状态: 构造方法的主要目的是初始化对象的状态。在构造方法中,你可以设置成员变量的初始值,执行一些初始化操作,如打开文件、连接数据库等。
调用父类构造方法: 子类构造方法可以调用父类构造方法,这通常通过使用 super() 关键字来完成。super() 必须是子类构造方法的第一条语句,如果没有显式调用,Java 默认调用父类的无参构造方法。
访问权限: 构造方法可以有 publicprotectedprivatedefault(包私有)访问修饰符。这决定了谁可以使用构造方法来创建对象。
不能被继承或重写: 构造方法不能被子类重写(Override),但可以被重载(Overload)。子类可以通过 super() 调用父类的构造方法,但这并不是重写。
实例化前调用: 构造方法在对象实例化之前被调用,因此它是初始化对象的最早机会。
隐式调用与显式调用: 如果一个类没有定义任何构造方法,Java 会隐式提供一个默认的无参构造方法。但是,一旦定义了任何构造方法,哪怕是无参的,Java 就不会提供默认的构造方法,这时如果需要无参构造方法,必须显式定义。

为什么类需要定义一个空构造方法?

Java 程序在执行子类的构造方法之前,如果没有用 super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super()来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

接口和抽象类的区别是什么?

接口

完全抽象:接口是完全抽象的,不能有实例,接口中声明的所有方法默认是抽象的(在 Java 8 及以后版本中可以有默认方法和静态方法)。
多继承:一个类可以实现多个接口,这提供了多继承的能力,因为在 Java 中,一个类只能继承一个抽象类。
成员变量:接口中的成员变量默认是 public static final 的,意味着它们是常量。
方法的访问修饰符:接口中的方法默认是 public 的。
实现:一个类通过使用 implements 关键字来实现接口,必须实现接口中声明的所有抽象方法,除非该类本身也被声明为抽象类。

抽象类

部分抽象:抽象类可以包含抽象方法(没有实现体的方法)和具体方法(有实现体的方法),抽象类可以有实例,尽管不能直接实例化抽象类,但可以实例化其非抽象子类。
单继承:一个类只能继承一个抽象类,不能同时继承多个抽象类。
成员变量:抽象类可以有各种类型的成员变量,包括实例变量和静态变量。
方法的访问修饰符:抽象类中的方法可以是 publicprotectedprivatedefault
继承:一个类通过使用 extends 关键字来继承抽象类,如果该类不是抽象类,则必须实现抽象类中所有的抽象方法。

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

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

相关文章

Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1

Jmeter测试工具的安装和使用JSON格式请求 一、安装1、安装jdk包和设置java环境2、去官网下载Jmeter3、解压后,打开mac终端,进入apache-jmeter的bin文件开启jmeter 二、使用jmeter1、添加线程2、添加HTTP请求3、配置请求的协议、IP地址、端口号、请求方法…

Envoy 源码解析(一):Envoy 整体架构、Envoy 的初始化

本文基于 Envoy 1.31.0 版本进行源码学习 1、Envoy 整体架构 1)、核心组件 Envoy 包含以下四个核心组件: Listener(监听器):定义了 Envoy 如何处理入站请求。一旦连接建立,请求会被传递给一组过滤器进行处…

【VUE3】VUE组合式(响应式)API常见语法

pnpm常用命令 pnpm i //pnpm安装VUE3常见语法汇总 ref() //const count ref(0) //count.value(访问值,包括对象要加.value) //任何类型的值,包括深层嵌套的对象或则JS内置数据结构 await nextTick() //要等待 DOM 更新完成后…

CGAL CGAL::Polygon_mesh_processing::self_intersections解析

CGAL::Polygon_mesh_processing::self_intersections 是用于检测多边形网格(Polygon Mesh)中的自相交的函数。自相交是指网格中的某些面(例如三角形)与同一网格中的其他面交叉的情况。这种情况通常是不期望的,因为它会…

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处: 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

Vue前端开发2.3.5 条件渲染指令

本文介绍了Vue中两种条件渲染指令:v-if和v-show。v-if通过布尔值控制元素的DOM树存在,适用于不频繁切换显示状态的场景;v-show则通过CSS的display属性控制显示,适合频繁切换。通过创建单文件组件示例,演示了如何使用这…

GitLab指定用户分配合并权限

进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支,设置角色 管理用户角色权限 查看到不同用户的角色,一般设置Developer只有Merger Request权限,Maintainer还有Merge审批权限 GitLab 中的权限…

计算机网络socket编程(5)_TCP网络编程实现echo_server

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交…

C++ 二叉搜索树(Binary Search Tree, BST)深度解析与全面指南:从基础概念到高级应用、算法优化及实战案例

🌟个人主页:落叶 🌟当前专栏: C专栏 目录 ⼆叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 二叉搜索树中序遍历 ⼆叉搜索树的删除 cur的左节点为空的情况 cur的右节点为空的情况 左,右节点都不为…

uniCloud云开发

uniCloud 是 DCloud 联合阿里云、腾讯云、支付宝云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 普通云函数 callFuction方式云函数,也称之为普通云函数 uni-app的前端代码,不再执行uni.request联网,而是通过…

org.apache.log4j的日志记录级别和基础使用Demo

org.apache.log4j的日志记录级别和基础使用Demo,本次案例展示,使用是的maven项目,搭建的一个简单的爬虫案例。里面采用了大家熟悉的日志记录插件,log4j。来自apache公司的开源插件。 package com.qian.test;import org.apache.log…

day05(单片机高级)PCB基础

目录 PCB基础 什么是PCB?PCB的作用? PCB的制作过程 PCB板的层数 PCB设计软件 安装立创EDA PCB基础 什么是PCB?PCB的作用? PCB(Printed Circuit Board),中文名称为印制电路板,又称印刷…

fastjson不出网打法—BCEL链

前言 众所周知fastjson公开的就三条链,一个是TemplatesImpl链,但是要求太苛刻了,JNDI的话需要服务器出网才行,BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…

C#基础控制台程序

11.有一个54的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 12.从键盘输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 13.输入一个数,判断它是奇数还是偶数,如果…

深度学习干货总结(持续更新)

机器学习核心组件 可以用来学习的数据(data); 如何转换数据的模型(model); 一个目标函数(objective function),用来量化模型的有效性; 调整模型参数以优化…

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中,车牌识别(LPR)技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力,为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/,这个就是将论文中的内容或者补充视频放到一个网页上,以更好的展示他们的工作。因此,这里介绍下如何使用前人提供的模板制作我…

goframe开发一个企业网站 在vue-next-admin 显示验证码 19

index.go 文件中的代码,我将为该文件中的主要功能和方法添加注释,并生成一篇 Markdown 格式的文章。这将包括对每个函数的用途、输入参数和返回值的简要说明。 index.go 包和导入 package adminimport ("context""errors""gf…

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

大家好,我是锋哥。今天分享关于【Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?】面试题。希望对大家有帮助; Elasticsearch中的节…

Scrapy图解工作流程-cnblog

1.1 介绍部分: 文字提到常用的Web框架有Django和Flask,接下来将学习一个全球范围内流行的爬虫框架Scrapy。 1.2 内容部分: Scrapy的概念、作用和工作流程 Scrapy的入门使用 Scrapy构造并发送请求 Scrapy模拟登陆 Scrapy管道的使用 Scrapy中…