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 ...
随机推荐
- sql知识收集
在SQL Server里面有top关键字可以很方便的取出前N条记录,但是Oracle里面却没有top的使用,类似实现取出前N条记录的简单方法如下: 方法1:利用ROW_NUMBER函数 取出前5条记录 ...
- [六字真言]2.嘛.异常定制和通用.md
幻世当空 恩怨休怀 舍悟离迷 六尘不改 且怒且悲且狂哉! 最近一直在循环的一首歌! 丰富自己,比取悦他人更有力量.种下梧桐树,引得凤凰来.你若盛开,蝴蝶自来! 言归正传! 言归正传! 不要去大包大揽 ...
- CSS Counter Style试玩儿
2015年2月3日,CSS Counter Style level3成为了W3C的候选标准,是时候来一探究竟,看看强大魔力的@counter-style如何自定义list-style和counter. ...
- MyBatis中传入参数parameterType类型详解
前言 Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型.本文主要给大家 ...
- HDU 3511 圆扫描线
找最深的圆,输出层数 类似POJ 2932的做法 圆扫描线即可.这里要记录各个圆的层数,所以多加一个维护编号的就行了. /** @Date : 2017-10-18 18:16:52 * @FileN ...
- ASP.NET MVC学习(一)之路由篇Route
什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...
- HTML5 移动开发 (HTML5标签和属性)
第一阶 1.如何使用HTML5中的新标签及属性 2.HTML5中的其它变化 3.HTML5的移动支持 4.使用HTML5开发移动WEB引用的理由 第二阶 HTML5 ...
- CS229 笔记03
CS229 笔记03 局部加权线性回归 Non-Parametric Learning Algorithm (非参数学习方法) Number of parameters grows with the ...
- Crypto 模块安装
crypto模块的目的是为了提供通用的加密和哈希算法. AES是一种常用的对称加密算法,加解密都用同一个密钥.crypto模块提供了AES支持,但是需要自己封装好函数,便于使用 方法一: 1,到 ht ...
- 前端学PHP之正则表达式函数
前面的话 正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面介绍了正则表达式的基础语法,本文将详细介绍正 ...