Java程序员必修内功心法!(内功修炼第一层)

  1. Java 基本功

1.1. Java 入门(基础概念与常识)

1.1.1. Java 语言有哪些特色?

简单易学;java

面向对象(封装,继承,多态);c++

平台无关性( Java 虚拟机实现平台无关性);程序员

可靠性;面试

安全性;算法

支持多线程( C++ 语言没有内置的多线程机制,所以必须调用操做系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);编程

支持网络编程而且很方便( Java 语言诞生自己就是为简化网络编程设计的,所以 Java 语言不只支持网络编程并且很方便);
编译与解释并存;小程序

1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答

1.1.2.1. JVM数组

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不一样系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。缓存

什么是字节码?采用字节码的好处是什么?安全

在 Java 中,JVM 能够理解的代码就叫作字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言经过字节码的方式,在必定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特色。因此 Java 程序运行时比较高效,并且,因为字节码并不针对一种特定的机器,所以,Java 程序无须从新编译即可在多种不一样操做系统的计算机上运行。

Java 程序从源代码到运行通常有下面 3 步:
image.png
咱们须要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,而后经过解释器逐行解释执行,这种方式的执行速度会相对比较慢。并且,有些方法和代码块是常常须要被调用的(也就是所谓的热点代码),因此后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次能够直接使用。而咱们知道,机器码的运行效率确定是高于 Java 解释器的。这也解释了咱们为何常常会说 Java 是编译与解释共存的语言。

HotSpot 采用了惰性评估(Lazy
Evaluation)的作法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT
所须要编译的部分。JVM 会根据代码每次被执行的状况收集信息并相应地作出一些优化,所以执行的次数越多,它的速度就越快。JDK 9
引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT
预热等各方面的开销。JDK 支持分层编译和 AOT 协做使用。可是 ,AOT 编译器的编译质量是确定比不上 JIT 编译器的。

总结:

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不一样系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不一样系统的 JVM 实现是 Java 语言“一次编译,随处能够运行”的关键所在。

1.1.2.2. JDK 和 JRE

JDK 是 Java Development Kit 缩写,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它可以建立和编译程序。

JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的全部内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其余的一些基础构件。可是,它不能用于建立新程序。

若是你只是为了运行一下 Java 程序的话,那么你只须要安装 JRE 就能够了。若是你须要进行一些 Java 编程方面的工做,那么你就须要安装 JDK 了。可是,这不是绝对的。有时,即便您不打算在计算机上进行任何 Java 开发,仍然须要安装 JDK。例如,若是要使用 JSP 部署 Web 应用程序,那么从技术上讲,您只是在应用程序服务器中运行 Java 程序。那你为何须要 JDK 呢?由于应用程序服务器会将 JSP 转换为 Java servlet,而且须要使用 JDK 来编译 servlet。

1.1.3. Oracle JDK 和 OpenJDK 的对比

可能在看这个问题以前不少人和我同样并无接触和使用过 OpenJDK 。那么 Oracle 和 OpenJDK 之间是否存在重大差别?下面我经过收集到的一些资料,为你解答这个被不少人忽视的问题。

对于 Java 7,没什么关键的地方。OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。此外,OpenJDK 被选为 Java 7 的参考实现,由 Oracle 工程师维护。关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle 博客帖子在 2012 年有一个更详细的答案:

问:OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?

答:很是接近 - 咱们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,例如部署代码,其中包括
Oracle 的 Java 插件和 Java WebStart
的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如
Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望将来,咱们的目的是开源 Oracle JDK
的全部部分,除了咱们考虑商业功能的部分。

总结:

1,Oracle JDK 大概每 6 个月发一次主要版本,而 OpenJDK 版本大概每三个月发布一次。但这不是固定的,我以为了解这个没啥用处。

2,OpenJDK 是一个参考模型而且是彻底开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并非彻底开源的;

