[学习笔记][Java编程思想]第2章:一切都是对象

  • Java是基于C++的。
  • Java是混合型语言。Java程序先编译成字节码,然后再通过JVM解释执行。
  • Java只能进行面向对象的程序设计(OOP)。

1 用引用操作对象

  • Java中一切被视为对象,操纵的标识符则是对象的一个引用(reference)。
  • 引用独立存在,并不一定需要有一个对象与它关联。但安全的做法是创建一个引用的同时便进行初始化。
  • 字符串可以用带引用的文本初始化。

2 必须由你创建所有对象

  • new操作符用于创建对象。

2.1 存储到什么地方

  1. 寄存器。 最快的存储区,位于处理器内部,数量极其有限,不能直接控制。
  2. 堆栈。 又称栈,速度仅次于寄存器,位于RAM(随机访问存储器,如计算机内存)中,通过堆栈指针可以从处理器那里获得直接支持。
    堆栈内所有项的生命周期都必须是确定的。对象引用存储于堆栈,对象不存储于其中。
  3. 堆。 速度比堆栈慢,也位于RAM内,用于存放所有的Java对象。
    编译器不需要知道存储的数据的生命周期。
  4. 常量存储。 常量值通常直接程序代码内部。在嵌入式系统中,可以选择将其存放在ROM(只读存储器)中。
  5. 非RAM存储。 存活于程序之外的数据,在程序没有运行时也可以存在。把对象转化成可以存放在其他媒介上的事物。
    在流对象中,对象转化成字节流,通常被发送给另一台机器。
    在“持久化对象”中,对象被存放于磁盘上。

2.2 特例:基本类型

  • 基本类型是程序设计中经常用到的一系列类型,存储在堆栈中。
  • Java每种基础类型存储空间大小是确定的,不随机器硬件架构变化。
  • 基本类型
大小最小值最大值包装器
boolean---Boolean
char16 bitsUnicode 0Unicode 2161 Character
byte8 bits-128+127Byte
short16 bits 215 +2151 Short
int32 bits 231 +2311 Integer
long64 bits 263 +2631 Long
float32 bitsIEEE754IEEE754Float
double64 bitsIEEE754IEEE754Double
void---Void

- boolean类型大小没有明确指定,仅定义为能够取字面值true或false
- 基本类型具有包装器类,可以在堆中创建一个对象来表示对应的基本类型。基本类型和对应的包装器类型可以相互自动转换。
- BigInteger支持任意精度的整数,BigDecimal支持任意精度的定点数。必须以方法调用方式取代运算符方式来实现。

2.3 Java中的数组

  • Java确保数组会被初始化,且不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。

3 永远不需要销毁对象

3.1 作用域

  • 在Java中,作用域由花括号的位置决定。作用域决定了在其内定义的变量名的可见性和生命周期。
  • 在作用域里定义的变量只可用于作用域结束之前。
  • Java中不允许将一个较大作用域的变量“隐藏”起来的做法。

3.2 对象的作用域

  • Java对象的生命周期和基本类型不一样,由new创建的对象,只要你需要,就会一直保留下去。
  • Java有一个垃圾回收器,监听用new创建的所有对象,负责辨别不再被引用的对象并回收其内存空间。

4 创建新的数据类型:类

  • class关键字用来定义了一个新类型。
class ATypeName { /* Class body goes here */ }

4.1 字段和方法

  • 在Java中你所做的全部工作就是定义类,产生类的对象,以及发送消息给对象。
  • 类中可以设置两种元素:字段(又称数据成员)和方法(又称成员函数)。
  • 字段可以是任何类型的对象,也可以是基本类型中的一种。字段是对象引用必须初始化。
  • 每个对象都有用来存储其字段的空间,普通字段不能在对象间共享。
  • 字段赋值:在对象引用的名称之后紧接着一个句点,然后再接着是对象内部的成员名称。也可以给位于对象所包含的其他对象的字段赋值。
objectReference.member

基本成员默认值
- 类的成员是基本类型时,即使没有初始化,也会获得一个默认值。当变量作为类的成员使用时,Java才确保给定其默认值。
- 非类的字段不会进行初始化,可能是任意值。使用未初始化变量,编译会报错。

  • 基本类型
默认值
booleanfalse
char‘\u0000’(null)
byte(byte)0
short(short)0
int0
long0L
float0.0f
double0.0d

5 方法、参数和返回值

  • 方法的基本组成:名称、参数、返回值和方法体。
ReturnType methodName( /* Argument list */ ) {
    /* Method body */
}
    • 返回类型描述在调用方法之后从高方法返回的值。
    • 参数列表给出要传给方法的信息的类型和名称。
    • 方法名和参数列表(称为“方法签名”)唯一地标识出某个方法。
  • 方法只能作为类的一部分来创建,只有通过对象才能被调用。调用方法时,需要先列出对象名,紧接着是句点,然后是方法名和参数列表。
objectName.methodName(arg1. arg2. arg3);
  • 调用方法的行为通常被称为发送消息给对象

5.1 参数列表

  • 参数列表传递的实际是引用,并且引用的类型必须正确。
  • return关键字代表离开此方法,如果此方法产生一个值,这个值要放在return语句后面。
  • 返回值可以为空(void),此时return关键字仅用来退出方法。

6 构建一个Java程序

6.1 名字可见性

  • 为了给一个类库生成不会与其他名字混淆的名字,Java希望程序员使用反转的个人域名,来做为包的开头命名,保证它们肯定是独一无二的。反转域名后,句点就是用来代表子目录的划分。
  • 约定整个包名都使用小写。

