Java基础总结(2)

1.实例方法和静态方法的区别

  • 调用方式不同:静态方法可以通过类名.方法名直接调用,也可以通过当前类的实例对象.方法名来调用,但是实例方法只能通过后者来访问
  • 访问类的成员存在限制:在静态方法内部,只能访问类的静态成员,不允许访问非静态成员;而实例方法不受限制

2.值传递和引用传递的区别

  • 值传递是指在方法调用时,将实际参数的值复制一份传递给形式参数,相当于将副本传递了过去。对形式参数的修改不会影响实际参数的值。
  • 引用传递是指在方法调用时,将实际参数的引用(内存地址)传递给形式参数。形式参数和实际参数指向同一块内存地址,对形式参数的修改会影响实际参数的值。
    注意区分实际参数和形式参数

3.重载和重写的区别

  • 重载:发生在同一个类中,方法名相同,但是方法的形参顺序、个数、数据类型、方法的返回值、方法的修饰符可以不同
  • 重写:发生在父子类中,方法名相同,形参列表相同;
    同时遵循“两同、两小、一大”:就是方法名相同、形参列表相同,子类重写的方法的返回值类型要小于父类方法、子类方法的声明抛出的异常必须小于或等于父类的,重写的方法的权限修饰符要大于或等于父类方法的
    注意:如果返回值是void或者基本数据类型,那么重写时不可以修改。如果是引用数据类型,那么可以返回引用数据类型的子类。

4.深拷贝和浅拷贝

前提: 深拷贝和浅拷贝的主要区别在于对于对象内部引用类型属性的处理方式。基本数据类型直接存储在栈中,引用数据类型在栈中存储引用,真实的数据放在堆内存内。
1.浅拷贝(Shallow Copy):
浅拷贝指在克隆操作中,只复制对象本身以及对象内部的基本数据类型的属性,以及实例对象的引用地址,而不复制引用类型所指向的属性,新旧对象还是共享同一块内存。
为了实现浅拷贝,实现 Cloneable 接口和重写 clone() 方法;
2.深拷贝(Deep Copy):
深拷贝指在克隆操作中,除了复制对象本身以及对象内部的基本数据类型的属性外,还要递归地复制对象内部的引用类型的属性。即深度克隆了所有引用类型的属性。
为了实现深拷贝,需要将对象及其关联的对象都实现序列化,再反序列化为对象
面试题:深拷⻉和浅拷⻉
深拷⻉和浅拷⻉就是指对象的拷⻉,⼀个对象中存在两种类型的属性,⼀种是基本数据类型,⼀种是实 例对象的引⽤。

  1. 浅拷⻉是指,只会拷⻉基本数据类型的值,以及实例对象的引⽤地址,并不会复制⼀份引⽤地址所 指向的对象,也就是浅拷⻉出来的对象,内部的类属性(引用数据类型)指向的是同⼀个对象
  2. 深拷⻉是指,既会拷⻉基本数据类型的值,也会针对实例对象的引⽤地址所指向的对象进⾏复制, 深拷⻉出来的对象,内部的属性指向的不是同⼀个对象

5.Java的可变长参数

从java5开始,java开始支持不定长参数,就是在调用方法时,允许传入不定长的参数,并且可变参数自能作为参数的最后一个,在方法重载时会优先匹配固定参数的方法

6.谈谈你对面向对象的理解

面向对象以对象为中心,将问题看成一个对象组成,这些对象有自己的属性和行为(方法),通过这些属性和行为共同协调解决问题
面向过程以过程为中心,强调的是解决问题的步骤、顺序,将解决问题分为若干个步骤,再分别依次执行
封装: 对与一个类内部的属性和成员,进行封转,对外隐藏内部的实现细节,只对外暴露必要的接口,调用不知道内部的实现细节
继承: 子类继承父类的属性和方法,可以进行自己的扩展,对于父类含有的方法和属性,不需要再重新定义
多态: 同一方法在不同的对象上产生的不同的行为。