3,Oracle JDK 比 OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复。所以,若是您想开发企业/商业软件,我建议您选择 Oracle JDK,由于它通过了完全的测试和稳定。某些状况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,可是,只需切换到 Oracle JDK 就能够解决问题;

4,在响应性和 JVM 性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能;

5,Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须经过更新到最新版本得到支持来获取最新版本;

6,Oracle JDK 根据二进制代码许可协议得到许可,而 OpenJDK 根据 GPL v2 许可得到许可。

1.1.4. Java 和 C++的区别?

我知道不少人没学过 C++,可是面试官就是没事喜欢拿我们 Java 和 C++ 比呀!没办法!!!就算没学过 C++,也要记下来!

1,都是面向对象的语言,都支持封装、继承和多态

2,Java 不提供指针来直接访问内存,程序内存更加安全

3,Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不能够多继承,可是接口能够多继承。

4,Java 有自动内存管理垃圾回收机制(GC),不须要程序员手动释放无用内存

5,在 C 语言中,字符串或字符数组最后都会有一个额外的字符’0’来表示结束。可是,Java 语言中没有结束符这一律念。 这是一个值得深度思考的问题。

1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不一样?

一个程序中能够有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main() 方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不必定要求是 public 类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。

1.1.6. import java 和 javax 有什么区别?

刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来使用。然而随着时间的推移,javax 逐渐地扩展成为 Java API 的组成部分。可是,将扩展从 javax 包移动到 java 包确实太麻烦了,最终会破坏一堆现有的代码。所以,最终决定 javax 包将成为标准 API 的一部分。

因此,实际上 java 和 javax 没有区别。这都是一个名字。

1.1.7. 为何说 Java 语言“编译与解释并存”?

高级编程语言按照程序的执行方式分为编译型和解释型两种。简单来讲,编译型语言是指编译器针对特定的操做系统将源代码一次性翻译成可被该平台执行的机器码;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并当即执行。好比,你想阅读一本英文名著,你能够找一个英文翻译人员帮助你阅读, 有两种选择方式,你能够先等翻译人员将全本的英文名著(也就是源码)都翻译成汉语,再去阅读,也可让翻译人员翻译一段,你在旁边阅读一段,慢慢把书读完。

Java 语言既具备编译型语言的特征,也具备解释型语言的特征,由于 Java 程序要通过先编译,后解释两个步骤,由 Java 编写的程序须要先通过编译步骤,生成字节码(*.class 文件),这种字节码必须由 Java 解释器来解释执行。所以,咱们能够认为 Java 语言编译与解释并存。

1.2. Java 语法

1.2.1. 字符型常量和字符串常量的区别?

1,形式上: 字符常量是单引号引发的一个字符; 字符串常量是双引号引发的0个或若干个字符
2,含义上: 字符常量至关于一个整型值( ASCII 值),能够参加表达式运算; 字符串常量表明一个地址值(该字符串在内存中存放位置)
3,占内存大小 字符常量只占 2 个字节; 字符串常量占若干个字节 (注意: char 在 J3,ava 中占两个字节),

字符封装类 Character 有一个成员常量 Character.SIZE
值为16,单位是bits,该值除以8(1byte=8bits)后就能够获得2个字节

java 编程思想第四版:2.2.2 节
image.png
1.2.2. 关于注释?

Java 中的注释有三种:

1,单行注释

2,多行注释

3,文档注释。

在咱们编写代码的时候,若是代码量比较少,咱们本身或者团队其余成员还能够很轻易地看懂代码,可是当项目结构一旦复杂起来,咱们就须要用到注释了。注释并不会执行(编译器在编译代码以前会把代码中的全部注释抹掉,字节码中不保留注释),是咱们程序员写给本身看的,注释是你的代码说明书,可以帮助看代码的人快速地理清代码之间的逻辑关系。所以,在写程序的时候随手加上注释是一个很是好的习惯。

《Clean Code》这本书明确指出:

代码的注释不是越详细越好。实际上好的代码自己就是注释,咱们要尽可能规范和美化本身的代码来减小没必要要的注释。

