java学习笔记4--类与对象的基本概念(2)

本文地址: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;
}

自定义无参的构造方法

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

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

构建一个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: [email protected]

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

参考资料:

《java程序设计》--清华大学

时间: 2024-07-30 06:43:27

java学习笔记4--类与对象的基本概念(2)的相关文章

Java学习笔记1——类和对象

面向对象 对象:万物皆对象 面向对象 类:模子,属性+方法,类是对象的类型,是具有相同属性和方法的一组对象的集合 对象属性:对象拥有的各种特征,"对象有什么" 对象方法:对象执行的操作,"对象能干什么" 类与对象的关系/区别:类是抽象的,仅仅是模版:对象是看得到,摸得着的具体实体.例如:'手机'类,对象为iPhone6,Lumia920 Java中的类 定义类:Java程序都以类class为组织单元 创建一个对象 //1.定义一个类 public class Tel

Java学习笔记-3.类与对象

一.面向对象程序设计 1.概念:   OOA:面向对象的分析,将现实世界进行抽象的分析 OOD:面向对象的设计 OOP:面向对象的程序 2.面向对象的特点: (1)封装性:一是把对象的全部状态和行为结合在一起,形成一个不可分割的整体,对象的私有属性只能由对象的行为来修改和读取 二是尽可能隐藏对象的内部细节,与外界的联系只能够通过外部接口来实现 (2)继承性:特殊类的对象拥有其一般类的属性和行为 (3)多态性:指同一个实体同时具有多种形式,体现在不同的对象可以根据相同的消息产生各自不同的动作 二.

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

Java学习笔记_19_String类

19.String类: 1>String类的构造方法: · 利用字符串构造一个字符串对象: String str = "HelloWorld": · 无参构造一个字符串对象: String str = new String(); · 传递参数生成一个字符串对象: String str = new String("HelloWorld"); · 由字符数组生成一个字符串对象: String str = new String(char s[ ]); · 由字符数组

Java学习笔记——File类之文件管理和读写操作、下载图片

Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图片 文件和文件夹 相关函数 (boolean) mkdir() 创建此抽象路径名指定的目录  (boolean) mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录. (boolean) delete() 删除此抽象路径名表示的文件或目录 (boolean) createNe

Java学习笔记—复用类

复用代码是Java众多引人注目的功能之一. 一般而言,实现代码重用java提供了两种方式:组合以及继承. 组合:新的类由现有类的对象所组成.(复用现有代码的功能,而非它的形式) 继承:按照现有类的类型组建新类.(在不改变现有类的基础上,复用现有类的形式并在其中添加新代码). 组合 class Engine{ public void start(){} public void stop(){} } class Door{ public void open(){} public void close

疯狂Java学习笔记(56)------------对象序列化

所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象! 对象序列化是对象持久化的一种实现方法,它是将一个对象的属性和方法转化为一种序列化的格式以用于存储和传输,反序列化就是根据这些保存的信息重建对象的过程. java对象序列化机制一般来讲有两种用途: 1.需要将对象的状态保存到文件中(存储),而后能够通过读入对象状态来重新构造对象,恢复程序状态 2.使用套接字在网络上传送对象的程序来说,是很有用的(传输). 我们通过让类实现java.io.Serializable

Java学习笔记(七)&mdash;&mdash;对象

一.类与对象 1.类的定义 类就是模型,确定对象将会拥有的特征(属性)和行为(方法). 2.类的特点 (1)类是对象的类型 (2)具有相同属性和方法的一组对象的集合. 3.对象的属性: 对象具有的各种特征. 4.对象的方法: 对象执行的操作(能干什么). 5.类和对象的关系 类是抽象的概念,仅仅是模板.而对象是一个具体实体. 二.定义Java中的类 1.重要性:所有的Java程序都以类class为组织单元. 2.类的组成:属性和方法. 3.定义类的步骤: (1)定义类名. public clas

Objective-C学习笔记_类和对象

一 Objective-C概述 二 面向对象编程OOP Object Oriented Programming 三 类和对象 OC中类的定义 接口部分 实现部分 类和文件 创建对象 使对象 四 实例变量操作 一 Objective-C概述 Cocoa和Objective-C是苹果公司Mac OS X操作系统的核心.1980年初,Brad Cox发明了Objective-C,意将流行的.可移植的C语言和Smalltalk语言结合在一起:1985年,Steve Jobs成立NeXT公司,NeXT选择

阿花宝宝 Java基础笔记 之 类和对象

一,对象对象:客观存在的事物就是对象对象包含:属性(特征)  和   方法(操作)二,类类:具有相同属性和方法的一组对象的集合.类和对象的关系就是抽象和具体的关系.类是对象的集合,对象是类的实例. 定义一个类的步骤1.定义类名 2.编写类的属性3.编写类的方法public class  <类名>{ //定义属性部分 定义变量来描述类所具有的属性,这些变量称为类的成员变量.  //定义方法部分 访问修饰符  返回值类型 方法名(){  方法体 }}创建和使用对象类名 对象名=new 类名();