java学习笔记4--对象的初始化与回收
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note4.html,转载请注明源地址。
1、对象初始化和回收
对象初始化
系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化
对象回收
对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收
构造方法
一种和类同名的特殊方法
用来初始化对象
Java中的每个类都有构造方法,用来初始化该类的一个新的对象
没有定义构造方法的类,系统自动提供默认的构造方法
方法名与类名相同
没有返回类型,修饰符void也不能有
通常被声明为公有的(public)
可以有任意多个参数
主要作用是完成对象的初始化工作
不能在程序中显式的调用
在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化
系统提供的默认构造方法
如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法;默认的构造方法没有参数,其方法体为空;使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空
例:声明一个银行帐号类及测试代码
public class BankAccount{
String ownerName;
int accountNumber;
float balance;
}
public class BankTester{
public static void main(String args[]){
BankAccount myAccount = new BankAccount();
System.out.println("ownerName=" + myAccount.ownerName);
System.out.println("accountNumber=" + myAccount.accountNumber);
System.out.println("balance=" + myAccount.balance);
}
}
ownerName=null
accountNumber=0
balance=0.0
可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化
构造方法可以被重载,构造方法的重载和方法的重载一致
一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,Java可以通过参数列表的不同来辨别应调用哪一个方法为BankAccount声明一个有三个参数的构造方法
public BankAccount(String initName, int initAccountNumber, float initBalance) {
ownerName = initName;
accountNumber = initAccountNumber;
balance = initBalance;
}
假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法
public BankAccount(String initName, int initAccountNumber) {
ownerName = initName;
accountNumber = initAccountNumber;
balance = 0.0f;
}
自定义无参的构造方法
无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错
在声明构造方法时,好的声明习惯是不声明构造方法;如果声明,至少声明一个无参构造方法
class Bush {
Bush(int i) {}
Bush(double d) {}
}
如果写:new Bush(); 编译器将要告诉你找不到对应的构造方法
说明:
用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法
例:创建一个拥有两个构造方法的Tree类,一个有参,一个无参。
import java.util.*;
class Tree
{
int height;
Tree() {
prt("Planting a seedling");
height = 0;
}
Tree(int i) {
prt("Creating new Tree that is "+ i + " feet tall");
height = i;
}
void info() {
prt("Tree is " + height + " feet tall");
}
void info(String s) {
prt(s + ": Tree is " + height + " feet tall");
}
static void prt(String s) {
System.out.println(s);
}
}
测试Tree类:
public class javatest {
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
Tree t = new Tree(i);
t.info();
t.info("overloaded method");
}
new Tree();
}
}
测试结果:
Creating new Tree that is 0 feet tall
Tree is 0 feet tall
overloaded method: Tree is 0 feet tall
Creating new Tree that is 1 feet tall
Tree is 1 feet tall
overloaded method: Tree is 1 feet tall
Creating new Tree that is 2 feet tall
Tree is 2 feet tall
overloaded method: Tree is 2 feet tall
Creating new Tree that is 3 feet tall
Tree is 3 feet tall
overloaded method: Tree is 3 feet tall
Creating new Tree that is 4 feet tall
Tree is 4 feet tall
overloaded method: Tree is 4 feet tall
Planting a seedling
this关键字的使用:
可以使用this关键字在一个构造方法中调用另外的构造方法
代码更简洁,维护起来也更容易
通常用参数个数比较少的构造方法调用参数个数最多的构造方法
使用this关键字,修改BankAccout类中无参数和两参数的构造方法:
public BankAccount() {
this("", 999999, 0.0f);
}
public BankAccount(String initName, int initAccountNumber) {
this(initName, initAccountNumber, 0.0f);
}
public BankAccount(String initName, int initAccountNumber, float initBalance) {
ownerName = initName;
accountNumber = initAccountNumber;
balance = initBalance;
}
2、内存回收技术
当一个对象在程序中不再被使用时,就成为一个无用对象,当前的代码段不属于对象的作用域,把对象的引用赋值为空
Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存
Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法
垃圾收集器
自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收
作为一个线程运行,通常在系统空闲时异步地执行
当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,与系统同步运行
finalize()方法
在类java.lang.Object中声明,因此 Java中的每一个类都有该方法
用于释放系统资源,如关闭打开的文件或socket等
声明格式
protected void finalize() throws throwable
如果一个类需要释放除内存以外的资源,则需在类中重写finalize()方法
应用举例:
对银行帐户类BankAccount进行一系列修改和测试:
声明BankAccount类
声明toString()方法
声明存取款方法
使用DecimalFormat类
声明类方法生成特殊的实例
声明类变量
- 包括状态、构造方法、get方法及set方法
public class BankAccount{
private String ownerName;
private int accountNumber;
private float balance;
public BankAccount() {
this("", 0, 0);
}
public BankAccount(String initName, int initAccNum, float initBal) {
ownerName = initName;
accountNumber = initAccNum;
balance = initBal;
}
public String getOwnerName() { return ownerName; }
public int getAccountNumber() { return accountNumber; }
public float getBalance() { return balance; }
public void setOwnerName(String newName) {
ownerName = newName;
}
public void setAccountNumber(int newNum) {
accountNumber = newNum;
}
public void setBalance(float newBalance) {
balance = newBalance;
}
}
声明测试类AccountTester
public class AccountTester {
public static void main(String args[]) {
BankAccount anAccount;
anAccount = new BankAccount("ZhangLi", 100023,0);
anAccount.setBalance(anAccount.getBalance() + 100);
System.out.println("Here is the account: " + anAccount);
System.out.println("Account name: " + anAccount.getOwnerName());
System.out.println("Account number: " + anAccount.getAccountNumber());
System.out.println("Balance: $" + anAccount.getBalance());
}
}
Here is the account: BankAccount@372a1a
Account name: ZhangLi
Account number: 100023
Balance: $100.0
声明toString()方法
将对象的内容转换为字符串
Java的所有类都有一个默认的toString()方法,其方法体如下:
getClass().getName() + '@' + Integer.toHexString(hashCode())
下面的两行代码等价:
System.out.println(anAccount);
System.out.println(anAccount.toString());
如果需要特殊的转换功能,则需要自己重写toString()方法
toString()方法的几点说明
必须被声明为public
返回类型为String
方法的名称必须为toString,且没有参数
在方法体中不要使用输出方法System.out.println()
public String toString() {
return("Account #" + accountNumber + " with balance $" + balance);
}
参考资料:
《java程序设计》--清华大学
java学习笔记4--对象的初始化与回收的更多相关文章
- Java学习笔记之对象的复制和克隆
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- Java学习笔记--面对对象OOP
面向对象编程 OOP 面向对象&面向过程 面向对象编程的本质:以类的方式组织代码,以对象的方法组织数据 面向对象编程的三大特征: 封装 继承 多态 方法 静态方法 通过 static 关键词说 ...
- java学习笔记之对象序列化
1.简述 java对象序列化就是将对象编程二进制数据流的一种方法,从而实现对对象的传输和存储 2.作用 java是门面向对象编程语言,即一切皆对象,但是java对象只能存在于jvm中,一旦jvm停掉那 ...
- java学习笔记-8.对象的容纳
1.Iterator(迭代器)和Enumeration(枚举类),都是用来遍历集合的,他们都是接口.区别是Enumeration只能读取集合的数据,而Iterator可以对数据进行删除,Iterato ...
- Java学习笔记day08_day09_对象实例化_private_this
1.类与对象 类就是一个模版. 对象的实例化就是根据模版类, 使用new关键字创建实际的对象. 2.类的定义及创建对象 类的定义格式: public class 类名{ //属性(变量) 数据类型 变 ...
- java学习笔记-01.对象入门
1.面向对象编程简称是OOP. 2.继承是通过 extends关键字实现的,接口是通过implements关键字实现的. 3.public:意味着后续的定义任何人均可使用. private:意味着除了 ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
随机推荐
- 服务管理(svcadm)
svcs 正在运行的服务 svcs -a 正在运行和没运行的服务 svcs -D 此进程依赖的进程 svcs -D sendmail svcs -d 依赖于此进程的进程 svcs - ...
- 基于rsync方式的文件备份
rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用.本文主要讲述的是如何自架rsync服 务器,以实现文件传输.备份和镜像.相对ta ...
- 应用程序首选项(application preference)及数据存储
应用程序首选项(application preference)用来存储用户设置,考虑以下案例: a. 假设有一款MP3播放器程序,当用户调节了音量,当下次运行该程序时,可能希望保持上一次调节的音量值. ...
- 剖析ironic
关键技术 在安装操作系统时需要存储介质来存储系统镜像.需要控制物理机开关机,在网络部署环境中还需要预启动环境. PXE (预启动环境) IPMI(电源管理) iSCSI(存储) 什么是PXE PXE( ...
- Hibernate 基于外键的单项一对一关联映射
在开发过程中很多时候会用到表与表之间一对一的关联关系,本文简单介绍在Hibernate4中单项一对一的关联映射. 1.设计表结构 2.创建Person对象 3.创建IdCard对象 4.写hbm.xm ...
- NOIP初赛前一日记
2018年10月12日,早晨7:25于机房. 早晨的鄞中,晨风还有点清冷.看着电脑上翻遍的资料,心里实在是有一种说不出的感觉. 说出来也算是丢脸——作为浙江选手,我为了NOIP2018的初赛,停课了一 ...
- Codeforces 30 E. Tricky and Cleve Password
\(>Codeforces \space 30\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个串 \(S\),让你找出 \(A, B, C\ ...
- 51nod1203 JZPLCM 线段树 + 扫描线
不算很难的一道题 原题的数据虽然很小,但是我们不能欺负它,我们就要当$S[i] \leqslant 10^9$来做这题 最小公倍数 = 所有的质因数取可能的最大幂相乘 对于$> \sqrt S$ ...
- Java并发(十四):并发工具类——CountDownLatch
先做总结: 1.CountDownLatch 是什么? CountDownLatch 允许一个或多个线程等待其他线程(不一定是线程,某个操作)完成之后再执行. CountDownLatch的构造函数接 ...
- ASP.Net如何用Cookies保存对象
在ASP.Net中,有时候考虑到较多的使用Session来保存对象,会增加服务器的负载,所以我们会选择用Cookies来保存对象的状态,而Cookies只能保存字符串,这时,我们可以考虑用序列化操作来 ...