【Java学习笔记】对象生命周期-阿里云开发者社区

开发者社区> gnuhpc> 正文

【Java学习笔记】对象生命周期

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.创建对象 1)显示创建:     a.用new创建对象。     b.使用反射手段,即调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
+关注继续查看

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1.创建对象
1)显示创建:
    a.用new创建对象。
    b.使用反射手段,即调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
    c.调用对象的clone()方法。注意,这种方法不会调用类的构造函数
    d.使用反序列化的方法。
对于clone方法注意:
a.Object中的clone方法时protected,若希望对外公开clone()方法,就必须扩大访问范围,改为public
b.返回Object类型。
c.若类没有实现Cloneable接口,clone()方法会抛出异常,Object的子类若是允许客户程序调用其clone()方法,那么这个类必须实现Cloneable方法。
2)隐式创建:
    a.String str= "hello";这种属于String类型直接数对应一个String对象,引用一个String对象。若此时运行String str2=
"hello";则str和str1是同一个对象。
    b.String中+的使用。
    c.JVM加载一个类的时候,会隐含创建描述这个类的Class实例。
3)创建步骤:
    a.给对象分配内存。
    b.将对象的实例变量自动初始化为其变量类型的默认值。
    c.初始化对象,给实例变量赋予正确的初始值。
2.构造方法
注意:
没有返回类型(有的话,即使函数名同名也被视为一般函数而非构造方法),不能被static、final、synchronized、abstract和native修饰。
用this可以重载构造方法:必须在第一条语句使用this。且必须在构造方法中使用this调用其他构造方法。
在类中没有构造方法的时候JAVA会给每个类一个默认的构造方法,但是若类中显式的添加了构造方法,并且所有的构造方法都带参数,那么这个类除非也显式的定义一个默认构造方法,否则默认的构造方法就缺失了。
子类的构造方法中,可以通过super语句调用父类的构造方法,因为构造函数是不继承的。例如:super("Something is OK");
在构建子类对象的时候,JVM首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的时候,从继承树的最上层的父类开始,依次执行各个类的构造方法。
构造方法的调用:
当前类的其他构造方式通过this语句调用它。其子类的构造方法通过super调用。在程序中使用new调用。
构造方法的访问级别:
一般的我们的构造方法都是public级别的(以上我们讨论的情况),但是我们现在要讨论的是在private级别的,这就意味着只能在当前类中或在当前类的其他构造方法中通过this语句调用它。当然,在当前类的成员方法中使用new也会调用)
a.这个类只提供一些静态方法给外部,所以为了禁止外部程序创建类的实例(因为静态方法无需创建实例),所以将构造方法设为private。
b.禁止这个类被继承。当然是用final也可以解决,但它同时也禁止了外部使用new进行创建实例(同a所述)
c.这个类需要把构造自身实例的细节封装起来,而向其他程序提供了获得自身实例的静态方法——静态工厂方法。
3.静态工厂方法:
假如类需要进一步封装创建自身实例的细节,并且控制自身实例数目,那么可以提供静态工厂方法。
使用举例:
public class Gender{
    private String description;
    private static final Gender female = new Gender("female");
    private static final Gender male = new Gender("male");
    private Gender(String description){this.description=description;}
    public static Gender getFemale(){
        return female;
    }
}
特点:
a.静态工厂方法名可以不与类名相同,程序代码可读性增强。比较流行的是将这样的代码命名为valueOf或者getInstance
b.使用时是否会创建一个新的对象完全取决于方法的实现。
c.可以返回当前类的子类的实例。
应用:创建以下各种类。
a.单例类:系统中具有唯一性的组件。
实现方法:
1)把构造方法定义为private类型,提供public static final 类型的静态变量。该变量引用类的唯一的实例。
2)在方法1)的基础上添加getInstance方法,返回那个静态变量,使用的是静态工厂方法。这个的好处在于可以不修改方法名的前提下修改实现getInstance的实现方式,以适应变更的需求。
b.自定义枚举类:实例数目有限的类。
c.不可变类:指创建了这个类的实例后就不允许修改它的属性值。
创建时把属性定义为private final类型,不对外公开setXXX()方法,只对外公开getXXX()方法。在构造方法中初始化所有属性。覆盖Object的equals()方法和hashCode()方法。若是需要就提供实例缓存和静态工厂方法。
类的设计优先考虑不可变类。在创建不可变类的时候,若其属性是可变类型,则需要提供保护性拷贝。
具有实例缓存的不可变类,比如Integer实例,有一个静态工厂方法valueOf(int i),这样创建的一个Integer对象,要是发现前边有值是相同创建好的实例的话,那么直接使用以前创建的。这样的特性可以通过Java集合来作为实例缓存。