7.成员变量与局部变量的区别有哪些?

  1. 定义位置不同:成员变量定义在类中、方法体外,又分为实例变量和类变量(用static修饰的变量);局部变量定义在方法体中或局部代码块中
  2. 生命周期不同:成员变量随着对象的创建而产生,随着对象销毁而消失;局部变量随着方法的压栈而产生,随着方法的弹栈而消失。
  3. 存储位置不同:实例变量存储在堆内存中,与对象一起分配空间,类变量存储在方法区中,局部变量存储在栈内存中(成员变量存储在堆中,局部变量存储在栈中)
  4. 作用域不同:成员变量作用于整个类,而局部变量只作用于它所在的方法、代码块、构造方法中
  5. 初始化不同:成员变量有默认值,而局部变量在使用时,必须进行显试初始化
  6. 修饰符的使用不同:成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及static修饰;两者都可以定义成final型。

8.对象实体和对象引用的区别

对象实体: 指的是在内存中真正存在的对象,它占据一定的内存空间,并保存了对象的属性值。
对象引用: 指的是对对象的引用或者说指针,它是一个变量,用于存储对象在内存中的地址。通过对象引用,我们可以访问和操作对象的属性和方法。
简单来说,对象实体是具体的对象,而对象引用是指向对象实体的指针(jjava中没有指针,这里是比喻的说法)。

9.构造方法的作用,特点

  • 构造方法是用于创建和初始化对象的特殊方法。
  • 构造方法与类同名,没有返回类型。
  • 构造方法可以重载,但不能被继承或覆盖。
  • 默认构造方法是编译器自动生成的,如果没有显式定义任何构造方法,默认会有无参数的构造方法。但是如果定义了有参构造方法,那么默认的构造方法就消失了。
  • 构造方法不能手动调用,在创建类实例的时候自动调用构造方法。

10.反射

什么是反射
Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法 ;对于任意一个对象,都能够调用它的任意一个方法和属性 ;这种 动态获取的信息以及动态调用对象的方法的功能 称为 Java 语言的反射机制。
简单说就是:能够通过类的名字获取到类的关键信息

如下图:在这里插入图片描述
反射调用方法
优缺点(仅供参考)

优点:使用者可以在运行时动态获取类的各种信息,使得代码更加灵活;
通用性: 反射提供了一种通用的访问类信息和操作类对象的手段,这使得一些通用的库、框架和工具能够在不知道具体类的情况下进行操作,增加了代码的通用性和可重用性。
适用于编写通用代码: 通过反射,可以编写一些通用的代码,例如序列化、反序列化、对象映射等,而不需要针对每个类编写特定的代码。
缺点:反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;安全问题,反射允许访问类的私有信息,可能破坏封装性;代码可读性降低
使用场景(仅供参考)

  1. 框架和工具
    许多框架和工具使用反射来实现插件化架构,允许在运行时动态加载和执行类,从而实现更灵活的扩展和定制。
  2. 配置文件解析
    反射可以用于解析配置文件,实例化成java对象,使得配置更加灵活且易于维护(可读性)。
  3. junit单元测试
    在单元测试中,反射可以被用来调用私有方法、设置私有字段等,以便更好地进行测试,并确保代码的健壮性和可维护性。
  4. 注解处理器
    某些框架和库使用反射来处理注解,例如Spring框架通过反射实现了依赖注入的功能。
  5. ORM(对象关系映射)
    ORM框架通常使用反射来映射Java对象与数据库表之间的关系,实现数据的持久化和检索。比如说Hibernate

获取Class的几种方式
Class.forName(“全类名”);
类名.class
对象.getClass()
通过类加载器获取
如下:

