最近打算跟着极客时间的《核心技术36讲》撸一下代码,结果发现高估了自己,好像是不会写Java代码捏。看《Thinking in Java》乖乖来做个基础笔记。喵~
对象导论
这一章每次都会看,这次看发现原文写的超好,翻译也超棒~
哼哧做了个图,怎么做都觉得不好,凑合给自己看
这一部分主要是把面向对象的思路怎么来,以及面向对象有什么娓娓道来,捡看着特别有道理的话简单列一下:
- 所有编程语言都是提供抽象机制,人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。
- 面向对象提供的是表示问题空间中的元素的工具,这样程序可以通过添加新的类型的对象使自身适用于某个特定的问题。
- 将对象看作“服务提供者”有助于将问题分解成对象的集合,还可以提高对象的内聚性。
- 在任何相互关系中,具有关系所设计的各方都遵守的边界是十分重要的事情。访问控制让类的使用者更容易看到什么是重要的东西。
- 代码复用是面向对象程序设计语言最了不起的优点之一。在创建新类的时候应该优先考虑组合而不是继承。
- 对象这种观念使得你可以通过概念将数据和功能封装到一起,因为可以对问题空间的观念给出恰当的表示,而不用受制于必须使用底层机器语言。
- 以相同的术语将解决方案转换城问题是大有裨益的,因为不需要再问题描述和解决方案之间建立许多中间模型。
- 通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。
- 面向对象程序语言的编译器使用后期绑定的概念来实现多态。
- 简单来说,容器就是一个可以被操作,从而解决问题的序列。之所以单一容器无法满足所有要求,有两方面原因:不同容器提供了不同类型的接口和外部行为;不同容器对于某些操作具有不同的效率。
- 参数化类型(范型):编译器可以自动定制作用于特定类型上的类。
- 动态内存分配的方式有这样一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。编译器对创建在堆上的对象的生命周期一无所知。
- 大多数错误处理机制的主要问题在于,它们都依赖于程序元自身的警惕性,这种警惕性来源于一种共同的约定,而不是编程语言所强制的。Java内置了异常,强制必须使用。
一切都是对象
操纵对象的方法
不管看哪本讲Java的书,大概都会有一个总结:Java使用引用,C++使用指针。
退一步来看其实就是C++和Java在内存分配上给程序员的权限不同。
// C++
ClassA* a = new ClassA();
// Java
ClassA a = new ClassA();
Java中,对象的存储空间释放是不需要程序员来操作的,所以对于对象不怎么需要我们操心的一种操纵方式就是遥控器。给一个遥控器(引用),只要握住遥控器就可以保持与电视机的连接,不管电视机在哪里。C++中则是直接告诉你电视机在哪里(还可以把电视机搬走丢掉呢~)。
存储
存储类型 | 特点 |
---|---|
寄存器 | 位于处理器内部,速度最快,但是小啊~按需分配,不能直接控制,C++中允许向编译器建议寄存器的分配方式 |
堆栈 | 位于通用RAM中,通过堆栈指针可以从处理器获得直接支持。移动指针进行创建和删除。速度仅次于寄存器 |
堆 | 通用内存池,用于存放所有Java对象。编译器不需要知道存储的数据在堆里存活多长时间,十分灵活~ |
常量存储 | ROM中,常量不会被改变 |
非RAM存储 | 活在程序之外的小淘气,如流对象和持久化对象 |
特例:Java中基本类型不用new来创建,因为new创建的对象存储在堆,基本类型都比较“小”。对于这些类型,Java采用和C++相同的方法,不用new来创建,而是创建一个并非是引用的“自动”变量,该变量直接存储值,并置于堆栈中。
Java基本类型占用的存储空间不随及其硬件框架的变化而变化,具有更好的可移植性:
基本类型 | 大小 | 默认值 | 包装器类型 |
---|---|---|---|
boolean | - | false | Boolean |
char | 16bit | \u0000(null) | Character |
byte | 8bit | (byte)0 | Byte |
short | 16bit | (short)0 | Short |
int | 32bit | 0 | Integer |
long | 64bit | 0L | Long |
float | 32bit | 0.0f | Float |
double | 64bit | 0.0d | Double |
void | - | - | Void |
高精度数字:BigInteger和BigDecimal。
生命周期和作用域:
Java对象不具备和基本类型一样的生命周期,使用new创建的Java对象可以存活于作用于之外。
类
类型关键字:class
字段:数据成员,基本数据类型的成员即使没有初始化也会获得一个默认值。
方法:参数列表(引用)、返回值
名字可见性:使用域名生成包名避免重复。
使用其他构件:import。
牧羊人static
关键字
解决两个需求:
- 不论创建多少对象(0个或多个),都可以值为某特定域分配单一存储空间。
- 希望某个方法不与包含它的类的任何对象关联在一起。
类数据
和类方法
表示数据和方法只是作为整个类,而不是类的某个特定对象而存在的。
咩~
Java程序
- 入口
public static void main(String[] args)
- 注释和文档:javadoc可以提取注释用于生成文档。
- 编译运行:JDK
操作符
操作符接受一个或多个参数,并生成一个新值。操作符的优先级决定了计算顺序。
副作用:操作符改变了操作数自身的值的现场。
操作符 | 符号 | 含义说明 |
---|---|---|
赋值运算符 | = | 取其右边的值(右值)复制给左边(左值) |
算术操作符 | 加(+) 减(-) 除(/) 乘(*) 取模(%) | |
一元加减操作符 | 一元加号(+) 一元减号(-) | 一元减号用于转变数据的符号,一元加号仅仅是讲较小类型的操作数提升为int |
自动递增和递减 | ++ – | 前缀式:先执行计算,再生成变量值。后缀式:先生成值,再执行运算。 |
关系操作符 | < > <= >= == != | 进行比较,等于和不等于适用于所有的基本数据类型,其他比较夫不适用于Boolean类型 |
逻辑操作符 | 与(&&) 或( | |
直接常量 | 十六进制0x前缀 八进制前缀0 指数记数e 浮点数f 长整型L | 在含糊不清的时候需要使用这些来明确含义 |
按位操作符 | 与(&) 或( | ) 非(~) 异或(^) |
移位操作符 | 左移(<<) 右移(>>) 无符号右移位操作符(>>>)(零扩展) | 移位可与等号组合使用对byte或short移位时会先转型再右移再赋值 |
三元操作符 | if-else | |
字符串操作符 | + += | 不需要进行字符串的“运算符重载” |
类型转换
窄化转换 narrowing conversion:大转小,需要显示进行类型转换
扩展转换widening conversion:小转大
将float或double转成整型时默认使用截尾,要使用舍入,需要调用Math.round() 。
控制执行流程
条件语句都利用条件表达式的true或false来绝地个执行路径。
- 基本控制流:if-else
- 迭代:while、do-while、for
- Foreach
- 无条件分支:return、break、continue
- 选择语句:switch
总结
这里大概过了一下编程语言的基本特性:运算、操作符优先级、控制流等。果然是看完第一章的总结的时候激情澎湃,一会儿就被这些小细节的地方磨得没劲儿了。其实好像会C++也是不必看的,就是心虚的不知道自己到底会不会,好在,看完啦啦啦啦啦~