public class Ghost{
    private static final Map<String,Ghost> ghosts = new HashMap<String,Ghost>();
    private final String name;
    private Ghost(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public static Ghost getInstance(String name){
        Ghost ghost = ghosts.get(name);
        if(ghost == null){
            ghosts=new Ghost(name);
            ghosts.put(name,ghost);
        }
        return ghost;
    }
    public static void removeInstance(String name){
        ghosts.remove(name);
    }

在分层的软件系统中,业务逻辑层向客户层提供服务,静态工程类可以进一步削弱这两层间的耦合关系。

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

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

相关文章
[译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)
使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性。这种交叠有一个很好的例子就是 HttpApplication,它就是全局应用类的基类,在下表中,你可以看到 HttpApplication 类中定义的属性和方法。
735 0
[译] ASP.NET 生命周期 – ASP.NET 上下文对象(八)
使用 HttpResponse 对象 HttpResponse 对象是与 HttpRequest 对象相对应的,用来表示构建中的响应。它当中提供了方法和属性可供我们自定义响应,有一些在使用 MVC 视图的时候很少使用到,但是在使用其他组件的时候可能十分有用,比如模块是处理器。
833 0
[译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)
使用 HttpRequest 对象 HttpRequest 对象描述的是一个正在被处理的 HTTP 请求。下表列举了 HttpRequest 中的属性,它们提供了当前请求的相关信息(HttpRequest 类定义了一些方法和属性,我们会逐步讲解当中的一些属性)。
738 0
Java线程的生命周期(转)
Java线程的生命周期   一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正运行其中的程序代码。
845 0
java线程学习2——线程的生命周期
    该图摘自《疯狂的java讲义》,该书讲述的线程很详细。   其中新建状态和死亡状态的线程的isAlive属性均返回false,值得注意的是对死亡的线程调用start方法或 对新建的线程调用两次start 方法均会抛出illegalThreadStateException异常。  
950 0
消灭“脑细胞杀手”,阿里专家带你深入C++对象的生命周期管理
C/C++的指针一直是令人又爱又恨的特性。围绕指针产生了许许多多优雅的数据结构和系统实现,但又滋生了不少“脑细胞杀手”——内存Bug。如何通过指针管理C++中对象,如何管理对象的生命周期呢?本文中,阿里巴巴高级开发工程师付哲就为大家分享《C++对象的生命周期管理》。
4265 0
MAVEN学习笔记之Maven生命周期和插件简介(3)
MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立。 clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所有文件 post-clean 执行清理后的工作 compile validate
1116 0
JavaScript面向对象的编程指南学习笔记
JavaScript面向对象的编程指南学习笔记 第一章 1,用自己的语言描述出,什么是对象、类、封装、聚合、继承、多态? 对象,拥有属性和方法的任何抽象概念。 类,可以实例化,有共同属性或方法(行为)的相似对象,的模板 封装,提供接口,隐藏接口的实现 聚合,将大功能(对象)拆分成小功能(小对象)去实现的逆过程。
8844 0
JAVA CDI 学习(2) - Scope 生命周期
在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1、Application 生命周期 即:web application启动后,处于该生命周期级别的对象/变量,将一直存在,可以被所有web应用的用户共同访问,通常用来做网站计数器,实现流量访问之类。
916 0
+关注
406
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载