public class Demo {public static void main(String[] args) throws ClassNotFoundException {//1.Class.forName(“全类名”);Class<?> demoClass1 = Class.forName("List.Demo");//2.类名.classClass<Demo> demoClass2 = Demo.class;//3.对象.getClass()Demo demo = new Demo();Class<? extends Demo> demoClass3 = demo.getClass();//4.通过类加载器获取ClassLoader classLoader = Demo.class.getClassLoader();Class<?> demoClass4 = classLoader.loadClass("List.Demo");System.out.println(demoClass1);System.out.println(demoClass2);System.out.println(demoClass3);System.out.println(demoClass4);
}

输出:

class List.Demo
class List.Demo
class List.Demo
class List.Demo

11.序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化.
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
作用:对内存中的对象进行持久化或网络传输,这个时候都需要序列化和反序列化.
避免被序列化的方法
使用Transient关键字:Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
也就是说被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null。
为什么要显示指定 serialVersionUID 的值?谈谈你的理解?
在进行序列化对象时,序列化版本号会随对象的属性一起进行序列化(其实版本号没有被序列化,JVM 在序列化对象时会自动生成一个 serialVersionUID,然后将显示指定的 serialVersionUID 属性值赋给自动生成的 serialVersionUID),然后进行网络传输或持久化,在进行反序列化时,jvm会读取序列化流中的serialVersionUID,然后将这个版本号和之前的版本号进行比对,如果相同那么就序列化成功,否则失败。
如果显示指定了 serialVersionUID,JVM 在序列化和反序列化时就会保证serialVersionUID相等,值为显示指定的值,这样在反序列化时新旧版本的 serialVersionUID 就一致了.
如果不指定版本号,那么会造成版本号不一致的的问题,但是如果类写完后不再修改,那么不指定serialVersionUID,也是不会有问题的,但是不修改类几乎是不可能的,所以一般指定版本号

12.键盘输入的实现方式

1.通过System.in.read()输入,返回一个int类型数据
2.通过Scanner类扫描输入
3.通过输入流输入通过InputStreamReaderBufferedReader输入,
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = br.readLine();
sc.next()和sc.nextLine()有什么区别?
next()遇到空格停止接收。

13.字节流和字符流的区别

区别参考
1.基本单位不同:字节流以字节为单位、字符流以字符为单位
2.处理的数据不同:字节流可以处理任何类型的数据,比如视频,图片文本,字符流只能处理文本数据
3.性能不同:字符流通常提供了缓冲机制,可以减少对底层操作系统的调用次数,从而提高性能。当使用字符流进行读写操作时,数据会先被写入到缓冲区中,当缓冲区满或者调用flush方法时,才会将数据真正写入到文件或者从文件中读取数据。
如果需要处理不同字符编码的文本文件,字符流需要进行字符编码的转换,这可能会影响性能。而字节流不受字符编码的影响,可以直接处理原始的字节数据。
所以当频繁地操作数据时,可以用字符流,不频繁时两者的效率相当

14.java中的异常体系

Java中所有异常都来自顶级父类Throwable。
Throwable下有两个字类ExceptionError
Error是程序无法处理的错误,一旦出现这个错误,则程序将被迫停止运行。
Exception不会导致程序停止,又分为两个部分UnCheckedExceptionCheckedException检查异常。UnCheckException下面有RunTimeException和其子类。
RunTimeException常常发生在程序运行过程中,会导致程序当前线程执行失败。CheckedException常常发生在程序编译过程中,会导致编译不通过。

15.switch语句可以作用于哪些数据类型

  1. byte,short,int,char,枚举,在java7(jdk1.7)之后也支持String类型
  2. 不支持float,double,long和boolean

16.java的保留字

参考答案:Java保留字:现有Java版本尚未使用,但以后的版本可能会作为关键字使用。命名标识符时要避免使用这些保留字
gotoconst

17.四种访问权限修饰符?

