重学Java 面向对象 之 封装

本篇文章更偏向于笔记,是阅读Java核心卷(一)以后的记录:java

1. 一个类可能的组成部分:git

1. 成员变量github

2. 成员函数函数

3. 构造函数工具

4. 代码块this

5. 静态变量,静态函数,静态代码块spa

 

2. 初始化成员变量的方法:翻译

1. 声明时直接赋值debug

2. 代码块赋值3d

3. 构造函数中赋值

三种初始化方式的顺序:

构造 > 声明或代码块

先声明仍是先代码块看他们在代码中的顺序

 

 

 

 

能够在new 的 地方打个断点,调试一下更清楚

最后输出 “ 构造函数赋值”。

把构造函数注掉就会输出 “代码块赋值”

把声明和代码块的顺序变一下就会输出“声明时赋值”

此处再也不演示。

 

3. 构造函数

关于构造函数须要注意的点是:

1. 只有当类没有提供任何构造器的时候,系统才会默认提供一个空参的构造函数

2. 能够在构造函数中利用this调用其余的构造函数

 

 当你已经写过构造函数以后,再调用Employee会报错。

this构造函数就没什么好说的了

 

4. 方法参数(Java 只有值传递)

Java方法中的参数传递都是值传递,没有引用传递,看起来像引用传递的对象传参也只是把引用复制了一份,而后指向了相同的对象。

举一个反例:

 

 最后输出e1.name 仍是雇员1。

若是真的是引用传递的话,e1 应该就指向了雇员2那个对象了。

因此咱们所认为的引用传递实际上也是值传递,只不过传递的是引用。既然指向了同一个对象,那么当对象的内容发生变化的时候,好比你把雇员的名字给改了,那么原来的对象天然也被修改了,这看上去

很想引用传递,但其实不是。

 

5. static

静态的成员变量和代码块都只会初始化一次。

static 成员变量: 就是全部对象共享的变量,static常与final合用变成静态常量,例如Math类,有至关多的数学常量在里面,例如PI

static 代码块: static代码块中固然就不能对成员变量进行初始化了,通常来讲就是对static成员变量进行处理的代码块。

 

 加载顺序:

强烈建议能够debug看一下,能够发现其实在执行static代码块的时候还并无id这个成员变量,这里猜想静态变量以及它的初始化是在类加载的时候就执行了

 

 因此说静态的东西加载都比非静态要早。

可是这里变量的声明和代码块的初始化的顺序是不能颠倒的:

 

6. 静态方法

静态方法的用途:我的理解就是不须要实例化就可以使用的方法,或者说不涉及到成员变量操做的方法,又或者说涉及到了,可是对于每个对象来讲须要对成员变量进行的操做是同样的。

例如在Math类中,它的方法基本上都是Math类的,由于Math根本就不让你初始化,它的方法都是涉及到一些数学公式的计算,对于全部想要使用这个方法的人来讲都是同样的,并不存在差别化

还有一些工具类中可能更常见:例如说Arrays中的asList方法。

静态工厂方法:

在一些类中,咱们会使用静态工厂方法来替代构造方法。在effective-Java 3rd 中 第一条建议就是这个(GitHub上一个自发的翻译项目,因此可能翻译质量没法保证):

effective - Java 3rd 在线版本

 这里面详述了不少条静态工厂替代构造方法的优势和缺点,大部分暂时还看不太懂,这里只简单小结两点(Java 核心卷上总结的两点):

1. 使用静态工厂方法相比构造函数更具备语义性,构造函数只能根据参数的不一样来产生不一样的对象,而若是有一个名字的话,会清晰许多,例如LocalDate.now()  LocalDate.of()

2. 使用构造函数就只能返回本类型,可是使用静态工厂,返回的类型没有限制了,因此咱们能够返回其子类,例如:

NumberFormat currencyInstance =  NumberFormat.getCurrencyInstance();
相关文章
相关标签/搜索