关于java:Java程序员必修内功心法内功修炼第一层

10次阅读

共计 10292 个字符,预计需要花费 26 分钟才能阅读完成。

  1. Java 基本功

1.1. Java 入门(根底概念与常识)

1.1.1. Java 语言有哪些特点?

简略易学;

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

平台无关性(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 步:

咱们须要分外留神的是 .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 节

1.2.2. 对于正文?

Java 中的正文有三种:

1,单行正文

2,多行正文

3,文档正文。

在咱们编写代码的时候,如果代码量比拟少,咱们本人或者团队其余成员还能够很轻易地看懂代码,然而当我的项目构造一旦简单起来,咱们就须要用到正文了。正文并不会执行(编译器在编译代码之前会把代码中的所有正文抹掉, 字节码中不保留正文),是咱们程序员写给本人看的,正文是你的代码说明书,可能帮忙看代码的人疾速天文清代码之间的逻辑关系。因而,在写程序的时候顺手加上正文是一个十分好的习惯。

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

代码的正文不是越具体越好。实际上好的代码自身就是正文,咱们要尽量标准和丑化本人的代码来缩小不必要的正文。

若编程语言足够有表达力,就不须要正文,尽量通过代码来论述。

举个例子:

去掉上面简单的正文,只须要创立一个与正文所言同一事物的函数即可

应替换为

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

在咱们编写程序的时候,须要大量地为程序、类、变量、办法等取名字,于是就有了标识符,简略来说,标识符就是一个名字。然而有一些标识符,Java 语言曾经赋予了其非凡的含意,只能用于特定的中央,这种非凡的标识符就是关键字。因而,关键字是被赋予非凡含意的标识符。比方,在咱们的日常生活中,“警察局”这个名字曾经被赋予了非凡的含意,所以如果你开一家店,店的名字不能叫“警察局”,“警察局”就是咱们日常生活中的关键字。

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


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 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除。

泛型个别有三种应用形式: 泛型类、泛型接口、泛型办法。

1. 泛型类:


如何实例化泛型类:

2. 泛型接口:

实现泛型接口,不指定类型:

实现泛型接口,指定类型:

3. 泛型办法:

应用:

罕用的通配符为: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()办法:

equals() 办法存在两种应用状况:

状况 1:类没有笼罩 equals()办法。则通过 equals()比拟该类的两个对象时,等价于通过“==”比拟这两个对象。应用的默认是 Object 类 equals()办法。

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

举个例子:

阐明:

1,String 中的 equals 办法是被重写过的,因为 Object 的 equals 办法是比拟的对象的内存地址,而 String 的 equals 办法比拟的是对象的值。

2,当创立 String 类型的对象时,虚构机会在常量池中查找有没有曾经存在的值和要创立的值雷同的对象,如果有就把它赋给以后援用。如果没有就在常量池中从新创立一个 String 对象。

String 类 equals()办法:

1.2.9. hashCode()与 equals()

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

1)hashCode()介绍:

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引地位。hashCode() 定义在 JDK 的 Object 类中,这就意味着 Java 中的任何类都蕴含有 hashCode() 函数。另外须要留神的是:Object 的 hashcode 办法是本地办法,也就是用 c 语言或 c++ 实现的,该办法通常用来将对象的 内存地址 转换为整数之后返回。

散列表存储的是键值对(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

对于 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)性能和资源之间的衡量。


两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

Integer 缓存源代码:

利用场景:

1,Integer i1=40;Java 在编译的时候会间接将代码封装成 Integer i1=Integer.valueOf(40);,从而应用常量池中的对象。
2,Integer i1 = new Integer(40); 这种状况下会创立新的对象。

Integer 比拟更丰盛的一个例子:

后果:

解释:

语句 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

后果:

解析:

在 swap 办法中,a、b 的值进行替换,并不会影响到 num1、num2。因为,a、b 中的值,只是从 num1、num2 的复制过去的。也就是说,a、b 相当于 num1、num2 的正本,正本的内容无论怎么批改,都不会影响到原件自身。

通过下面例子,咱们曾经晓得了一个办法不能批改一个根本数据类型的参数,而对象援用作为参数就不一样,请看 example2.

example 2


后果:

解析:

array 被初始化 arr 的拷贝也就是一个对象的援用,也就是说 array 和 arr 指向的是同一个数组对象。因而,内部对援用对象的扭转会反映到所对应的对象上。

通过 example2 咱们曾经看到,实现一个扭转对象参数状态的办法并不是一件难事。理由很简略,办法失去的是对象援用的拷贝,对象援用及其他的拷贝同时援用同一个对象。

很多程序设计语言(特地是,C++ 和 Pascal)提供了两种参数传递的形式:值调用和援用调用。有些程序员(甚至本书的作者)认为 Java 程序设计语言对对象采纳的是援用调用,实际上,这种了解是不对的。因为这种误会具备肯定的普遍性,所以上面给出一个反例来具体地论述一下这个问题。

example 3


后果:

解析:

替换之前:

替换之后:

通过下面两张图能够很清晰的看出:办法并没有扭转存储在变量 s1 和 s2 中的对象援用。swap 办法的参数 x 和 y 被初始化为两个对象援用的拷贝,这个办法替换的是这两个拷贝

总结

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

上面再总结一下 Java 中办法参数的应用状况:

一个办法不能批改一个根本数据类型的参数(即数值型或布尔型)。
一个办法能够扭转一个对象参数的状态。
一个办法不能让对象参数援用一个新的对象。

参考:

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

重载就是同样的一个办法可能依据输出数据的不同,做出不同的解决

重写就是当子类继承自父类的雷同办法,输出数据一样,但要做出有别于父类的响应时,你就要笼罩父类办法

重载:

产生在同一个类中,办法名必须雷同,参数类型不同、个数不同、程序不同,办法返回值和拜访修饰符能够不同。

上面是《Java 核心技术》对重载这个概念的介绍:

综上:重载就是同一个类中多个同名办法依据不同的传参来执行不同的逻辑解决。

重写:

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

1,返回值类型、办法名、参数列表必须雷同,抛出的异样范畴小于等于父类,拜访修饰符范畴大于等于父类。
2,如果父类办法拜访修饰符为 private/final/static 则子类就不能重写该办法,然而被 static 润饰的办法可能被再次申明。
3,构造方法无奈被重写

综上:重写就是子类对父类办法的从新革新,内部样子不能扭转,外部逻辑能够扭转

办法的重写要遵循“两同两小一大”(以下内容摘录自《疯狂 Java 讲义》):

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

1.4.4. 深拷贝 vs 浅拷贝

1,浅拷贝:对根本数据类型进行值传递,对援用数据类型进行援用传递般的拷贝,此为浅拷贝。
2,深拷贝:对根本数据类型进行值传递,对援用数据类型,创立一个新的对象,并复制其内容,此为深拷贝。

1.4.5. 办法的四种类型

1、无参数无返回值的办法

2、有参数无返回值的办法

3、有返回值无参数的办法

4、有返回值有参数的办法

5、return 在无返回值办法的非凡应用

扫码加群:

跟着我学习 Java 内功心法大全,为你提供优质的学习资源,为你答疑解惑,小白变巨匠,成为你技术路线上的导师。

正文完
 0