目录

访问修饰符的区别

 this关键字的作用

抽象类和接口有什么区别

抽象类可以定义构造方法吗

但是接口不可以定义构造方法

Java支持多继承吗

接口可以多继承吗

继承和抽象的区别?

抽象类和普通类的区别

成员变量和局部变量的区别?

staic关键字了解吗

final关键字的作用

final,finally,finalize区别

==和equals的区别

为什么重写equals时必须重写hashcode方法

什么是hashcode方法

为什么要有hashcode方法

为什么两个对象有相同的hashcode值,却不一定相等呢

Java是值传递还是引用传递

深拷贝和浅拷贝的区别

java创建对象的方式有哪几种

new子类的时候,父类和父类静态代码块,构造方法的执行顺序

String

String是Java的基本数据类型吗,可以被继承吗

String有哪些常用的方法

String,Stringbuffer,Stringbulider的区别

String

Stringbuilder

Stringbuffer

String str1 = new String("abc")和 String str2 =“abc”的区别

String是不可变类?字符串拼接是如何实现的?

如何保证String不可变

String如何转为Integer

访问修饰符的区别

ava 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。可以修饰在类、接口、变量、方法。
  • private : 在同一类内可见。可以修饰变量、方法。注意:不能修饰类(外部类)
  • public : 对所有类可见。可以修饰类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见。可以修饰变量、方法。注意:不能修饰类(外部类)

 this关键字的作用

this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

1、普通的直接引用,this相当于是指向当前对象本身

2、形参与成员变量名字重用,用this区分

public Person(String name,int age){this.name=name;this.age=age;
}

3、引用本类的构造方法

抽象类和接口有什么区别

一个类只能继承一个抽象类,但一个类可以实现多个接口。所以我们在新建线程类一般推荐使用实现Runnable接口的方式,这样线程类还可以继承其他类,而不单单是Thread类。

抽象类符合is-a的关系,而接口更像是has-a的关系,比如说一个类可以序列化的时候,它只需要实现Seralizable接口就可以了,而不需要去继承一个序列化的类。

抽象类更多的是用来为多个相关的类提供一个共同的基础框架,包括状态的初始化,而接口则是定义了一套行为标准,让不同的类可以实现同一接口。提供行为的多样化实现。

抽象类可以定义构造方法吗

可以,抽象类可以有构造方法

但是接口不可以定义构造方法

接口主要用于定义一组方法规范,没有具体的实现细节

Java支持多继承吗

Java不支持多继承,一个类只能继承一个类,多继承会引发菱形继承问题

class A {void show() { System.out.println("A"); }
}class B extends A {void show() { System.out.println("B"); }
}class C extends A {void show() { System.out.println("C"); }
}// 如果 Java 支持多继承
class D extends B, C {// 调用 show() 方法时,D 应该调用 B 的 show() 还是 C 的 show()?
}

接口可以多继承吗

接口可以多继承,一个接口可以继承多个接口,使用逗号分隔

interface InterfaceA {void methodA();
}interface InterfaceB {void methodB();
}interface InterfaceC extends InterfaceA, InterfaceB {void methodC();
}class MyClass implements InterfaceC {public void methodA() {System.out.println("Method A");}public void methodB() {System.out.println("Method B");}public void methodC() {System.out.println("Method C");}public static void main(String[] args) {MyClass myClass = new MyClass();myClass.methodA();myClass.methodB();myClass.methodC();}
}

在上面的例子中,InterfaceA 和 InterfaceB 是两个独立的接口。

InterfaceC 继承了 InterfaceA 和 InterfaceB,并且定义了自己的方法 methodC。

MyClass 实现了 InterfaceC,因此需要实现 InterfaceA 和 InterfaceB 中的方法 methodA 和 methodB,以及 InterfaceC 中的方法 methodC。

继承和抽象的区别?

继承是一种允许子类继承父类属性和方法的机制。通过继承,子类可以重用父类的代码

抽象是一种隐藏复杂性和只显示必要部分的技术,在面向对象编程中,抽象可以通过抽象类和接口实现

抽象类和普通类的区别

抽象类使用abstract关键字定义,不能被实例化,只能最为其他类的父类。普通类没有 abstract 关键字,可以直接实例化。