若编程语言足够有表达力,就不须要注释,尽可能经过代码来阐述。

举个例子:

去掉下面复杂的注释,只须要建立一个与注释所言同一事物的函数便可
image.png

应替换为
image.png

1.2.3. 标识符和关键字的区别是什么?

在咱们编写程序的时候,须要大量地为程序、类、变量、方法等取名字,因而就有了标识符,简单来讲,标识符就是一个名字。可是有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这种特殊的标识符就是关键字。所以,关键字是被赋予特殊含义的标识符。好比,在咱们的平常生活中 ,“警察局”这个名字已经被赋予了特殊的含义,因此若是你开一家店,店的名字不能叫“警察局”,“警察局”就是咱们平常生活中的关键字。

1.2.4. Java中有哪些常见的关键字?

image.png
1.2.5. 自增自减运算符

在写代码的过程当中,常见的一种状况是须要某个整数类型变量增长 1 或减小 1,Java 提供了一种特殊的运算符,用于这种表达式,叫作自增运算符(++)和自减运算符(–)。

++和–运算符能够放在变量以前,也能够放在变量以后,当运算符放在变量以前时(前缀),先自增/减,再赋值;当运算符放在变量以后时(后缀),先赋值,再自增/减。例如,当 b = ++a 时,先自增(本身增长 1),再赋值(赋值给 b);当 b = a++ 时,先赋值(赋值给 b),再自增(本身增长 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。用一句口诀就是:“符号在前就先加/减,符号在后就后加/减”。

1.2.6. continue、break、和return的区别是什么?

在循环结构中,当循环条件不知足或者循环次数达到要求时,循环会正常结束。可是,有时候可能须要在循环的过程当中,当发生了某种条件以后 ,提早终止循环,这就须要用到下面几个关键词:

1,continue :指跳出当前的这一次循环,继续下一次循环。
2,break :指跳出整个循环体,继续执行循环下面的语句。

return 用于跳出所在方法,结束该方法的运行。return 通常有两种用法:

1,return; :直接使用 return 结束方法执行,用于没有返回值函数的方法
2,return value; :return 一个特定值,用于有返回值函数的方法

1.2.7. Java泛型了解么?什么是类型擦除?介绍一下经常使用的通配符?

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制容许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操做的数据类型被指定为一个参数。

Java的泛型是伪泛型,这是由于Java在编译期间,全部的泛型信息都会被擦掉,这也就是一般所说类型擦除 。
image.png

泛型通常有三种使用方式:泛型类、泛型接口、泛型方法。

1.泛型类:

image.png
如何实例化泛型类:
image.png
2.泛型接口 :
image.png
实现泛型接口,不指定类型:
image.png
实现泛型接口,指定类型:
image.png
3.泛型方法 :
image.png
使用:
image.png
经常使用的通配符为: T,E,K,V,?

1,? 表示不肯定的 java 类型
2,T (type) 表示具体的一个java类型
3,K V (key value) 分别表明java键值中的Key Value
4,E (element) 表明Element

更多关于Java 泛型中的通配符能够查看这篇文章:《聊一聊-JAVA 泛型中的通配符 T,E,K,V,?》

1.2.8. ==和equals的区别

== : 它的做用是判断两个对象的地址是否是相等。即判断两个对象是否是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址)

由于 Java 只有值传递,因此,对于 ==
来讲,无论是比较基本数据类型,仍是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。

equals() : 它的做用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量。equals()方法存在于Object类中,而Object类是全部类的直接或间接父类。

Object类equals()方法:
image.png
equals() 方法存在两种使用状况:

状况 1:类没有覆盖 equals()方法。则经过 equals()比较该类的两个对象时,等价于经过“==”比较这两个对象。使用的默认是 Object类equals()方法。

状况 2:类覆盖了 equals()方法。通常,咱们都覆盖 equals()方法来两个对象的内容相等;若它们的内容相等,则返回 true(即,认为这两个对象相等)。

