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之路(一) 一切皆对象的更多相关文章

  1. 又一次认识java(一) ---- 万物皆对象

    假设你现实中没有对象.至少你在java世界里会有茫茫多的对象,听起来是不是非常激动呢? 对象,引用,类与现实世界 现实世界里有许很多多的生物,非生物,跑的跳的飞的,过去的如今的未来的,令人眼花缭乱.我 ...

  2. 对Java“一切皆对象”的理念的理解

    在从HelloWorld到面向对象中,我们将int, float, double, boolean等称为基本类型(primitive type),也就是特殊的类.我们可以将一个整数理解称为一个int类 ...

  3. Java编程思想读书笔记之一切皆对象

    一切皆对象 Java程序运行时,数据保存到哪里 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没 ...

  4. java 反射(reflect)总结,附对象打印工具类

    java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...

  5. Java之路——名词解释(一)

    一.开篇 许多人在初接触Java的时候,都会被各种Java的英文缩写名词给弄得头晕脑胀.看一个技术,内容里又会有一堆其他的技术名词,看了半天不知所云.尝试去查一下这些名词的解释,除了非常学术性的解释之 ...

  6. Java之路——敬JAVA初学者(作者:MoMo)

    作为一名大四的毕业生,大学三年过,有得有失.作为一个喜欢编程,喜欢JAVA的人,自学其实是一件美事,很有意思的事.要是能再找个女朋友一起学.嘿嘿,就不枉在大学走了一遭啊!    要离开学校了,还是想留 ...

  7. Python一切皆对象

    Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象. Java虽然也是面向对象编程的语言,但是血统没有Python纯正.比如Java的八种基本数据类型之一int,在持久化的 ...

  8. DAY10-万物皆对象-2018-2-2

    许久没有写了,虽然每天都有在学,但是学的东西也少了,后面难度慢慢加大,学习速度也是变慢了.这是许多天积累下来的笔记,从第一次接触对象,到慢慢去了解,现在处于还待深入了解的状态.万物皆对象,那是不是说没 ...

  9. java编程思想(1)--对象导论

    对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...

随机推荐

  1. 洛谷 P4568 [JLOI2011]飞行路线 解题报告

    P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为0到\(n−1\ ...

  2. 洛谷 P2051 [AHOI2009]中国象棋 解题报告

    P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...

  3. github使用记录

    背景:一直以来,对github既向往又排斥,是因为感觉高大尚有感觉很陌生.现在跟着辉哥学习项目技术,打算好好的学习下这个工具的使用. 1 基础常识 1.1 基础讲解 star的作用是收藏,目的是方便以 ...

  4. 收藏:IPicture总结

    1.IPicture接口对象的创建方法1:直接通过文件创建LPCSTR szFileUrl; IPicture *pIPicture; OleLoadPicturePath(CComBSTR(szFi ...

  5. 纯干货!一款APP从设计稿到切图过程全方位揭秘(转)

    @BAT_LCK :我本身是一名GUI设计师,所以我只站在GUI设计师的角度去把APP从项目启动到切片输出的过程写一写,相当于工作流程的介绍吧.公司不同,流程不尽相同,但是终究还是能有些帮助. 依旧声 ...

  6. 使用Arraylist将数组中元素随机均等乱序分为N个子数组

    使用Arraylist将数组中元素随机均等乱序分为N个子数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 为了将数组中的元素 随机地 ,均等地, 不重复地 ,划分到N个子数组中 使用Arr ...

  7. Kubernetes之解决从k8s.gcr.io拉取镜像失败问题

    前言 因谷歌网络限制问题,国内的K8ser大多数在学习Kubernetes过程中因为镜像下载失败问题间接地产生些许失落感,笔者也因此脑壳疼,故翻阅资料得到以下解决方式: 在应用yaml文件创建资源时, ...

  8. OC中实现锁

    熟悉多线程开发的同学对锁肯定不陌生,但是OC中如何实现锁呢?给大家科普一下. 首先构建一个测试用的类,假想它是我们的一个共享资源,method1与method2是互斥的,代码如下: @implemen ...

  9. Jenkins mac pkg安装 后默认配置文件/启动路径

    自启动文件路径 /Library/LaunchDaemons/org.jenkins-ci.plist jenkins.war 执行文件路径 /Applications/Jenkins/jenkins ...

  10. python学习之——import sys模块

    (1)sys.argv sys模块中的argv变量通过使用点号指明——sys.argv——这种方法的一个优势是这个名称不会与任何在你的程序中使用的argv变量冲突.另外,它也清晰地表明了这个名称是sy ...