抽象类可以包含抽象方法和非抽象方法。抽象方法没有方法体,必须由子类实现。普通类只能包含非抽象方法。

成员变量和局部变量的区别?

1、语法上来看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符修饰,局部变量不能被修饰符修饰。但是成员变量和局部变量都能被final修饰

2、从变量在内存的存储来看: 如果成员变量使用staic修饰的,那么这个成员变量是属于类的,如果没有staic修饰,那么是属于实例的。对象存于堆内存,如果局部变量类型为基本数据类型,那么存储在栈内存,如果为引用数据类型,那存放的是指向堆内存对象的引用或者是指向常量池中的地址。

3、从变量在内存的生存时间来看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

4、成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(被final修饰的成员变量也必须显示的赋值),而局部变量则不会自动赋值

staic关键字了解吗

static关键字可以用来修饰变量,方法,代码块和内部类,以及导入包

修饰对象作用
变量静态变量,类级别变量,所有实例共享同一份数据。
方法静态方法,类级别方法,与实例无关。
代码块在类加载时初始化一些数据,只执行一次。
内部类与外部类绑定但独立于外部类实例。
导入可以直接访问静态成员,无需通过类名引用,简化代码书写,但会降低代码可读性。

静态变量: 是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个副本。

实例变量: 必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

静态方法:static 修饰的方法,也被称为类方法。在外部调⽤静态⽅法时,可以使⽤"类名.⽅法名"的⽅式,也可以使⽤"对象名.⽅法名"的⽅式。静态方法里不能访问类的非静态成员变量和方法。

实例⽅法:依存于类的实例,需要使用"对象名.⽅法名"的⽅式调用;可以访问类的所有成员变量和方法。

final关键字的作用

1、当final修饰一个类时,表明这个类不能被继承。

2、当final修饰一个方法时,表明这个方法不能被重写

3、当final修饰一个变量时,表明这个变量的值一旦被初始化就不能被修改

final,finally,finalize区别

final是一个修饰符,可以修饰类,方法和变量。可以修饰类、方法和变量。当 final 修饰一个类时,表明这个类不能被继承;当 final 修饰一个方法时,表明这个方法不能被重写;当 final 修饰一个变量时,表明这个变量是个常量,一旦赋值后,就不能再被修改了。

finally 是Java中异常处理的一部分,用来创建 try 块后面的 finally 块。无论 try 块中的代码是否抛出异常,finally 块中的代码总是会被执行。通常,finally 块被用来释放资源,如关闭文件、数据库连接等。

finallize是Object类的一个方法,用于垃圾回收器将对象从内存中清除出去之前做一些必要的清理工作。

==和equals的区别

1、==用于比较两个对象的引用,即他们是否指向同一个对象实例。对于基本数据类型,==比较的是值是否相等

2、equals用于比较两个对象的内容是否相等,但是默认情况下和==相同,比较对象引用。然而,equals() 方法通常被各种类重写。例如,String 类重写了 equals() 方法,以便它可以比较两个字符串的字符内容是否完全一样。

为什么重写equals时必须重写hashcode方法

因为基于哈希的集合类(如 HashMap)需要基于这一点来正确存储和查找对象。

具体地说,HashMap 通过对象的哈希码将其存储在不同的“桶”中,当查找对象时,它需要使用 key 的哈希码来确定对象在哪个桶中,然后再通过 equals() 方法找到对应的对象。

如果重写了 equals()方法而没有重写 hashCode()方法,那么被认为相等的对象可能会有不同的哈希码,从而导致无法在 HashMap 中正确处理这些对象。

什么是hashcode方法

hashCode() 方法的作⽤是获取哈希码,它会返回⼀个 int 整数,定义在 Object 类中, 是一个本地⽅法。

为什么要有hashcode方法

hashcode方法主要用于来获取对象的哈希码,哈希码是由对象的内存地址或者对象属性计算出来的,它是一个int类型的整数,通常是不会重复的,因此可以用来作为键值对的建,以提高查询效率。

为什么两个对象有相同的hashcode值,却不一定相等呢

哈希码是通过哈希函数将对象中映射成一个整数值,其主要目的是在哈希表中快速定位对象的存储位置。

