本系列为Java常见面试题集锦,持续更新中,包括笔试题和面试题,建议收藏慢慢看

1. while(true){}有什么用

while(true){} 是一个无限循环的语句,它的作用是让程序在执行到该语句时不停地循环下去,直到程序被终止或者遇到 break、return 等跳出循环的语句。

无限循环的使用场景比较多,例如:

实现多线程中的循环操作,保持线程一直在运行;
实现服务器中的持续监听客户端请求,等待客户端连接;
实现游戏程序中的主循环,控制游戏的运行。
需要注意的是,在使用无限循环时,需要注意控制循环体内部的逻辑,避免出现死循环,导致程序无法正常结束。通常可以通过添加跳出循环的条件或者使用 break、return 等语句来控制循环的结束。

2. switch语句括号中的值可不可以是null,case值可不可以是null

在Java中,switch语句括号中的值可以是null,但是case值不能是null,否则会导致编译错误。

如果括号中的值为null,则只有在case语句中使用null常量时才会匹配。例如:

String str = null;switch(str) {case null:System.out.println("str is null");break;default:System.out.println("str is not null");}

这段代码中,括号中的值为null,但是只有当case语句中使用null常量时才会匹配。

3. switch语句的case和default有顺序吗

switch语句中,casedefault子句的顺序是有影响的。casedefault子句的顺序必须是先写 case,再写 default,而且在一个 switch语句块中,case子句的顺序也是很重要的,因为 switch语句会按照 case子句的顺序来匹配表达式的值,找到与表达式值匹配的case子句之后就会执行该子句后的语句,并且不会再继续匹配其他的 case子句。如果在所有的 case子句中都没有找到匹配的值,那么就会执行 default子句,如果没有 default子句,那么 switch语句块就不会执行任何操作。

4. java线程同步和异步的区别

在Java中,同步和异步是指多线程并发执行中的两种不同的机制。

同步指的是线程之间的协作方式,即当一个线程在执行一个任务时,其他线程必须等待该线程执行完该任务后才能执行同一段代码。同步机制通常使用synchronized关键字或Lock对象进行实现,以保证多线程共享的资源同步访问。

异步指的是线程之间的独立执行,即当一个线程在执行一个任务时,其他线程不需要等待该线程完成,可以继续执行其他任务。异步机制通常使用多线程或回调函数进行实现,以提高程序的并发性和响应能力。

在Java中,线程同步和异步的区别在于线程之间的协作方式不同,同步需要保证多个线程之间的互斥和同步,以防止共享资源出现冲突或数据不一致,而异步则可以充分利用多核处理器,提高程序的并发性和响应能力。

5. java程序的基本格式

Java程序的基本格式包括三个部分:包声明、导入其他类、类定义。

(1). 包声明: 使用package关键字声明该Java文件所在的包,语法如下:

package 包名;

(2). 导入其他类: 使用import关键字导入需要使用的其他类,语法如下:

import 包名.类名;

如果需要导入整个包,则可以使用通配符*,语法如下:

import 包名.*;

(3).类定义: Java程序必须包含一个公共的类,并且该类中必须包含一个main()方法,该方法是程序执行的入口点。类定义的基本语法如下:

[修饰符] class 类名 {// 类的成员变量和方法}

main()方法的定义如下:

public static void main(String[] args) {// 程序代码}

在Java程序中,每个语句必须以分号;结尾,程序的代码必须写在{}中。

6. byte型数据的取值范围怎么计算

Java中的byte是有符号的8位整数类型,其取值范围是从-128到127,可以通过以下方式计算:

由于byte是有符号的,所以它的最高位为符号位,值为1表示负数,值为0表示非负数。
剩下的7位为数据位,最大值为27-1=127,最小值为-27=-128。
因此,byte型数据的取值范围为-128到127。

7. java开发是前端还是后端

Java开发可以涉及前端和后端两个方向,具体取决于开发人员的兴趣和专业方向。在后端方向,Java常用于开发服务器端应用程序,如Web应用、企业应用、移动应用等。在前端方向,Java可以用于开发Android应用程序,并且也可以使用Java开发基于Web的前端应用程序,如JavaServer Pages(JSP)等。除此之外,Java还可以用于开发各种类型的桌面应用程序、游戏和工具等。因此,Java的应用领域非常广泛,是一门非常强大的编程语言。

8. while循环可以被return结束吗

是的,while循环可以被return语句结束。当return语句执行时,程序会立即跳出方法并返回值,同时结束while循环的执行。

9. java中节点流与过滤流(处理流)的区别

Java中的I/O流可以分为节点流和处理流(过滤流)。节点流直接和数据源相连,而过滤流则是对节点流进行包装,对数据进行处理,提高了数据的处理效率。

具体来说,节点流是指直接与数据源进行交互的流,例如FileInputStream、FileOutputStream、ByteArrayInputStream等,节点流通常用于读写原始的字节流或者字符流。

而过滤流则是通过对节点流的包装,在处理数据的同时进行一些额外的功能,例如缓存、压缩、加密等。过滤流包括BufferedInputStream、BufferedOutputStream、DataInputStream、DataOutputStream等。过滤流通过读取节点流的数据,对数据进行处理,并将处理后的数据输出到下一个过滤流或者节点流中,从而提高了数据的处理效率。

因此,节点流主要是用来处理数据源,而过滤流则是对数据进行加工处理,提高了数据的处理效率和功能。

10. 微服务开发框架优势与特点

微服务开发框架的优势和特点如下:

高度可伸缩性: 微服务框架允许单独扩展和部署单个服务,这使得系统具有更高的可伸缩性和弹性。这意味着,如果某个服务需要更多的资源,可以通过增加它的实例来快速地进行扩展,而不会影响到整个系统。
独立性: 每个微服务都是独立的,它们之间没有紧密的耦合关系,因此可以独立部署、测试和维护。这样可以使得开发和部署更加灵活,同时也可以减少整个系统因为某个服务发生故障而导致整个系统宕机的风险。
技术多样性: 微服务框架可以使用不同的编程语言和技术栈来构建不同的服务,因此可以选择最适合服务的技术。这样可以让开发人员更加专注于服务的逻辑和功能,而不用担心技术栈的限制。
可维护性: 微服务框架允许系统的不同部分独立地进行开发、测试、部署和维护,因此可以更快地对系统进行修改和更新,而不会影响到整个系统。这样可以提高系统的可维护性和可靠性。
高度可组合性: 微服务框架允许将不同的服务组合起来,从而构建出一个复杂的系统。这些服务可以被任意组合,从而形成一个新的系统,这样可以大大提高系统的灵活性和可扩展性。

总之,微服务框架的优势在于其高度可伸缩性、独立性、技术多样性、可维护性和高度可组合性,这些特点可以让开发人员更加专注于服务的逻辑和功能,从而提高开发效率和系统的可靠性。

11. 为什么用idea

使用IDEA的好处有很多:

提高开发效率:IDEA提供了很多智能化的代码编写、自动补全、代码重构、调试等功能,可以大大提高开发效率。
更好的代码质量:IDEA支持代码检查、重构、优化等功能,有助于提高代码质量和可维护性。
丰富的插件支持:IDEA支持众多插件,可以扩展IDE的功能,满足不同开发需求。
兼容性好:IDEA对各种开发技术栈提供了支持,包括Java、Android、Web、数据库、Spring等,可以满足不同的开发需求。
跨平台:IDEA可以运行在Windows、Linux、Mac等多个操作系统上,可以满足不同开发者的需求。
综上所述,使用IDEA可以提高开发效率、提高代码质量、扩展IDE功能、支持各种开发技术栈、跨平台等。

12. java中字符串的截取和分隔

Java中字符串的截取和分隔可以通过以下方法实现:

(1)、字符串截取 Java中字符串截取可以使用substring()方法,该方法有两个重载方法:

substring(int beginIndex): 从指定位置开始截取到字符串结尾。

substring(int beginIndex, int endIndex): 从指定位置开始截取到指定位置结束。

例如,可以使用以下代码从字符串中截取一部分:

String str = "Hello World";String substr1 = str.substring(6); // 截取从第7个字符开始到结尾String substr2 = str.substring(0, 5); // 截取从第1个字符开始到第6个字符

(2)、字符串分隔 Java中字符串分隔可以使用split()方法,该方法将字符串按照指定的分隔符进行分割,并返回一个字符串数组。

例如,可以使用以下代码从字符串中分隔出多个子字符串:

String str = "Hello,World,Java";String[] substrs = str.split(","); // 使用逗号分隔字符串

以上就是Java中字符串的截取和分隔的实现方法。

13. 微服务架构与单体架构的优缺点

微服务架构和单体架构都是常见的软件架构模式,它们各自有自己的优缺点。

单体架构的优点包括:

易于开发和维护:单体应用程序通常比较简单,因此易于开发和维护。

易于部署:单体应用程序可以打包为一个独立的应用程序,易于部署和运维。

性能好:单体应用程序通常比较简单,因此具有较好的性能。

单体架构的缺点包括:

可扩展性差: 单体应用程序通常难以水平扩展,因此很难处理高流量或大规模用户的应用程序。

技术栈受限: 单体应用程序通常使用同一种技术栈,难以使用其他技术栈的优点。

难以调试: 当应用程序出现故障时,由于单体应用程序较大,因此很难确定故障出现的位置。

微服务架构的优点包括:

可扩展性好: 微服务可以水平扩展,因此能够处理高流量或大规模用户的应用程序。

技术栈灵活: 不同的微服务可以使用不同的技术栈,因此能够使用更加适合的技术栈来实现不同的功能。

容错性好: 由于微服务是分布式的,因此可以设计容错机制来保证系统的可用性。
微服务架构的缺点包括:

开发和维护成本高: 微服务的数量较多,因此开发和维护的成本较高。

部署和运维复杂: 由于微服务是分布式的,因此部署和运维的成本较高。

性能问题: 由于微服务需要通过网络进行通信,因此会带来一定的性能问题。

14. 微服务架构与单体架构的区别

微服务架构和单体架构是两种不同的软件架构方式。

单体架构是一种传统的软件架构,它将所有的功能模块打包到一个独立的应用程序中。在单体架构中,所有的代码、业务逻辑、数据库模型等都在同一个应用中。单体架构的优点是开发速度快、易于部署和维护,但当应用程序变得越来越复杂时,会变得难以维护和扩展。

相比之下,微服务架构是一种更加灵活和可扩展的架构方式。它将应用程序拆分为多个服务,每个服务都可以独立部署、扩展和维护。每个服务都是一个小型的、独立的应用程序,可以使用不同的编程语言、技术栈和数据库。微服务架构的优点是易于扩展、灵活、可靠性高,缺点是开发和部署的复杂性较高。

在微服务架构中,服务之间通常采用RESTful API进行通信。每个服务都可以独立地扩展和部署,因此可以更好地适应快速变化的业务需求。但是,与单体架构相比,微服务架构的复杂性也更高,需要更多的人力和资源进行开发和维护。

15. jquery基本选择和层次选择器

jQuery是一个流行的JavaScript库,它提供了一些方便的方法来选择和操作HTML元素。以下是jQuery中常用的选择器类型:

基本选择器

ID选择器: 使用#符号选取指定ID的元素,例如 $(“#my-id”)。
类选择器: 使用.符号选取指定类名的元素,例如 $(“.my-class”)。
元素选择器: 选取指定标签名称的元素,例如 $(“p”)选取所有

元素。

层次选择器

后代选择器: 选取指定父元素下的所有子孙元素,例如 $(“#my-parent p”)选取所有

元素,它们是#my-parent元素的后代元素。

子元素选择器: 选取指定父元素下的直接子元素,例如 $(“#my-parent > p”)选取#my-parent元素下的所有

直接子元素。

相邻兄弟选择器: 选取紧接在指定元素后面的同级元素,例如 $(“#my-element + p”)选取紧接在#my-element元素后面的

元素。

通用兄弟选择器: 选取指定元素后面的所有同级元素,例如 $(“#my-element ~ p”)选取#my-element元素后面的所有

元素。

除了以上常用的选择器类型,jQuery还提供了一些其他选择器类型,如属性选择器、内容过滤选择器等,可以根据实际需求灵活使用。

16. ribbon和feign区别

Ribbon和Feign都是Netflix公司开发的Java库,用于实现分布式系统中的客户端负载均衡和服务调用。两者的区别如下:

功能不同: Ribbon主要提供了客户端负载均衡的功能,可以在多个服务提供者之间分发请求。Feign则是在Ribbon的基础上提供了一个更高级的抽象层,简化了服务间的调用方式,使得调用方式更加像本地方法调用。

使用方式不同: Ribbon需要手动编写代码来实现负载均衡的功能,需要实现负载均衡器和服务列表的管理。而Feign则是基于注解和接口定义的方式,可以自动根据接口定义生成客户端代码,并且已经集成了Ribbon的负载均衡功能,使用起来更加方便。

可扩展性不同: Ribbon提供了丰富的可定制化选项,可以根据实际情况自定义负载均衡策略、重试机制等。而Feign则相对简单,提供了较少的可扩展性选项,如果需要更高级的功能,则需要自己编写代码实现。

综上所述,Ribbon适合对负载均衡和服务调用有更深入理解的开发者,可以自己编写代码实现需要的功能。而Feign则更加适合快速开发和初学者,可以使用注解和接口定义的方式来简化服务间的调用方式。

17. ribbon和feign区别

Ribbon和Feign都是Netflix公司开发的Java库,用于实现分布式系统中的客户端负载均衡和服务调用。两者的区别如下:

功能不同: Ribbon主要提供了客户端负载均衡的功能,可以在多个服务提供者之间分发请求。Feign则是在Ribbon的基础上提供了一个更高级的抽象层,简化了服务间的调用方式,使得调用方式更加像本地方法调用。
使用方式不同: Ribbon需要手动编写代码来实现负载均衡的功能,需要实现负载均衡器和服务列表的管理。而Feign则是基于注解和接口定义的方式,可以自动根据接口定义生成客户端代码,并且已经集成了Ribbon的负载均衡功能,使用起来更加方便。
可扩展性不同: Ribbon提供了丰富的可定制化选项,可以根据实际情况自定义负载均衡策略、重试机制等。而Feign则相对简单,提供了较少的可扩展性选项,如果需要更高级的功能,则需要自己编写代码实现。
综上所述,Ribbon适合对负载均衡和服务调用有更深入理解的开发者,可以自己编写代码实现需要的功能。而Feign则更加适合快速开发和初学者,可以使用注解和接口定义的方式来简化服务间的调用方式。

18. socket错误是什么意思

Socket 错误指的是在使用 Socket 进行网络通信时,由于各种原因而导致的错误。Socket 是一种网络编程接口,它允许应用程序通过 TCP/IP 协议或 UDP 协议进行网络通信。在进行网络通信时,可能会出现各种各样的错误,例如连接超时、连接被重置、无法连接等等,这些错误都被称为 Socket 错误。

错误原因

Socket 错误通常会由操作系统或网络设备等方面引起,可能包括以下一些原因:

连接超时: 在建立连接时,等待对方响应的时间超过了指定的时间,导致连接失败。
*连接被重置: 连接成功建立后,由于网络设备或对方主机等原因,连接被异常关闭,导致连接失败。
网络不可达: 在进行网络通信时,发现网络不可达,无法进行通信。
连接被拒绝: 对方主机拒绝连接请求,导致连接失败。
地址已在使用中: 在进行网络通信时,要求使用的地址已经被其他应用程序占用,导致连接失败。

当出现 Socket 错误时,通常需要根据具体的错误信息进行调试和处理,例如修改网络配置、增加连接超时时间、检查网络连接等等。正确地处理 Socket 错误可以有效提高网络通信的稳定性和可靠性。

19. 什么是函数式编程

函数式编程(Functional Programming)是一种编程范式,是基于数学中的λ演算理论发展而来的,它的主要思想是把计算机程序看作是一系列数学函数的组合。函数式编程主张用函数(映射关系)来描述运算过程,强调结果而非过程,不依赖、也尽量不改变外界状态,从而避免了多线程共享变量的问题。与命令式编程(Imperative Programming)相比,函数式编程更加关注数据的映射和转换,而不是通过修改状态来实现控制流程。

函数式编程具有以下特点:

高阶函数: 函数可以作为参数传递给其他函数,也可以作为其他函数的返回值。
纯函数: 相同的输入总是得到相同的输出,函数不改变外部状态,也不依赖外部状态,不产生副作用。
不可变性: 函数不能改变传入的参数和全局变量,只能通过返回新的值来达到更新状态的目的。
延迟计算: 只有在需要的时候才进行计算,这样可以避免不必要的计算。
引用透明性:对于相同的输入,函数总是返回相同的输出,所以可以用其返回值替换函数调用。
函数式编程在大数据、云计算、并发编程等方面都具有重要应用。例如,Hadoop的MapReduce框架就是使用函数式编程的思想来实现数据处理。在Java语言中,Java 8加入了Lambda表达式和Stream API,使得Java也能够进行函数式编程。

20.什么是单体应用?如何理解

单体应用(Monolithic application)是指一个应用程序以一体化的形式部署和运行在一个独立的进程中,通常包含一个完整的应用程序栈(application stack),包括用户界面、应用逻辑、数据存储和处理等组件。单体应用是传统的应用开发和部署方式,通常使用一个大型的代码库,所有功能都在同一个代码库中实现,整个应用程序由一个运行时进程执行,数据库和其他资源都是共享的。

理解单体应用可以类比成一个传统的大型商场,所有商品都在一个建筑物里面,商场有一个总控制中心来管理各个部门的运营,不同的部门通过共享资源来协同工作。同样地,单体应用也是一个大型的应用程序,所有功能都在同一个代码库中实现,由一个运行时进程来执行,不同的模块通过共享资源来协同工作。

尽管单体应用具有部署简单、开发效率高等优点,但也存在一些局限性,如扩展性差、可靠性差、灵活性差等。随着业务增长和应用规模扩大,单体应用的弊端逐渐显露出来,因此,现在越来越多的应用采用了微服务等分布式架构来解决这些问题。

21. 什么是事件对象?事件对象的使用

事件对象是在事件被触发时自动创建的对象,它包含了与事件相关的信息,比如事件的类型、触发的元素、鼠标点击的坐标等等。在JavaScript中,事件对象是由浏览器自动创建并传递给事件处理函数的,开发人员可以通过访问事件对象来获取有关事件的详细信息,以便根据需要采取适当的行动。

事件对象通常被用来执行以下操作:

1、取消事件的默认行为
2、阻止事件的冒泡或捕获
3、获取与事件相关的数据

在事件处理函数中,可以通过 event 或 e 参数来引用事件对象,比如:

function handleClick(event) {console.log(event.type); // 打印事件类型console.log(event.target); // 打印触发事件的元素event.preventDefault(); // 取消事件的默认行为event.stopPropagation(); // 阻止事件的冒泡或捕获}

在这个例子中,handleClick 函数接收一个 event 参数,用于访问事件对象中的属性和方法。其中 event.type 和 event.target 分别获取事件的类型和触发事件的元素,event.preventDefault() 和 event.stopPropagation() 分别用于取消事件的默认行为和阻止事件的冒泡或捕获。

22. 十大经典排序算法

以下是十大经典排序算法:

冒泡排序(Bubble Sort): 比较相邻两个元素,如果逆序则交换,重复多轮,直到无逆序情况。

选择排序(Selection Sort): 在待排序元素中选择最小(大)元素,放在已排序序列的起始位置,重复多轮,直到所有元素有序。

插入排序(Insertion Sort): 从第二个元素开始,将每个元素插入到已排序序列中的合适位置,重复多轮,直到所有元素有序。

希尔排序(Shell Sort): 将待排序序列分割成若干子序列,分别进行插入排序,重复多轮,直到所有元素有序。

归并排序(Merge Sort): 将待排序序列分成若干子序列,对每个子序列进行归并排序,将有序的子序列合并成一个有序序列,重复多轮,直到所有元素有序。

快速排序(Quick Sort): 从序列中选择一个枢轴元素,将序列分成两部分,小于等于枢轴元素的放在左边,大于枢轴元素的放在右边,对左右两部分分别递归进行快排,重复多轮,直到所有元素有序。

堆排序(Heap Sort): 将待排序序列构造成一个大根堆,将堆顶元素(最大值)与末尾元素交换,重复多轮,直到所有元素有序。

计数排序(Counting Sort): 根据待排序序列中每个元素出现的次数,计算小于等于每个元素的元素个数,从后往前遍历待排序序列,将每个元素放在相应位置,重复一轮,直到所有元素有序。

桶排序(Bucket Sort): 将待排序序列分到有限数量的桶中,每个桶单独排序,最后将所有桶的元素按照顺序合并成一个序列,重复多轮,直到所有元素有序。

基数排序(Radix Sort): 将待排序元素按位数切割成不同的数字,然后按每个位数分别进行排序,重复多轮,直到所有元素有序。

以上排序算法各有优缺点,不同场景下应选择不同的算法来实现排序。

23、单点登录和多点登录区别

单点登录(Single Sign-On,简称 SSO)是指用户只需要在一次登录操作后,就可以访问多个系统或应用程序,无需再次输入用户名和密码。在单点登录系统中,用户只需在任意一个系统中登录,然后可以无缝地访问其他系统,这样可以方便用户,提高用户体验,同时也可以减少用户的密码管理和系统的开发和维护成本。

相对的,多点登录(Multiple Sign-On)则是指用户需要在每个系统或应用程序中单独登录,每个系统都需要验证用户的身份和权限,用户需要输入相应的用户名和密码。这种方式需要用户多次登录,增加了用户的负担和系统的维护成本。

单点登录系统通过使用统一的身份认证和授权机制,可以解决多点登录系统中的问题,提供了更方便、更安全、更高效的访问方式,用户只需要一次认证就可以在多个系统中访问,避免了在每个系统中重复认证的过程,同时也提高了系统的可维护性和安全性。

24、Java随机数怎么用

在Java中,可以通过使用java.util.Random类来生成随机数。该类提供了许多方法来生成不同类型的随机数。

下面是一个生成整数类型随机数的例子:

import java.util.Random;public class RandomNumberGenerator {public static void main(String[] args) {Random random = new Random();int randomNumber = random.nextInt(100); // 生成0到99的随机整数System.out.println(randomNumber);}}

在上面的例子中,我们首先创建了一个java.util.Random类的实例。然后,我们调用nextInt()方法来生成一个0到99之间的随机整数,并将其存储在randomNumber变量中。最后,我们打印出生成的随机数。

除了nextInt()方法,Random类还提供了许多其他方法来生成不同类型的随机数,例如nextDouble()用于生成double类型的随机数,nextBoolean()用于生成布尔类型的随机数等等。

25、session和cookie的区别

Session和Cookie是两种在Web应用中用于跟踪用户状态的技术,它们之间有以下几点不同:

存储位置: Cookie保存在客户端浏览器中,Session保存在服务器端。
数据安全: 由于Cookie保存在客户端,因此Cookie的数据可以被客户端浏览器篡改、伪造或窃取,因此保存在Cookie中的数据不是很安全。而Session保存在服务器端,客户端无法直接访问Session中的数据,因此比Cookie更加安全。

存储容量: Cookie保存在浏览器中,因此Cookie的大小受到浏览器的限制,一般为4KB左右。而Session保存在服务器端,因此可以存储的数据量比Cookie要大。

存储时效性: Cookie可以设置过期时间,过期后浏览器会自动删除Cookie,因此Cookie可以保存较长时间。而Session一般默认的超时时间为30分钟,超过该时间后,服务器会自动删除Session。

使用场景: Cookie适合保存一些需要跨页面传递的数据,比如用户的登录信息、购物车信息等。而Session一般用于保存用户的会话信息,比如用户的登录状态、权限信息等。
需要注意的是,Session和Cookie并不是互斥的,有些情况下它们可以结合使用。比如可以将Session的Session ID保存在Cookie中,以便于在用户多次访问时能够恢复用户的会话状态。

25、a==b”和”a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

26、List、Set、Map 和 Queue 之间的区别

List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。

27、.poll() 方法和 remove() 方法的区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

28、Java和C++的区别” />29、重载和重写的区别?

重载: 发生在同一个类中,方法名必须相同,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准),返回值类型、访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,是父类与子类之间的多态性,实质是对父类的函数进行重新定义。返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

Java 构造方法能否被重写和重载?

重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能被重写的。而重载是针对同一个的,所以构造方法可以被重载。

30、Java 面向对象编程三大特征

封装 继承 多态

封装: 封装就是把抽象的数据和对数据进行的操作封装在一起,数据被保存在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。

Java提供了四种控制修饰符控制方法和变量访问的权限:

public:对外公开protected:对子类和同一包中的类公开没有修饰符号:向同一个包的类公开private:只有类本身可以访问,不对外公开

继承:(extends ) :继承是使用已存在的类的定义作为基础建立新类的技术。继承可以解决代码复用问题,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extend语句来声明继承父类。

关于继承如下 3 点请记住:

1、子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3、子类可以用自己的方式实现父类的方法。

多态: :所谓多态,就是指一个引用(类型)在不同情况下的多种状态,你也可以这样理解:父类型的引用指向子类型的对象。

多态有两个好处:

  1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
  2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

关于三大特征的详细讲解,请看这篇文章:Java面向对象的三大特征,干货详解