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

news2024/11/26 19:45:25

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

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

面向对象编程

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

面向过程编程

数据与函数分离:数据和处理数据的过程通常是分开的,没有像 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.coloradmin.cn/o/2248012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面

文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天,远程桌面服务成为了连接不同地点、不同设备之间的重要桥…

直播实时美颜平台开发详解:基于视频美颜SDK的技术路径

视频美颜SDK作为实现实时美颜的关键技术,为开发者提供了高效、灵活的解决方案。本篇文章,小编将以“基于视频美颜SDK的技术路径”为主题,深入解析直播实时美颜平台的开发要点。 一、视频美颜SDK的作用与优势 视频美颜SDK是一种集成化的开发工…

量子感知机

神经网络类似于人类大脑,是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题,是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…

实现在两台宿主机下的docker container 中实现多机器通讯

基于我的实验背景 上位机:ubuntu 20.04 (docker humble 22.04) 下位机:ubuntu 22.04(docker noetic 20.04) 目标:实现在上位机中的docker container 容器的22.04环境去成功远程访问 非同网段的下位机的20.04的contai…

远程控制软件:探究云计算和人工智能的融合

在数字化时代,远程控制工具已成为我们工作与生活的重要部分。用户能够通过网络远程操作和管理另一台计算机,极大地提升了工作效率和便捷性。随着人工智能(AI)和云计算技术的飞速发展,远程控制工具也迎来了新的发展机遇…

ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案

在金融行业,银行营业厅的安全保卫工作至关重要,它不仅关系到客户资金的安全,也关系到整个银行的信誉和运营效率。随着科技的发展,传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…

C#基础上机练习题

21.计算500-800区间内素数的个数cn,并按所求素数的值从大到小的顺序排列,再计算其间隔加、减之和,即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求,把结果cn和sum输出。 22.在三位整数…

ubuntu24挂载硬盘记录

1、显示硬盘及所属分区情况。在终端窗口中输入如下命令: sudo fdisk -l 找到自己硬盘的分区 我的地址/dev/sda 2、显示硬盘及所属分区情况。在终端窗口中输入如下命令,格式化自己硬盘: sudo mkfs -t ext4 /dev/sda 3、在终端窗口中输入如下…

函数类型注释和Union联合类型注释

函数类型注释格式(调用时提示输入参数的类型): )def 函数名(形参名:类型,形参名:类型)->函数返回值类型: 函数体 Union联合类型注释(可注释多种类型混合的变量)格式: #先导入模块 from typing import…

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!

在Python开发中,字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中,split()函数无疑是最为重要和常用的一个。无论你是Python新手,还是经验丰富的开发者,深入理解并熟练运用split()方法,都将大大提升…

DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?

概述 在数字医学影像处理中,CR(Computed Radiography,计算机放射摄影)和DR(Digital Radiography,数字放射摄影)技术广泛应用于医疗影像获取与分析。然而,临床实践中常常遇到这样一个问题:部分CR/DR图像在默认打开时呈现为反色(即负片效果),需手动反色后才能正常阅片…

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗? 把业务逻辑写入数据库,重新定义简单与效率。…

详解 【AVL树】

AVL树实现 1. AVL的概念AVL树的实现2.1 AVL树的结点结构2.2 AVL树的插入2.2.1 AVL树的插入的一个大概操作:2.2.2 AVL树的平衡因子更新2.2.3 平衡因子的停止条件2.2.4 再不考虑旋转的角度上实现AVL树的插入 2.3 旋转2.3.1 旋转的原则2.3.2 右单旋2.2.3 右单旋代码实现…

go语言range的高级用法-使用range来接收通道里面的数据

在 Go 语言中,可以使用 for ... range 循环来遍历通道(channel)。for ... range 循环会一直从通道中接收值,直到通道关闭并且所有值都被接收完毕。 使用 for ... range 遍历通道 示例代码 下面是一个使用 for ... range 遍历通…

计算机网络 | 7.网络安全

1.网络安全问题概述 &#xff08;1&#xff09;计算机网络面临的安全性威胁 <1>计算机网络面临的完全性威胁 计算机网络面临的两大类安全威胁&#xff1a;被动攻击和主动攻击 被动攻击 截获&#xff1a;从网络上窃听他人的通信内容。主动攻击 篡改&#xff1a;故意篡改…

Unity——使用Unity制作BIM全景视频、图片

一、说明&#xff1a; 最近在研究使用threejs加载全景视频视图BIM视图的联动对比&#xff0c;需要制作BIM模型场景下测试用的全景视频demo。 二、生成方法 全景视频的可以使用全景相机拍摄&#xff0c;也可以使用三维引擎渲染生成。 BIM建模引擎Revit中可以使用渲染插件生成…

echarts4r 教程2:Advanced

❝ 写在前面 本文为 R 语言 echarts4r 包的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1. echarts4r 教程1&#xff1a…

JSON 性能测试 - WastJson 性能也很快

WAST 是一个高性能 Java 工具集库包&#xff0c;包括 JSON、YAML、CSV、HttpClient、JDBC 和 EL 引擎. WastJson 无论是小中大文本各种数据类型等性能都没有明显的短板&#xff0c;除了推广外可以说是六边形战士&#xff0c;更多测试参考 wast-jmh-test: wast性能测试 (并非所…

DICOM图像处理:深入解析DICOM彩色图像中的Planar配置及其对像素数据解析处理的实现

引言 在DICOM(Digital Imaging and Communications in Medicine)标准中,彩色图像的存储与显示涉及多个关键属性,其中**Planar Configuration(平面配置)**属性(标签 (0028,0006))尤为重要。当遇到彩色DICOM图像在浏览时被错误地分割为9张小图,而实际应显示为一…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前&#xff0c;写了django制作简易登录系统&#xff0c;这次利用django内置的authentication功能实现注册、登录 提示&#xff…