由于哈希函数将一个较大的输入域映射到一个较小的输出域,不同的输入值(即不同的对象)可能会产生相同的输出值(即相同的哈希码)。

这种情况称为哈希冲突。当两个不相等的对象发生哈希冲突时,它们会有相同的 hashCode。为了解决哈希冲突的问题,哈希表在处理键时,不仅会比较键对象的哈希码,还会使用 equals 方法来检查键对象是否真正相等。如果两个对象的哈希码相同,但通过 equals 方法比较结果为 false,那么这两个对象就不被视为相等。

Java是值传递还是引用传递

Java是值传递

当一个对象被作为参数传递到方法中时,参数的值就是该对象的引用。引用的值是对象在堆中的地址。对象是存储在堆中的,所以传递对象的时,可以理解为把变量存储的对象地址给传递过去。

深拷贝和浅拷贝的区别

在 Java 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种拷贝对象的方式,它们在拷贝对象的方式上有很大不同。

 浅拷贝会创建一个新的对象,但这个对象的属性和原对象的属性完全相同。如果属性是基本数据类型,拷贝的是基本数据类型的值;如果属性是引用类型,拷贝的是引用地址。因此新旧对象共享一个引用对象。

浅拷贝的实现方式:实现Cloneable接口并重写clone方法

深拷贝也会创建一个新对象,但是会递归的赋值所有的引用对象,确保新对象和原对象完全独立。新对象与原对象的任何更改都不会相互影响。

深拷贝的实现方法有:手动复制所有的引用对象,或者使用序列化和反序列化。

java创建对象的方式有哪几种

new子类的时候,父类和父类静态代码块,构造方法的执行顺序

1、首先执行父类的静态代码块(仅在第一次加载时执行)

2、接着执行子类的静态代码块(仅在类第一次加载时执行)

3、再执行父类的构造方法

4、最后执行子类的构造方法

String

String是Java的基本数据类型吗,可以被继承吗

不是,String是一个类,属于引用数据类型。String也不可以被继承,因为被final修饰

String有哪些常用的方法

1、length 返回字符串长度

2、charAt 返回指定位置的字符

3、substring 返回字符串的一个子串

4、contains 检查字符换是否包含指定的字符序列

5、equals比较两个字符串内容是否相等

6、indexof 返回指定字符或者字符串首次出现的位置

7、replace替换字符串中的字符或字符序列

8、trim去除字符串两端的空白字符

9、split 根据给定正则表达式的匹配拆分此字符串

String,Stringbuffer,Stringbulider的区别

StringStringBuilderStringBuffer在 Java 中都是用于处理字符串的,它们之间的区别是,String 是不可变的,平常开发用得最多,当遇到大量字符串连接时,就用 StringBuilder,它不会生成很多新的对象,StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的。

String
  • String类的对象是不可变的。也就是说,一旦一个String对象被创建,它所包含的字符串内容是不可改变的。
  • 每次对String对象进行修改操作(如拼接、替换等)实际上都会生成一个新的String对象,而不是修改原有对象。这可能会导致内存和性能开销,尤其是在大量字符串操作的情况下。
Stringbuilder
  • StringBuilder提供了一系列的方法来进行字符串的增删改查操作,这些操作都是直接在原有字符串对象的底层数组上进行的,而不是生成新的 String 对象。
  • StringBuilder不是线程安全的。这意味着在没有外部同步的情况下,它不适用于多线程环境。
  • 相比于String,在进行频繁的字符串修改操作时,StringBuilder能提供更好的性能。 Java 中的字符串连+操作其实就是通过StringBuilder实现的。
Stringbuffer

StringBufferStringBuilder类似,但StringBuffer是线程安全的,方法前面都加了synchronized关键字。

String str1 = new String("abc")和 String str2 =“abc”的区别

直接使用双引号为字符串变量赋值时,Java 首先会检查字符串常量池中是否已经存在相同内容的字符串。

如果存在,Java 就会让新的变量引用池中的那个字符串;如果不存在,它会创建一个新的字符串,放入池中,并让变量引用它。

使用 new String("abc") 的方式创建字符串时,实际分为两步:

  • 第一步,先检查字符串字面量 "abc" 是否在字符串常量池中,如果没有则创建一个;如果已经存在,则引用它。
  • 第二步,在堆中再创建一个新的字符串对象,并将其初始化为字符串常量池中 "abc" 的一个副本。

 new String("abc")创建了几个对象

