首页 / JAVA / Java编程思想 初始化与清理总结
Java编程思想 初始化与清理总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java编程思想 初始化与清理总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5168字,纯文字阅读大概需要8分钟。
内容图文
![Java编程思想 初始化与清理总结](/upload/InfoBanner/zyjiaocheng/804/d02ac77fc640472bac54359f041598e3.jpg)
用构造器确保初始化
在创建对象时:
new Rock();
将会为对象分配存储空间 并调用相应的构造器
方法重载
方法名相同而形式参数不同
区分重载方法
每个重载的方法都必须有一个独一无二的参数类型列表 参数顺序不同也可以区分两个方法 不建议这样做 会使代码难以维护
涉及基本类型的重载
基本类型能从一个 较小 的类型自动提升至一个 较大 的类型
如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型 实际数据类型就会被提升 char型略有不同 如果无法找到恰好接受char参数的方法 就会把char直接提升至int型
如果传入的实际参数较大 就得通过类型转换来执行窄化转换 如果不这样做 编译器就会报错
f();
不能以返回值区分重载方法
默认构造器
如果你写的类中没有构造器 则编译器会自动帮你创建一个默认构造器
如果已经定义了一个构造器(无论是否有参数) 编译器就不会帮你自动创建默认构造器
this关键字
编译器暗自把 所操作对象的引用 作为第一个参数传递给peel()
this关键字只能在方法内部使用 表示对 调用方法的那个对象 的引用
如果在方法内部调用同一个类的另一个方法 就不必使用this 直接调用即可
只有当需要明确指出对当前对象的引用时 才需要使用this关键字
由于increment()通过this关键字返回了对当前对象的引用 所以很容易在一条语句里对同一个对象执行多次操作
this关键字对于将当前对象传递给其他方法也很有用
在构造器中调用构造器
尽管可以用this调用一个构造器 但却不能调用两个 此外 必须将构造器调用置于最起始处 否则编译器会报错
由于参数s的名称和数据成员s的名字相同 所以会产生歧义 使用this.s来代表数据成员就能解决这个问题
除构造器之外 编译器禁止在其他任何方法中调用构造器
static的含义
static方法就是没有this的方法 在static方法的内部不能调用非静态方法 反过来倒是可以的 而且可以在没有创建任何对象的前提下 仅仅通过类本身来调用static方法 这实际上正是static方法的主要用途
清理:终结处理和垃圾回收
假定你的对象(并非使用new)获得了一块 特殊 的内存区域 由于垃圾回收器只知道释放那些经由new分配的内存 所以它不知道该如何释放该对象的这块 特殊 内存 为了应对这种情况 Java允许在类中定义一个名为finalize()的方法 一旦垃圾回收器准备好释放对象占用的存储空间 将首先调用其finalize()方法 并且在下一次垃圾回收动作发生时 才会真正回收对象占用的内存
对象可能不被垃圾回收
垃圾回收并不等于 析构
finalize()的用途何在
垃圾回收只与内存有关
finalize()主要使用在 本地方法 中 本地方法 是一种在Java中调用非Java代码的方式
你必须实施清理
Java不允许创建局部对象 必须使用new创建对象
无论是 垃圾回收 还是 终结 都不保证一定会发生
终结条件
finalize()还有一个有趣的用法 它并不依赖于每次都要对finalize()进行调用 这就是对象终结条件的验证
本例的终结条件是:所有的Book对象在被当作垃圾回收前都应该被签入(check in) 但在main()方法中 由于程序员的错误 有一本书未被签入 要是没有finalize()来验证终结条件 将很难发现这种缺陷
垃圾回收器如何工作
自适应
分代
停止——复制
标记——清扫
成员初始化
方法的局部变量 需要先初始化
要是类的数据成员(即字段)是基本类型 会有一个初始值
指定初始化
在定义类成员变量的地方为其赋值
非基本类型的对象
通过调用某个方法来提供初值
这个方法也可以带有参数 但这些参数必须是已经被初始化了的
下面这样写不对
这种初始化方法既简单又直观 但有个限制:类的每个对象都会具有相同的初值
构造器初始化
可以用构造器来进行初始化
无法阻止自动初始化的进行 它将在构造器被调用之前发生
i首先会被置0 然后变成7
初始化顺序
在类的内部 变量定义的先后顺序决定了初始化的顺序 即使变量定义散布于方法定义之间 它们仍旧会在任何方法(包括构造器)被调用之前得到初始化
静态数据的初始化
无论创建多少个对象 静态数据都只占用一份存储区域 static关键字不能应用于局部变量 因此它只能作用于域 如果一个域是静态的基本类型域 且也没有对它进行初始化 那么它就会获得基本类型的标准初值 如果它是一个对象引用 那么它的默认初始化值就是null
静态初始化只有在必要时刻才会进行
初始化的顺序是先静态对象(如果它们尚未因前面的对象创建过程而被初始化) 而后是 非静态 对象
静态初始化只在Class对象首次加载的时候进行一次
显式的静态初始化
Java允许将多个静态初始化动作组织成一个特殊的 静态子句(有时也叫做 静态块)
当首次生成这个类的一个对象时 或者首次访问属于那个类的静态数据成员时(即便从未生成过那个类的对象) 初始化一次
非静态实例初始化
Java中也有被称为实例初始化的类似语法 用来初始化每一个对象的非静态变量
这种语法对于支持 匿名内部类 的初始化是必须的 但是它也使得你可以保证无论调用了哪个显式构造器 某些操作都会发生 实例初始化子句是在构造器之前执行的
数组初始化
a2 = a1 只是复制了一个引用
随机生成数组大小
此时还只是一个引用数组 并且直到通过创建新的Integer对象 并把对象赋值给引用 初始化进程才算结束
也可以用花括号括起来的列表来初始化对象数组
初始化列表的最后一个逗号是可选的(这一特性使维护长列表变得更容易)
为Other.main()的参数而创建的数组是在方法调用处创建的 因此你甚至可以在调用时提供可替换的参数
可变参数列表
将0个参数传递给可变参数列表是可行的 当具有可选的尾随参数时 这一特性就会很有用
在可变参数列表中可以使用任何类型的参数 包括基本类型
可变参数列表与自动包装机制可以和谐共处
你可以在单一的参数列表中将类型混合在一起 而自动包装机制将有选择地将int参数提升为Integer
不使用参数调用f()时 编译器就无法知道应该调用哪一个方法
可以通过在某个方法中增加一个非可变参数来解决该问题
你应该总是只在重载方法的一个版本上使用可变参数列表 或者压根就不使用它
枚举类型
为了使用enum 需要创建一个该类型的引用 并将其赋值给某个实例
在你创建enum时 编译器会自动添加一些有用的特性 它会创建toString()方法 ordinal()方法 表示某个特定enum常量的声明顺序 static values()方法 用来按照enum常量的声明顺序 产生由这些常量值构成的数组
enum有一个特别实用的特性 即它可以在switch语句内使用
由于switch是要在有限的可能值集合中进行选择 因此它与enum正是绝佳的组合 请注意enum的名字是如何能够倍加清楚地表明程序意欲何为的
内容总结
以上是互联网集市为您收集整理的Java编程思想 初始化与清理总结全部内容,希望文章能够帮你解决Java编程思想 初始化与清理总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。