举个例子:
image.png
说明:

1,String 中的 equals 方法是被重写过的,由于 Object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。

2,当建立 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要建立的值相同的对象,若是有就把它赋给当前引用。若是没有就在常量池中从新建立一个 String 对象。

String类equals()方法:
image.png
1.2.9. hashCode()与 equals()

面试官可能会问你:“你重写过 hashcode 和 equals 么,为何重写 equals 时必须重写 hashCode 方法?”

1)hashCode()介绍:

hashCode() 的做用是获取哈希码,也称为散列码;它其实是返回一个 int 整数。这个哈希码的做用是肯定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object 类中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。另外须要注意的是: Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法一般用来将对象的 内存地址 转换为整数以后返回。
image.png
散列表存储的是键值对(key-value),它的特色是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(能够快速找到所须要的对象)

2)为何要有 hashCode?

咱们以“HashSet 如何检查重复”为例子来讲明为何要有 hashCode?

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其余已经加入的对象的 hashcode 值做比较,若是没有相符的 hashcode,HashSet 会假设对象没有重复出现。可是若是发现有相同 hashcode 值的对象,这时会调用 equals() 方法来检查 hashcode 相等的对象是否真的相同。若是二者相同,HashSet 就不会让其加入操做成功。若是不一样的话,就会从新散列到其余位置。(摘自个人 Java 启蒙书《Head First Java》第二版)。这样咱们就大大减小了 equals 的次数,相应就大大提升了执行速度。

3)为何重写 equals 时必须重写 hashCode 方法?

若是两个对象相等,则 hashcode 必定也是相同的。两个对象相等,对两个对象分别调用 equals 方法都返回 true。可是,两个对象有相同的 hashcode 值,它们也不必定是相等的 。所以,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖。

hashCode()的默认行为是对堆上的对象产生独特值。若是没有重写 hashCode(),则该 class
的两个对象不管如何都不会相等(即便这两个对象指向相同的数据)

4)为何两个对象有相同的 hashcode 值,它们也不必定是相等的?

在这里解释一位小伙伴的问题。如下内容摘自《Head Fisrt Java》。

由于 hashCode() 所使用的杂凑算法也许恰好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不一样的对象获得相同的 hashCode。

咱们刚刚也提到了 HashSet,若是 HashSet 在对比的时候,一样的 hashcode 有多个对象,它会使用 equals() 来判断是否真的相同。也就是说 hashcode 只是用来缩小查找成本。

1.3. 基本数据类型

1.3.1. Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?
Java中有8种基本数据类型,分别为:

1,6种数字类型 :byte、short、int、long、float、double
2,1种字符类型:char
3,1种布尔型:boolean。

这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean
image.png
对于boolean,官方文档未明肯定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1位,可是实际中会考虑计算机高效存储因素。

注意:

1,Java 里使用 long 类型的数据必定要在数值后面加上 L,不然将做为整型解析:
2,char a = 'h’char :单引号,String a = “hello” :双引号

1.3.2. 自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;

1.3.3. 8种基本类型的包装类和常量池

Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认建立了数值[-128,127] 的相应类型的缓存数据,Character建立了数值在[0,127]范围的缓存数据,Boolean 直接返回True Or False。若是超出对应范围仍然会去建立新的对象。 为啥把缓存设置为[-128,127]区间?(参见issue/461)性能和资源之间的权衡。
image.png
image.png
两种浮点数类型的包装类 Float,Double 并无实现常量池技术。
image.png
Integer 缓存源代码:
image.png
应用场景:

1,Integer i1=40;Java 在编译的时候会直接将代码封装成 Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。
2,Integer i1 = new Integer(40);这种状况下会建立新的对象。
image.png
Integer 比较更丰富的一个例子:
image.png
结果:
image.png
解释:

语句 i4 == i5 + i6,由于+这个操做符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操做,进行数值相加,即 i4 == 40。而后 Integer 对象没法与数值进行直接比较,因此 i4 自动拆箱转为 int 值 40,最终这条语句转为 40 == 40 进行数值比较。

1.4. 方法(函数)

1.4.1. 什么是方法的返回值?返回值在类的方法里的做用是什么?

方法的返回值是指咱们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的做用是接收出结果,使得它能够用于其余的操做!

1.4.2. 为何 Java 中只有值传递?

首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法能够修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各类程序设计语言(不仅是 Java)中方法参数传递方式。

Java 程序设计语言老是采用按值调用。也就是说,方法获得的是全部参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

下面经过 3 个例子来给你们说明

example 1

image.png

结果:
image.png
解析:
image.png
在 swap 方法中,a、b 的值进行交换,并不会影响到 num一、num2。由于,a、b 中的值,只是从 num一、num2 的复制过来的。也就是说,a、b 至关于 num一、num2 的副本,副本的内容不管怎么修改,都不会影响到原件自己。

经过上面例子,咱们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用做为参数就不同,请看 example2.

example 2

image.png
结果:
image.png
解析:
image.png
array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的是同一个数组对象。 所以,外部对引用对象的改变会反映到所对应的对象上。

经过 example2 咱们已经看到,实现一个改变对象参数状态的方法并非一件难事。理由很简单,方法获得的是对象引用的拷贝,对象引用及其余的拷贝同时引用同一个对象。

不少程序设计语言(特别是,C++和 Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员(甚至本书的做者)认为 Java 程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。因为这种误解具备必定的广泛性,因此下面给出一个反例来详细地阐述一下这个问题。

example 3

image.png
结果:
image.png
解析:

交换以前:
image.png
交换以后:
image.png
经过上面两张图能够很清晰的看出: 方法并无改变存储在变量 s1 和 s2 中的对象引用。swap 方法的参数 x 和 y 被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝

总结

Java 程序设计语言对对象采用的不是引用调用,实际上,对象引用是按 值传递的。

下面再总结一下 Java 中方法参数的使用状况:

一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
一个方法能够改变一个对象参数的状态。
一个方法不能让对象参数引用一个新的对象。

参考:

《Java 核心技术卷 Ⅰ》基础知识第十版第四章 4.5 小节

重载就是一样的一个方法可以根据输入数据的不一样,作出不一样的处理

重写就是当子类继承自父类的相同方法,输入数据同样,但要作出有别于父类的响应时,你就要覆盖父类方法

重载:

发生在同一个类中,方法名必须相同,参数类型不一样、个数不一样、顺序不一样,方法返回值和访问修饰符能够不一样。

下面是《Java 核心技术》对重载这个概念的介绍:
image.png
综上:重载就是同一个类中多个同名方法根据不一样的传参来执行不一样的逻辑处理。

重写:

重写发生在运行期,是子类对父类的容许访问的方法的实现过程进行从新编写。

1,返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
2,若是父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,可是被 static 修饰的方法可以被再次声明。
3,构造方法没法被重写

综上:重写就是子类对父类方法的从新改造,外部样子不能改变,内部逻辑能够改变
image.png
方法的重写要遵循“两同两小一大”(如下内容摘录自《疯狂 Java 讲义》):

“两同”即方法名相同、形参列表相同;
“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。

1.4.4. 深拷贝 vs 浅拷贝

1,浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
2,深拷贝:对基本数据类型进行值传递,对引用数据类型,建立一个新的对象,并复制其内容,此为深拷贝。
image.png
1.4.5. 方法的四种类型

一、无参数无返回值的方法
image.png
二、有参数无返回值的方法
image.png
三、有返回值无参数的方法
image.png
四、有返回值有参数的方法
image.png
五、return 在无返回值方法的特殊使用
image.png
扫码加群:
image.png跟着我学习Java内功心法大全,为你提供优质的学习资源,为你答疑解惑,小白变大师,成为你技术道路上的导师。

相关文章
相关标签/搜索