字符串常量池中如果之前已经有一个,则不再创建新的,直接引用;如果没有,则创建一个。

堆中肯定有一个,因为只要使用了 new 关键字,肯定会在堆中创建一个。

String是不可变类?字符串拼接是如何实现的?

String 是不可变的,这意味着一旦一个 String 对象被创建,其存储的文本内容就不能被改变。这是因为:

①、不可变性使得 String 对象在使用中更加安全。因为字符串经常用作参数传递给其他 Java 方法,例如网络连接、打开文件等。

如果 String 是可变的,这些方法调用的参数值就可能在不知不觉中被改变,从而导致网络连接被篡改、文件被莫名其妙地修改等问题。

②、不可变的对象因为状态不会改变,所以更容易进行缓存和重用。字符串常量池的出现正是基于这个原因。

当代码中出现相同的字符串字面量时,JVM 会确保所有的引用都指向常量池中的同一个对象,从而节约内存。

③、因为 String 的内容不会改变,所以它的哈希值也就固定不变。这使得 String 对象特别适合作为 HashMap 或 HashSet 等集合的键,因为计算哈希值只需要进行一次,提高了哈希表操作的效率。

因为 String 是不可变的,因此通过“+”操作符进行的字符串拼接,会生成新的字符串对象。Java 8 时,JDK 对“+”号的字符串拼接进行了优化,Java 会在编译期基于 StringBuilder 的 append 方法进行拼接,String.join() 等方式

如何保证String不可变

第一,String 类内部使用一个私有的字符数组来存储字符串数据。这个字符数组在创建字符串时被初始化,之后不允许被改变。

第二,String 类没有提供任何可以修改其内容的公共方法,像 concat 这些看似修改字符串的操作,实际上都是返回一个新创建的字符串对象,而原始字符串对象保持不变。

第三,String 类本身被声明为 final,这意味着它不能被继承。这防止了子类可能通过添加修改方法来改变字符串内容的可能性。

String如何转为Integer

String 转成 Integer,主要有两个方法:

  • Integer.parseInt(String s)
  • Integer.valueOf(String s)

不管哪一种,最终还是会调用 Integer 类内中的parseInt(String s, int radix)方法。

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

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

相关文章

(实用教程)Linux操作系统(二)

centos配置静态ip 注意: 1.系统中的网关要与虚拟机编辑器中的网关保持一致 2.如果配置虚拟机编辑器后发现ping不通外网的时候,就要还原默认设置再进行配置 总结: 虚拟机编辑器需要配置ip,网关,其中ip网段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例实现

ThinkPHP8集成RabbitMQ的完整案例实现一、安装依赖:需通过Composer安装php-amqplib库‌二、配置RabbitMQ三、生产者1、发送一个邮件,将任务发送到RabbitMQ队列中。2、运行结果展示四、启动消费者:命令行执行php think rabbitmq:consumer1&…

解密负载均衡:如何轻松提升业务性能

什么是负载均衡 负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了 公司业务的…

mac neo4j install verifcation

本文使用conda环境安装,neo4j所依赖jdk也采用conda install的方式安装。 1 neo4j下载 点击如下链接,选择community, Linux/Mac Executor,点击Download Community。 本文下载的安装包是 neo4j-community-2025.06.2-unix.tar.gz 2 安装neo4j …

【Oracle】Oracle分区表“排雷“指南:当ORA-14400错误找上门时如何优雅应对

引言:分区表里的"定时炸弹"凌晨三点的机房,你盯着屏幕上刺眼的ORA-14400: 插入的分区键值超出所有分区范围错误,后背发凉。这个错误就像埋在分区表里的定时炸弹,一旦触发就会让整个应用瘫痪。但别慌!本文将带…

设计模式(十四)行为型:职责链模式详解

设计模式(十四)行为型:职责链模式详解职责链模式(Chain of Responsibility Pattern)是 GoF 23 种设计模式中的行为型模式之一,其核心价值在于将多个处理对象(处理器)连接成一条链&am…

WAIC 2025 热点解读:如何构建 AI 时代的“视频神经中枢”?

