初始化
1、区分重载的方法
要是几个方法有相同的名字,Java如何才能知道你指的是哪一个呢?其实规则很简单:每个重载的方法都必须有一个独一无二的参数类型列表。
有些人可能会想:“在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?”比如下面两个方法,虽然它们有同样的名字和形式参数,但却很容易区分它们:
void f(){}
int f(){return 1;}
只要编译器可以根据语境明确判断出语义中,比如在int x=f()中,那么的确可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果,这时你可能会调用方法而忽略其返回值。所以如果像下面这样调用方法:
f();
此时Java如何才能判断该调用哪一个f()呢?
因此,根据方法的返回值来区分重载方法是行不能的。
2、默认构造器
如果某个类已经定义了一个构造器(无论是否有参数),编译器都不会帮你自动创建默认构造器:
class Bird2{
Bird2(int i){}
}
public class NoSynthesis{
public static void main(String[] args){
//! Bird2 b = new Bird2(); //没有默认的,此处调用会出错
Bird2 b2 = new Bird2(1);
}
}
3、this关键字
如果有同一个类型的两个对象,分别是a和b。
class Banana{
void peel(int i){
/*........*/
}
}
public class BananaPeel{
public static void main(String[] args){
Banana a = new Banana(),
b = new Banana();
a.peel(1);
b.peel(2);
}
}
如果只有一个peel()方法,它如何知道是被a还是被b所调用的呢?
为了能用简便、面向对象的语法来编写代码----即“发送消息给对象”,编译器做了一些幕后工作。它暗自把“所操作对象的引用”作为第一个参数传递给peel()方法。所以上述两个方法的调用 就变成了这样:
Banana.peel(a,1);
Banana.peel(b,1);
这是内部的表示形式。我们并不能这样书写代码,并试图通过编译。
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this的用法与其他对象引用并无不同。但要注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。
可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可用this关键字做到这一点。在构造器中,如果为this添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确引用。
public class Flower{
String s = "abc";
Flower(int petals){
/*...*/
}
Flower(String ss){
/*...*/
s = ss;
}
Flower(String s,int petals){
this(petals);
//this(s);//类似的调用不能调用两次
this.s = s;
/*...*/
}
}
清理:终结处理和垃圾回收
程序员都了解初始化的重要性,但常常会忘记同样也重要的清理工作。毕竟,谁需要清理一个int呢?但在使用程序库时,把一个对象用完后就“弃之不顾”的做法并非总是安全的。当然,Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并有在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
这里有一个潜在的编程陷阱,因为有些程序员(特别是c++程序员)刚开始可能会误把finalize()当作c++中的析构函数(c++中销毁对象必须用到这个函数)。所以有必要明确区分一下:在c++中,对象一定会被销毁(如果程序中没有bug的话);而Java里的对象并非总是被垃圾回收。或者换句话说 :
1.对象可能不被垃圾回收。
2.垃圾回收并不等于“析构”。
Java并未提供“析构函数”或相似的概念,要做类似的清理工作,必须自己动手创建一个执行清理工作的普通方法。例如,假设某个对象在创建过程中会将自己绘制到屏幕上,如果不是明确地从屏幕上将其擦除,它可能永远得不到清理。如果在finalize()里加入某种擦除功能,当“垃圾回收”发生时(不能保证一定会发生),finalize()得到调用,图像就会被擦除。要是“垃圾回收”没有发生,图像就会一直保留下来。
重点:
只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得到不到释放。如果程序执行结束,并且垃圾回收器一直都没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也有开销,要是不使用它,那就不用支付这部分开销了。
1、finalize()的用途何在?
3.垃圾回收只与内存有关。
也就是说,使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),它们也必须同内存及其回收有关。
但这是否意味着要是对象中含有其他对象,finalize()就应该明确释放那些对象呢?不,无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这将finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。
finalize()还有一个有趣的用法,它并不依赖于每次都要对finalize()进行调用,这就是对对象终结条件的验证。当对某个对象不再感兴趣----也就是它可以被清理了,这个对象应该处于某种状态,使它占用的内存可以被安全释放。例如,要是对象代表了一个打开的文件,在对象被回收前程序员应该关闭这个文件。只要对象中存在没有被适当清理的部分,程序就存在很隐晦的缺陷。finalize()方法可以用来最终发现这种情况----尽管它并不总是会被调用。
//Using finalize() to detect an object that hasn't been properly cleaned up
class Book{
boolean checkedOut = false;
Book(boolean checkOut){
checkedOut = checkOut;
}
void checkIn(){
checkedOut = false;
}
protected void finalize(){
if(checkedOut){
System.out.println("Error:checked out!");
//Normally,you'll also do this
//super.finalize();
}
}
}
public class TerminationCondition{
public static void main(String[] args){
Book novel = new Book(true);
//Proper cleanup
novel.checkIn();
//Drop the reference,forget to clean up
new Book(true);
//force garbage collection & finalization
System.gc();
}
}
未完,待续。。。。
分享到:
相关推荐
### Java编程思想学习笔记知识点详解 #### 一、操作符 **1.1 赋值操作符** - **符号**: `=` - **功能**: 用于将右侧的值赋给左侧的变量。 - **注意**: 当作用于基本类型时,赋值的是具体的值;当作用于对象时,则...
### Java编程思想笔记 #### 重要知识点概览 在深入探讨《Java编程思想笔记》时,我们可以提炼出一系列核心概念和技巧...以上知识点仅为《Java编程思想笔记》中的冰山一角,深入学习和实践是掌握Java编程精髓的关键。
《Java编程思想》是一本深入浅出介绍Java编程的书籍,这份读书笔记旨在提炼书中核心概念,帮助读者理解和掌握Java编程的关键点。 首先,对象导论阐述了面向对象编程(OOP)的优势,相比过程性语言,OOP使得程序更...
### Java编程思想读书笔记知识点概览 #### 第2章 万事万物皆对象 **知识点一:对象存储位置** - **寄存器**:通常由CPU直接控制,Java程序员无法直接访问。 - **栈 (Stack)**:主要存放基本类型的数据和对象的...
### Java编程思想笔记知识点概述 #### 第 1 章 对象导论 在这一章节中,主要介绍了Java中的基本概念——对象。对象是面向对象编程的核心,它封装了数据和行为。本章首先解释了对象的概念,接着讨论了如何创建对象...
### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...
一、Java编程思想 1. 面向对象编程(OOP):Java的核心是面向对象,这意味着它以类和对象的形式组织代码。类是具有属性(变量)和行为(方法)的模板,而对象是类的实例。理解类和对象、封装、继承和多态等概念是...
#### Bean的初始化与销毁 - **初始化方法**:可以在Bean实例化后立即调用,用于执行一些初始化操作。 - **销毁方法**:在Bean不再需要时被调用,用于释放资源或执行清理工作。 #### 配置文件元素详解 - `<bean>`:...
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
在“Simpllist”中,这些方法可能用于初始化数据、更新视图或清理资源。 **Redux或MobX状态管理** 为了在复杂应用中更好地管理全局状态,开发者可能会选择使用Redux或MobX这样的状态管理库。虽然“Simpllist”是一...