6.2 运用其他构件

  • 如果想在自己的程序里使用预先定义好的类,那么编译器就必须知道怎么定位它们。
  • import指示编译器导入一个包,也就是一个类库。
  • import可以指定具体的类名导入,也可以使用通配符“*”来导入前缀包内的所有类。

6.3 static关键字

  • 通常,创建类时,只是在描述那个类的对象的外观和行为。执行new创建对象时,数据存储存储空间才被分配,其方法才供外界调用。
  • static关键字放在字段或方法定义之前,意味着这个域或方法不会与包含它的类的任何对象关联在一起。
  • static字段或方法,可以通过一个对象去定位它,也可以通过其类名直接引用。使用类名引用是首选方式。
  • static作用于某个字段时,肯定会改变数据创建的方式。作用于某个方法,差别却没有那么大。
  • static方法可以创建或使用与其类型相同的被命名对象,因此static方法经常负责看护与其隶属同一类型的实例群。

7 你的第一个Java程序

  • java.lang是默认导入到每个Java文件中的,它的所有类都可以被使用。
  • System.out.println()方法将参数数据打印到控制台。
    • 文件名必须和某个类的名字相同,这个类必须包含一个名为main()的方法。
    • public static void main(String[] args)
    • args用来存储命令行参数。

7.1 编译和运行

  • 编译和运行程序,首先要有一个Java开发环境。如JDK(Java Developer’s Kit,Java开发人员工具包)开发环境。
  • 在设定好的路径上,javac指令编译文件,java执行程序字节码。

8 注释和嵌入式文档

    • 多行注释,以“/”开始,以“/”结束,//之间的所有东西都会被忽略。

    • /* This is a comment
      <ul><li>that continues</li>
      <li>across lines</li>
      <li>/
    • 单行注释,以一个“//”起头,直到句末的所有东西都会被忽略。

    • //This is a one-line comment
  • 8.1 注释文档

    • Java将代码同文档“链接”起来,通过特殊的注释语法来标记文档。
      • javadoc是用于提取注释的工具,是JDK安装的一部分。
      • javadoc输出的是一个HTML文件。
      • 可以编写“doclets”的javadoc处理器来对信息执行特殊的操作。

    8.2 语法

    • 所有javadoc命令都只能在“/*”注释中出现,结束于“/”。
      • 使用javadoc的方式主要有嵌入HTML和“文档标签”。
      • 独立文档标签是以“@”开头的命令,且置于注释行的最前面。
      • 行内文档标签是以“@”开头,并且括在花括号内,可以出现在javadoc注释中的任何地方。
    • 有三种类型的注释文档:类注释位于类定义之前,域注释位于域定义之前,方法啊注释位于方法定义之前。
    • javadoc只能为public和protected成员进行文档注释,private和包内可访问成员的注释会被忽略掉。

    8.3 嵌入式HTML

    • javadoc通过生成的HTML文档传送HTML命令,主要目的是为了对代码进行格式化。
    • 在文档注释中,位于每一行开头的星号和前导空格都会被javadoc丢弃。
    • 不要在嵌入式HTML中使用标题标签。

    8.4 一些标签示例

    • @see 引用其他类的文档。
    • {@link package.class#member label} 与@see类似,用于行内,用label作为超链接文本。
    • {@docRoot} 产生到文档根目录的相对路径
    • {#inheritDoc} 从当前这个类的最直接的基类中继承相关文档到当前的注释文档中。
    • @version 产生版本说明中的重要信息。
    • @author 产生作者信息。
    • @since 指定程序代码最早使用的版本。
    • @param 描述方法参数列表中的参数信息。
    • @return 描述返回值的含义。
    • @throws 描述异常出现的原因。
    • @deprecated 指出一些旧特性已由改进的新特性所取代。

    9 编码风格

    • 驼峰风格:类名的首字母要大写,多个单词并在一起,每个单词的首字母都采用大写。
    • 方法、字段和对象引用名称,也使用驼峰风格,只是标识符的第一个字母采用小写。
    • 代码摆开放、闭花括号。

    疑问和解答

    1. 标识符存储到什么地方?

    • 网上搜索不到相关资料,根据自己的知识猜测,标识符在解释执行时会被转换成分配到的内存地址。

    2. boolean存储空间大小是多少?

    • boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。
    • 参考文章

    3. 导入一个包,是否会导入该包的子包中的类?

    • 不会。

    4. 导入的类库中,具有同名类时,会发生什么?

    • 如果在包内类和导入类有歧义时,默认使用包内类。
    • 如果多个导入类有歧义时,编译器会报错,必须在类名前加上包的前缀来指定使用哪个包的类。

    5. 对象方法存储在哪?静态字段和普通字段存储位置有什么区别?

    • stack 区存放函数参数和局部变量;
    • heap 区存放对象;
    • data 区存放static 的变量或者字符串常量;
    • code 区存放类中的方法;
    • stack 栈 –>放方法的参数 和局部变量.就像这样
        void test(String[] args){
            int xx = 0;// args和 xx在jvm load class时存放在栈中
        }
    • heap 堆 –> 堆要比栈要大得多.
    • 当一个对象对new出来时,该对象放在heap中,对象引用放在栈中.
    • data 区,也就是数据区 –>静态的变量 和 string的常量.
    • code 代码区 —>classloader类加载器加载该class时存放类中的方法.

    6. java.lang含有哪些类?可以做什么?

    • java.lang是提供利用Java编程语言进行程序设计的基础类。
    • 最重要的类是Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用程序中的类)。

    7. 收获

    • package声明要放在代码最前面,import导入包要放在所有的类之前。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值