一、🌐 WAIC 2025 大会看点:AI 正在“长出眼睛与身体” 在 2025 年的人工智能大会(WAIC 2025)上,“大模型退幕后,具身智能登场”成为最具共识的趋势转向。从展区到主论坛,再到各大企业发布的新…

OpenCV+Python

安装 OpenCV: Python:直接 pip install opencv-python(核心库)和 opencv-contrib-python(扩展功能)。 pip install opencv-python pip install opencv-contrib-python 验证安装: import cv2…

现代C++的一般编程规范

一般情况下不要使用std::endl,尤其是在循环中,因为可能一开始你只是想要打印一个换行符,但是"endl"做的更多,其还会刷新缓冲区,这会额外花费很多时间,相反,只需要使用“\n"&…

38.安卓逆向2-frida hook技术-过firda检测(三)(通过SO文件过检测原理)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

创建属于自己的github Page主页

安装手册 安装手册 环境要求 Node.js version 18.0 安装 Node.js 时,建议勾选所有和依赖相关的选项。 安装步骤 安装 Docusaurus 最简单的方法是使用 create-docusaurus 命令行工具,它可以帮助你快速搭建一个 Docusaurus 网站的基础框架。 你可以在…

Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构

在2025年DataAI Summit上,Databricks发布了一系列重大更新,标志着企业数据治理进入新阶段。其中,Unity Catalog的增强功能和对Apache Iceberg的全面支持尤为引人注目。这些更新不仅强化了跨平台数据管理能力,还推动了开放数据生态…

雨季,汽车经常跑山区,该如何保养?

雨季来临,山区道路变得湿滑难行,频繁穿梭于此的汽车面临着前所未有的挑战。如何在这样恶劣的环境中确保爱车安然无恙?本文将为你详细解析雨季经常跑山区的汽车该如何保养,让你在遭遇突发状况时也能从容应对。当雨季遇上山区路况&a…

Spring Boot音乐服务器项目-查询音乐模块

一、项目架构概览 该音乐播放服务器采用经典的MVC分层架构,核心模块包括: 实体层:定义数据模型Mapper层:数据库操作接口Controller层:HTTP请求处理工具层:加密、响应封装等辅助功能 项目核心功能包括用户…

Imagine:高效免费的图片压缩工具

很多时候,我们需要对图片进行压缩,却苦于找不到免费又好用的工具。这里给大家推荐一款电脑端的图片压缩软件——Imagine。 Imagine文末获取 它有诸多优点: 开源免费:无需担心付费问题,完全免费使用。 便捷易用&#…

《Uniapp-Vue 3-TS 实战开发》自定义年月日时分秒picker组件

目前组件: 组件完整代码: <template><view><picker mode="multiSelector" :value="multiIndex" :range="multiRange" @change="onMultiChange"><view class="picker">{{ formattedDateTime }}&l…

生命通道的智慧向导:Deepoc具身智能如何重塑医院导诊机器人的“仁心慧眼”

生命通道的智慧向导&#xff1a;Deepoc具身智能如何重塑医院导诊机器人的“仁心慧眼”清晨八点的三甲医院门诊大厅&#xff0c;一台导诊机器人突然转向无障碍通道。视觉系统捕捉到轮椅上的颤抖双手&#xff0c;自动降低语速并调大屏幕字体&#xff1b;识别出老人病历本上的“心…

【51单片机和数码管仿真显示问题共阴共阳代码】2022-9-24

缘由单片机和数码管仿真显示问题-嵌入式-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64,15,56}; //共阴0~F消隐减号 void smxs(unsigned char mz, unsigned c…

Java#包管理器来时的路

不依赖任何Jar包 - HelloWorld.java mkdir demo && cd demo;# HelloWorld.java cat > HelloWorld.java << EOF public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, world!");} } EOF# 编译class javac …

Android Framework知识点

1 重点知识 1.1 Alarm 当手机重启或者应用被杀死的时候&#xff0c;Alarm会被删除&#xff0c;因此&#xff0c;如果想通过Alarm来完成长久定时任务是不可靠的&#xff0c;如果非要完成长久定时任务&#xff0c;可以这样&#xff1a;将应用的所有Alarm信息存到数据库中&#xf…