java学习笔记4--对象的初始化与回收-阿里云开发者社区

开发者社区> wuyudong> 正文

java学习笔记4--对象的初始化与回收

简介:
+关注继续查看

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;    
}

自定义无参的构造方法

无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错

在声明构造方法时,好的声明习惯是不声明构造方法;如果声明,至少声明一个无参构造方法

构建一个Bush类,有两个有参数的构造方法:
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()

为BankAccount类添加自己的toString()方法
public String toString() {
    return("Account #" + accountNumber + " with balance $" + balance);
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WCF 笔记 (2) - 传输泛型 List 对象
在做邮件服务的时候遇到一个问题: 服务器端有个方法参数是个List 类型。当在客户端传参数的时候 ,你即使传个List类型的参数,也还是提示参数类型错误。 相关解决方法:http://www.cnblogs.com/wizardwu/archive/2009/08/09/1542102.html
626 0
你不可错过的Java学习资源清单
学习Java和其他技术的资源其实非常多,但是我们需要取其精华去其糟粕,选择那些最好的,最适合我们的,同时也要由浅入深,先易后难。基于这样的一个标准,我在这里为大家提供一份Java的学习资源清单。 Java入门学习资源 这里主要推荐的是几个技术学习网站,基本上都是视频学习资源。
1488 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8371 0
《基于ECS搭建FTP服务》学习笔记
1.远程连接ECS服务器 2.安装vsftpd 3.配置vsftpd 4.客户端测试
463 0
JavaScript面向对象的编程指南学习笔记
JavaScript面向对象的编程指南学习笔记 第一章 1,用自己的语言描述出,什么是对象、类、封装、聚合、继承、多态? 对象,拥有属性和方法的任何抽象概念。 类,可以实例化,有共同属性或方法(行为)的相似对象,的模板 封装,提供接口,隐藏接口的实现 聚合,将大功能(对象)拆分成小功能(小对象)去实现的逆过程。
8844 0
阿里ECS进阶课程学习笔记--基于ECS搭建FTP服务
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。
156 0
Java学习--Ajax与数据库连接池
Java学习--Ajax与数据库连接池 概述 数据库连接池 Ajax简介 JavaScript实现Ajax jQuery实现Ajax 一:数据库连接池 数据库连接是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的性能。
1599 0
+关注
wuyudong
我的个人博客地址:http://wuyudong.com/
203
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载