  • 封装的四种权限修饰符以及访问范围?
  • private
    • 访问范围:仅在定义它的类内部可见。
    • 用途:用于隐藏类的内部实现细节,确保类的属性和方法不被外部直接访问。
  • default(没有修饰符):
    • 访问范围:在同一个包内可见,不使用任何修饰符时默认为包访问级别。
    • 用途:用于在同一个包内的其他类之间共享类、方法和属性,但不允许其他包访问。
  • protected
    • 访问范围:在同一个包内的类以及不同包中继承该类的子类中可见。
    • 用途:用于允许子类访问父类的成员,同时也可以被同一个包内的其他类访问。
  • public
    • 访问范围:对所有类可见,没有访问限制。
    • 用途:用于定义类、方法、构造函数和属性,以便它们可以被任何其他类访问,无论它们位于哪个包中。

18.HashSet、LinkedHashSet、TreeSet的区别

相同点:

  • HashSet、LinkedHashSet、TreeSet都实现了Set接口
  • 三者都保证了元素的唯一性,即不允许元素重复
  • 三者都不是线程安全的
    要想实现线程安全,可以使用 Collections.synchronizedSet(Set<T> s)

不同点:

  • 存储结构:
    HashSet:基于哈希表实现,元素无序。
    LinkedHashSet:基于哈希表和链表实现,元素按照插入顺序排序。(保证FIFO(先进先出)即按插入顺序排序,内部维护了一个双向链表来记录插入顺序)
    TreeSet:基于红黑树实现,元素按照自然顺序或指定的比较器进行排序。
  • null值方面:
    HashSetLinkedHashSet允许添加null值,TreeSet不允许添加null值,添加null时会抛出java.lang.NullPointerException异常。
  • 性能:
    HashSet提供了最快的查找速度(平均时间复杂度为O(1)),基于hashCode()确定元素的位置,但在迭代时顺序是不确定的。
    LinkedHashSet在迭代时保持了插入顺序,查找速度略慢于HashSet(平均时间复杂度为O(1))(虽然哈希表的查找速度仍然很快(平均时间复杂度为O(1)),但由于需要维护链表来记录顺序,所以LinkedHashSet的插入和删除操作略慢于HashSet。)。
    TreeSet提供了最慢的查找速度(平均时间复杂度为O(log n)),但在迭代时可以按照顺序访问元素。

就这了…

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

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

相关文章

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安&#xff0c; 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…

WPF DataGrid 单元格居中,头部居中,点击行改变背景色。

我得全局样式都写在了App.XAML文件下的ResourceDictionary里&#xff0c;方便全局引用 DataGrid样式和点击改变行背景色的触发器(BasedOn继承的是UI框架的样式&#xff0c;若无则删除&#xff0c;触发器还有鼠标移动事件等&#xff0c;按需自行修改添加) <Style x:Key&quo…

安卓13长按电源按键直接关机 andriod13不显示关机对话框直接关机

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有些设备需要在长按电源键的时候,直接关机。不需要弹出对话框进行询问。 2.问题分析 过滤电源按键,需要在系统里面处理的话,那么我们需要熟悉android的事件分发,然后再…

Golang | Leetcode Golang题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit : 0, 0, 0for _, ch : range password {if unicode.IsLower(ch) {hasLower 1} else if unicode.IsUpper(ch) {hasUpper 1} else if unicode.IsDigit(ch)…

【2025】儿童疫苗接种预约小程序(源码+文档+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

hackmyvm靶场--zon

环境 攻击机kali 靶机 未知 主机探测 因为在同一个局域网内使用ARP协议探测存活主机 靶机为192.168.56.128 端口探测 常见的80和22端口 那么一定是寻找web漏洞拿shell了 后台扫描 后台扫描常用dirsearch和gobuster,有时候小字典可能不太行&#xff0c;可以尝试换个大点…

使用AVL树实现Map

一、数组在裂变扩容时可能会出现环、在数组元素转为链表之后选择尾插法插入节点、数组到链表到AVL到RBT的转换 1、数组在裂变扩容时链表中的节点计算出来的位置可能也会发生变化&#xff0c;在多线程情况下调整节点位置可能会出现环。 2、数组中的数组元素转为链表后插入新节点…

设计模式 享元模式(Flyweight Pattern)

享元模式 简绍 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用&#xff0c;从而提高程序的性能。它特别适用于需要创建大量相似对象的场景&#…

Cypress安装与启动(开始学习记录)

一 Cypress安装 使用npm安装 1.查看node.js npm的版本&#xff0c;输入 npm --version 和 node --version&#xff0c;node.js没安装的可以去中文网下载最新稳定版安装&#xff0c;npm不建议升级到最新版本&#xff0c;会导致安装Cypress时Error: Cannot find module ansi-st…

在已安装的openresty上添加安装upstream模块报错的解决以及使用Consul服务发现时定时变更nginx的upstream的shell脚本

一、在已经安装好的openresty环境上添加安装upstream模块报错&#xff1a; 在已经安装好的openresty环境上添加安装upstream模块报错&#xff1a;http upstream check module can not find any check server, make sure you ve added the check 的问题解决。 服务器上已经安装好…

idea中java及java web项目的常见问题

1、乱码问题&#xff0c;主要有几处地方&#xff0c;需要检查。 ①确保文件编码&#xff0c;其实主要就是在idea启动文件中&#xff0c;增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码&#xff0c;都改为UTF-8 ③Tomcat的运行配置&#xff0c;编码也改为UTF-8,同样使用…

SpringBoot3核心特性-核心原理

目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…

zynq的PS端mac与RTL8211F的连接要点

目录 1 VCCO_MIO12 PS_MIO_VREF3 PS的引脚4 RXDLY TXDLY5 ZYNQ的MAC可以调整延时吗 1 VCCO_MIO1 接1.8V 2 PS_MIO_VREF 接0.9V&#xff0c;可通过电阻分压 可通过电阻分压 3 PS的引脚 4 RXDLY TXDLY RXDLY RXD[0] TXDLY RXD[1] 与XC7Z020的PS端MAC连接&#xff0c;必须…

CVE-2024-2389 未经身份验证的命令注入

什么是 Progress Flowmon? Progress Flowmon 是一种网络监控和分析工具,可提供对网络流量、性能和安全性的全面洞察。Flowmon 将 Nette PHP 框架用于其 Web 应用程序。 未经身份验证的路由 我们开始在“AllowedModulesDecider.php”文件中枚举未经身份验证的端点,这是一个描…

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1&#xff09;什么是单元测试框架 单元测试是指再软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试。 2&#xff09;单元测试框架 java&#xff1a;junit和testing python&#xff1a;un…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中&#xff0c;点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点&#xff0c;然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮&#xff0c;选择【一阶多项式&#xff08;仿射&#xff09;】变换 7…

基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图

目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spri…

使用c#制作一个小型桌面程序

封装dll 首先使用visual stdio 创建Dll新项目,然后属性管理器导入自己的工程属性表&#xff08;如果没有可以参考visual stdio 如何配置opencv等其他环境&#xff09; 创建完成后 系统会自动生成一些文件&#xff0c;其中 pch.cpp 先不要修改&#xff0c;pch.h中先导入自己需…

蓝牙模块—BLE-CC41-A

1. 蓝牙的特点 蓝牙模块采用的 TI 公司设计的 CC2541芯片&#xff0c;主要面向低功耗蓝牙通信方案&#xff0c;该模块的工作频段为 2.4Ghz&#xff0c;这个频段属于国际通用频段 注意&#xff1a;蓝牙集成了一个状态指示灯&#xff0c;LED灯如果均匀慢速闪烁&#xff0c;就表示…

【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1

vulnhub源码框架漏洞中的CVE-2018-7600-Drupal 7.57 文章目录  前言 1.靶场搭建&#xff1a; 2.信息搜集&#xff1a; 主机探测&#xff1a; 端口扫描&#xff1a; 目录扫描&#xff1a; 3.分析&#xff1a; 4.步骤&#xff1a; 1.下载CVE-2018-7600的exp 2.执行exp: 3.写入木…