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 ...
随机推荐
- Docker镜像加速==》阿里云加速器
1.使用阿里云加速器加快获取docker官方的镜像 步骤一:如果没有阿里云账号,需要注册阿里云开发账号 https://dev.aliyun.com/ 步骤二:进入加速器页面获取加速信息 https: ...
- Appium+python自动化获取toast消息(windows版)的方法
原来用的Appium1.5.3GUI版本,那为什么升级呢? 为了兼容最新版本的iOS10和Android7 Xcode8升级后,将不支持使用UIAutomation,而是改为使用XCUITest了,并 ...
- [八省联考2018]林克卡特树lct——WQS二分
[八省联考2018]林克卡特树lct 一看这种题就不是lct... 除了直径好拿分,别的都难做. 所以必须转化 突破口在于:连“0”边 对于k=0,我们求直径 k=1,对于(p,q)一定是从p出发,走 ...
- debian8.4 ubuntu14.04双系统_debian8.4硬盘安装
本文根据官网说明和实际安装而写,利在分享知识,但转载请注明出处以尊重知识! 一 首先在win7下利用EasyBCD添加安装选项,“添加新条目|安装|配置” 在弹出的memu.lst中填写如下内容: t ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- Java流程控制---个人参考资料
前言:我写博客的目的很简单,很单纯,把自己平时学的东西,放到博客上,空闲的时间,就可以看看自己曾经看到过得东西. Java流程控制语句:判断结构.选择结构.循环结构 一.判断结构 判断结构包括if 分 ...
- PAM认证机制详情
PAM(Pluggable Authentication Modules)认证机制详情 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.介绍PAM PAM(Plugga ...
- Codeforces 662 C. Binary Table
http://codeforces.com/contest/662/problem/C 题意:n行m列01矩阵,每次可以反转一行或一列,问最后最少可以剩下多少个1 n只有20,把行状态压缩 操作奇数次 ...
- 原始套接字-自定义IP首部和TCP首部
/* ===================================================================================== * * Filenam ...
- ftp服务部署
注:Centos7环境,添加用户指定目录后默认其为此用户的共享目录. chroot_local_user=YES chroot_list_enable=YES # (default follows) ...