Java之路(一) 一切皆对象
Java语言假设我们只进行面向对象的程序设计,即在开始用Java进行设计前,我们需要将思想切换到面向对象的世界中。
1.用引用操纵对象
每种编程语言都有自己操纵内存中元素的方式。是直接操纵元素还是用某种基于特殊语法的间接表示来操纵对象?
Java中将一切都视为对象,这样就可采用较为单一固定的语法。
虽然将一切都看做对象,但操纵的标识符实际上是对象的引用。
拥有一个引用,并不一定与一个对象相关联。
2.必须由使用者创建所有对象
1).Java内存分配
五个地方可以存储数据:
a.寄存器。位于处理器内部,速度最快,但数量有限,不能直接控制。
b.堆栈。位于RAM中,通过堆栈指针可以从处理器那里获得直接支持。速度仅次于寄存器。
但Java系统必须知道存储在堆栈的所有项的生命周期,这样才能操纵堆栈指针分配或者释放内存。
对象引用存储在堆栈中(堆栈还存储着其他项),但对象不存储在堆栈中。
c.堆。位于RAM区,一种通用的内存池,存放所有的Java对象。编译器不需要知道存储在堆里的数据的存活时间。速度慢于堆栈。
d.常量存储。常量值通常存于程序代码内部。
e.非RAM存储。如持久化对象,数据存储在磁盘上。
2).一切皆是对象的特例:基本类型
new创建对象存放在堆上,但创建简单、较小的变量没有必要用new。因此Java采用创建并非是引用的自动变量来存储这类小而简单的变量,并将它们放在堆栈里,以提高效率。这类自动变量就是Java的基本类型。
基本类型共9种,如下表所示:
| 基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
| boolean | — | — | — | Boolean |
| char | 16-bit | Unicode 0 | Unicode 216-1 | Character |
| byte | 8 bits | -128 | +127 | Byte |
| short | 16 bits | -215 | +215-1 | Short |
| int | 32 bits | -231 | +231-1 | Integer |
| long | 64 bits | -263 | +263-1 | Long |
| float | 32 bits | IEEE754 | IEEE754 | Float |
| double | 64 bits | IEEE754 | IEEE754 | Double |
| void | — | — | — | Void |
从表中可知基本类型的特点:占用存储空间大小不变;所有数值类型都是有符号数;具有包装器。
占用存储空间大小不变提高了Java程序的可移植性。
Java中一切皆对象,但基本类型却不是对象,为了解决这个问题,Java让每个基本类型都对应了一个包装器类型。
包装器类型将基本类型包装起来,添加了属性和方法。Java SE5自动包装功能可以将基本类型转换为包装器类型,当然也可以反向转换。
基本类型和它们的包装器类型有哪些区别呢?
a)包含内容不同。基本类型只是表示一个数据,包装器类型包括数据和方法。
b)声明方式不同。包装器类型需要使用new来声明,而基本类型不需要。
c)未进行初始化时,默认初始值不同。如int作为类成员变量时,默认初始值为0,而包装器类型都为null。
d)存储位置不同。基本类型存储在堆栈中,而包装器类型的引用存储在堆栈中,引用引用的对象存储在堆中。
e)使用方式不同。基本类型可以直接赋值,不能放进List,Map等集合类中,而包装器类型可以。
Java还提供了两个用于高精度计算的类,BigInteger(支持任意精读的整数)和BigDecimal(支持任何精度的定点数)。它们大体上属于包装器类型,但没有对应的基本类型。
3).数组
Java会确保数组被初始化,不能在范围之外被访问。这提高了安全性和效率,但也意味着要对数组进行范围检查,而且需要额外的内存开销。
创建基本类型的数组时,所有元素都会被初始化为0。
创建一个数组对象时,实际上创建的是引用数组,所有元素都被初始化为null。使用null的引用运行时会报错。
3.不需要销毁对象
当要销毁一个对象时,就要考虑它的存活时间和销毁的恰当时间。
1).基本变量与作用域
作用域决定了定义在其内的变量的可见性和存活时间,在作用域里定义的变量只存活在作用域里。
但要注意,Java不支持作用域的变量隐藏,如下:
{
int a=1;
{
int a=2; //非法
}
}
2).对象的作用域
对象不具备和基本类型一样的生命周期,在作用域内用new创建的对象可以存活到作用域之外。如下:
{
String s = new String("a string");
}
引用s在{}外不再存在,而其指向的String仍然存在并占用着内存空间,但是我们无法在访问这个对象了。这个String何时被销毁由垃圾回收器决定,当垃圾回收器确定它不会再被引用时,就会释放它占用的内存。
4.类的字段
class DataOnly{ //class 定义类的关键字 DataOnly类名 类中包含字段和方法
int i; //字段可以是基本类型
double d; //普通字段不能在对象间共享
boolean b;
//字段可以是任何类型的对象,可以通过引用与其进行通信
//字段是某个对象的引用时,必须初始化
}
基本成员默认值
若类的某个成员是基本数据类型时,如果没有进行初始化,Java会给其一个默认值。默认值如下表:
| 基本类型 | 默认值 |
| boolean | false |
| char | '\u0000'(null) |
| byte | (byte)0 |
| short | (short)0 |
| int | 0 |
| long | 0L |
| float | 0.0L |
| double | 0.0d |
注意:只有当基本类型变量作为类的成员时,Java才会确保给其默认值。
不是类的成员时,不会自动初始化。这时如果不赋值,编译时报未初始化错误。
5.类的方法
方法就是函数。Java的方法决定了一个对象能够接收什么样的消息。方法签名(方法名和参数列表合起来)唯一的表示出某个方法。
方法的参数列表指定要传递给方法什么样的消息,这些信息以对象形式传递,且实际传送的是对象的引用。
6.static关键字
static关键字可以满足两种情形:一是只想为某特定域分配唯一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不需要创建任何对象;二是希望某个方法不与包含它的类的任何对象关联在一起,即即使没有创建对象也可以调用这个方法。
当声明一个事物为static时,就认为这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
static变量和方法有两种引用方式:一是通过创建类的对象,使用对象来引用;二是直接通过类名来引用。
7.第一个Java程序
//HelloDate.java
import java.util.*;
public class HelloDate{
public static void main(String[] args){
System.out.println("Hello, it's ");
System.out.println(new Date());
}
}
第2行引入Date类。注意,在Java的所有文件中,都会自动导入java.lang类库。
第3行定义了一个HelloDate类,是public的。
第4行的main()函数必须存在,编译器要求args也必须存在,因为要用来存储命令行参数。mian()函数是static的,它是运行一个应用时的入口点。
第5行的out是一个静态的PrintStream类,因为是静态,不需要创建任何对象,out便已经存在了,可以直接使用;out类可调用的方法由其类型PrintStream决定,如可以使用println()方法打印传入的数据到控制台,并换行。out是静态的,使用完后依然存在。
第6行的new Date()创建了一个Date对象,并将其值转换为String类型发送给println(),之后Date对象可以随时被垃圾回收器销毁。
Java之路(一) 一切皆对象的更多相关文章
- 又一次认识java(一) ---- 万物皆对象
假设你现实中没有对象.至少你在java世界里会有茫茫多的对象,听起来是不是非常激动呢? 对象,引用,类与现实世界 现实世界里有许很多多的生物,非生物,跑的跳的飞的,过去的如今的未来的,令人眼花缭乱.我 ...
- 对Java“一切皆对象”的理念的理解
在从HelloWorld到面向对象中,我们将int, float, double, boolean等称为基本类型(primitive type),也就是特殊的类.我们可以将一个整数理解称为一个int类 ...
- Java编程思想读书笔记之一切皆对象
一切皆对象 Java程序运行时,数据保存到哪里 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没 ...
- java 反射(reflect)总结,附对象打印工具类
java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...
- Java之路——名词解释(一)
一.开篇 许多人在初接触Java的时候,都会被各种Java的英文缩写名词给弄得头晕脑胀.看一个技术,内容里又会有一堆其他的技术名词,看了半天不知所云.尝试去查一下这些名词的解释,除了非常学术性的解释之 ...
- Java之路——敬JAVA初学者(作者:MoMo)
作为一名大四的毕业生,大学三年过,有得有失.作为一个喜欢编程,喜欢JAVA的人,自学其实是一件美事,很有意思的事.要是能再找个女朋友一起学.嘿嘿,就不枉在大学走了一遭啊! 要离开学校了,还是想留 ...
- Python一切皆对象
Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象. Java虽然也是面向对象编程的语言,但是血统没有Python纯正.比如Java的八种基本数据类型之一int,在持久化的 ...
- DAY10-万物皆对象-2018-2-2
许久没有写了,虽然每天都有在学,但是学的东西也少了,后面难度慢慢加大,学习速度也是变慢了.这是许多天积累下来的笔记,从第一次接触对象,到慢慢去了解,现在处于还待深入了解的状态.万物皆对象,那是不是说没 ...
- java编程思想(1)--对象导论
对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...
随机推荐
- 【bzoj2440】 中山市选2011—完全平方数
http://www.lydsy.com/JudgeOnline/problem.php?id=2440 (题目链接) 题意 求第K个不含有完全平方因子的数 Solution 没想到莫比乌斯还可以用来 ...
- 解题:CF960G Bandit Blues & FJOI 2016 建筑师
题面1 题面2 两个题推导是一样的,具体实现不一样,所以写一起了,以FJOI 2016 建筑师 的题面为标准 前后在组合意义下一样,现在只考虑前面,可以发现看到的这a个建筑将这一段划分成了a-1个区间 ...
- bzoj2616: SPOJ PERIODNI——笛卡尔树+DP
不连续的处理很麻烦 导致序列DP又找不到优秀的子问题 自底向上考虑? 建立小根堆笛卡尔树 每个点的意义是:高度是(自己-father)的横着的极大矩形 子问题具有递归的优秀性质 f[i][j]i为根子 ...
- oracle递归查询(查询条件ID下得所有子集)
一.CREATE TABLE TBL_TEST ( ID NUMBER, NAME VARCHAR2(100 BYTE), PID NUMBER ...
- 21天实战caffe笔记_第三天
1 深度学习工具汇总 (1) caffe : 由BVLC开发的基于C++/CUDA/Python实现的卷积神经网络,提供了面向命令行.Matlab和Python的绑定接口.特性如下: A 实现了前馈 ...
- 「Vue」父子组件之间的传值及调用方法
a.父组件向子组件传值data(){},props数据区别data中的数据可读可写,是自己的数据props是个数组,中的数据是父组件传递过来的,只读不能写<login :dmsg='msg'&g ...
- vue npm start 自动打开网页
打开config/index.js,设置: autoOpenBrowser: true,(默认是false,把false改为true即可)
- 数学:拓展Lucas定理
拓展Lucas定理解决大组合数取模并且模数为任意数的情况 大概的思路是把模数用唯一分解定理拆开之后然后去做 然后要解决的一个子问题是求模质数的k次方 将分母部分转化成逆元再去做就好了 这里贴一份别人的 ...
- 20155230 2016-2017-2 《Java程序设计》第五周学习总结
20155230 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.错误处理通常称为异常处理. 2.catch括号中列出的异常不得有继承关系,否则会发生编译 ...
- CSUST 1506 ZZ的计算器 模拟题
题目描述:实现一个计算器,可以进行任意步的整数以内的加减乘除运算,运算符号只有+.-.*./,求出结果. 解题报告:一个可以说麻烦的模拟题,我们可以这样,输入以字符串的形式输入,然后将输入先做一遍预处 ...