提交 da04e0de 编写于 作者: H hollis.zhl

部分知识点完善

上级 3488e56e
在计算机科学中,浮点是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。
我们知道,计算机的数字的存储和运算都是通过二进制进行的,对于,十进制整数转换为二进制整数采用"除2取余,逆序排列"法
计算机使用浮点数运算的主因,在于电脑使用二进位制的运算。例如:4÷2=2,4的二进制表示为100、2的二进制表示为010,在二进制中,相当于退一位数(100 -> 010)。
具体做法是:
1的二进制是01,1.0/2=0.5,那么,0.5的二进制表示应该为(0.1),以此类推,0.25的二进制表示为0.01,所以,并不是说所有的十进制小数都能准确的用二进制表示出来,如0.1,因此只能使用近似值的方式表达。
* 用2整除十进制整数,可以得到一个商和余数;
* 再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止
* 然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
也就是说,,十进制的小数在计算机中是由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到的,这种表示方法类似于基数为10的科学计数法。
如,我们想要把127转换成二进制,做法如下:
一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作正规化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。
![-w624](https://www.hollischuang.com/wp-content/uploads/2020/10/16024170911973.jpg)
位(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度和双精度。
\ No newline at end of file
那么,十进制小数转换成二进制小数,又该如何计算呢?
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。
具体做法是:
* 用2乘十进制小数,可以得到积
* 将积的整数部分取出,再用2乘余下的小数部分,又得到一个积
* 再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。
如尝试将0.625转成二进制:
![-w624](https://www.hollischuang.com/wp-content/uploads/2020/10/16024172361526.jpg)
但是0.625是一个特列,用同样的算法,请计算下0.1对应的二进制是多少:
![-w624](https://www.hollischuang.com/wp-content/uploads/2020/10/16024175486626.jpg)
我们发现,0.1的二进制表示中出现了无限循环的情况,也就是(0.1)10 = (0.000110011001100…)2
这种情况,计算机就没办法用二进制精确的表示0.1了。
所以,为了解决部分小数无法使用二进制精确表示的问题,于是就有了IEEE 754规范。
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。
>浮点数和小数并不是完全一样的,计算机中小数的表示法,其实有定点和浮点两种。因为在位数相同的情况下,定点数的表示范围要比浮点数小。所以在计算机科学中,使用浮点数来表示实数的近似值。
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。
其中最常用的就是32位单精度浮点数和64位双精度浮点数。
IEEE并没有解决小数无法精确表示的问题,只是提出了一种使用近似值表示小数的方式,并且引入了精度的概念。
一个浮点数a由两个数m和e来表示:a = m × b^e。
在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。
如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。
\ No newline at end of file
......@@ -87,7 +87,7 @@ CONSTANT_Utf8_info 结构用于表示字符串常量的值:
代码中可以看出,当参数类型为String,并且长度大于等于65535的时候,就会导致编译失败。
这个地方大家可以尝试着debug一下javac的编译过程(视频中有对java的编译过程进行debug的方法),也可以发现这个地方会报错。
这个地方大家可以尝试着debug一下javac的编译过程,也可以发现这个地方会报错。
如果我们尝试以65534个字符定义字符串,则会发现可以正常编译。
......
......@@ -2,14 +2,104 @@
### 封装(Encapsulation)
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
#### 封装举例
如我们想要定义一个矩形,先定义一个Rectangle类,并其中通过封装的手段放入一些必备数据
/**
* 矩形
*/
class Rectangle {
/**
* 设置矩形的长度和宽度
*/
public Rectangle(int length, int width) {
this.length = length;
this.width = width;
}
/**
* 长度
*/
private int length;
/**
* 宽度
*/
private int width;
/**
* 获得矩形面积
*
* @return
*/
public int area() {
return this.length * this.width;
}
}
### 继承(Inheritance)
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。
继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
#### 继承举例
我们想要定义一个正方形,因为已经有了矩形,所以我们可以直接继承Rectangle类,因为正方形是长方形的一种特例。
/**
* 正方形,继承自矩形
*/
class Square extends Rectangle {
/**
* 设置正方形边长
*
* @param length
*/
public Square(int length) {
super(length, length);
}
}
以上是继承的用法,还有一种实现接口的方式,如我们定义一个Shape类,表示图形:
/**
* 图形
*/
interface Shape{
public int area();
}
那么,矩形Rectangle类可以使用implements实现这个接口
/**
* 矩形
*/
class Rectangle implements Shape{
}
实现接口后,Rectangle需要实现Shape中的area方法。
### 多态(Polymorphism)
所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。
这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
最常见的多态就是将子类传入父类参数中,运行时调用父类方法时通过传入的子类决定具体的内部结构或行为。
最常见的多态就是将子类传入父类参数中,运行时调用父类方法时通过传入的子类决定具体的内部结构或行为。
\ No newline at end of file
关于多态的例子,我们后面的章节中还会深入展开。
\ No newline at end of file
面向对象和面向过程是两种软件开发方法,或者说是两种不同的开发范式。
### 什么是面向过程?
#### 概述: 自顶而下的编程模式.
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想,是一种自顶而下的编程模式。
最典型的面向过程的编程语言就是C语言。
#### 概述
把问题分解成一个一个步骤,每个步骤用函数实现,依次调用即可。
......@@ -13,27 +19,25 @@
### 什么是面向对象?
#### 概述: 将事务高度抽象化的编程模式.
面向对象程序设计的雏形,早在出现在1960年的Simula语言中,当时的程序设计领域正面临着一种危机:在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?
将问题分解成一个一个步骤,对每个步骤进行相应的抽象,形成对象,通过不同对象之间的调用,组合解决问题。
面向对象程序设计在某种程度上通过强调可重复性解决了这一问题。
就是说,在进行面向对象进行编程的时候,要把属性、行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现。
目前较为流行的面向对象语言主要有Java、C#、C++、Python、Ruby、PHP等
比如:想要造一辆车,上来要先把车的各种属性定义出来,然后抽象成一个Car类。
面向对象是一种将事务高度抽象化的编程模式
### 举例说明区别
#### 概述:
同样一个象棋设计.
将问题分解成一个一个步骤,对每个步骤进行相应的抽象,形成对象,通过不同对象之间的调用,组合解决问题。
面向对象:创建黑白双方的对象负责演算,棋盘的对象负责画布,规则的对象负责判断,例子可以看出,面向对象更重视不重复造轮子,即创建一次,重复使用.
就是说,在进行面向对象进行编程的时候,要把属性、行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现。
面向过程:开始—黑走—棋盘—判断—白走—棋盘—判断—循环。只需要关注每一步怎么实现即可.
比如:想要造一辆车,上来要先把车的各种属性定义出来,然后抽象成一个Car类。
### 优劣对比
面向对象:占用资源相对高,速度相对慢
面向对象具有三大基本特征和五大基本原则,这一点在后面的章节中展开介绍。
面向过程:占用资源相对低,速度相对快
......@@ -40,20 +40,23 @@
这样,就实现了多态,同样是Parent类的实例,p.call 调用的是Son类的实现、p1.call调用的是Daughter的实现。
有人说,你自己定义的时候不就已经知道p是son,p1是Daughter了么。但是,有些时候你用到的对象并不都是自己声明的
有人说,你自己定义的时候不就已经知道p是son,p1是Daughter了么。但是,有些时候你用到的对象并不都是自己声明的。
比如Spring 中的IOC出来的对象,你在使用的时候就不知道他是谁,或者说你可以不用关心他是谁。根据具体情况而定。
### 静态多态
另外,还有一种说法,包括维基百科也说明,多态还分为动态多态和静态多态。
上面提到的那种动态绑定认为是动态多态,因为只有在运行期才能知道真正调用的是哪个类的方法。
还有一种静态多态,一般认为Java中的函数重载是一种静态多态,因为他需要在编译期决定具体调用哪个方法
还有一种静态多态,一般认为Java中的函数重载是一种静态多态,因为他需要在编译期决定具体调用哪个方法
关于这个动态静态的说法,我更偏向于重载和多态其实是无关的。
但是也要看情况,普通场合,我会认为只有方法的重写算是多态,毕竟这是我的观点。但是如果在面试的时候,我“可能”会认为重载也算是多态,毕竟面试官也有他的观点。我会和面试官说:我认为,多态应该是一种运行期特性,Java中的重写是多态的体现。不过也有人提出重载是一种静态多态的想法,这个问题在StackOverflow等网站上有很多人讨论,但是并没有什么定论。我更加倾向于重载不是多态。
但是也要看情况,普通场合,我会认为只有方法的重写算是多态,毕竟这是我的观点。
但是如果在面试的时候,我“可能”会认为重载也算是多态,毕竟面试官也有他的观点。我会和面试官说:我认为,多态应该是一种运行期特性,Java中的重写是多态的体现。不过也有人提出重载是一种静态多态的想法,这个问题在StackOverflow等网站上有很多人讨论,但是并没有什么定论。我更加倾向于重载不是多态。
这样沟通,既能体现出你了解的多,又能表现出你有自己的思维,不是那种别人说什么就是什么的。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册