oopjava生命周期实现继承关键字是什么_第1页
oopjava生命周期实现继承关键字是什么_第2页
oopjava生命周期实现继承关键字是什么_第3页
oopjava生命周期实现继承关键字是什么_第4页
oopjava生命周期实现继承关键字是什么_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

回顾问题实现继承的关键字是什么?使用继承有什么好处?子类继承父类后,如何调用父类的属性和方法?抽象类?2jvm(java虚拟机)中的几个比较重要的内存区域,这几个区域在java类的生命周期中扮演着比较重要的角色:方法区:专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号 等信息。堆区:用于存放类的对象实例。栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧果方法中调用了其他方法,则继续在栈顶创建新的,如。内存区域的划分3类的生命周期(CH10)4/35JVM和程序的生命周期类的加载、连接和初始化类加载器类的卸载小结内容5/java源文件。字节码文件:编译后的class的文件。只有这种字节码文件才能够在java虚拟机中运行。java类的生命周期:指一个class文件从加载到卸载的全过程。分为以下五个阶段:加载

连接

初始化使用(即对象生命周期)卸载1.JVM和程序的生命周期6/Java对类的使用:主动式、式2.类的加载、连接和初始化(1)验证1

加载(2)准备(3)解析3

初始化2

连接图1

类的生命周期的开始7/2.类的加载、连接和初始化8/2.类的加载、连接和初始化2.1

类的加载找到需要加载的类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的

。类的加载方式Java程序描述Worker类的class对象描述Car类的class对象Worker类的数据结构Car类的数据结构堆区方法区调用class对象的方法如:newInstance()图1

class对象是java程序与类在方法区内的数据结构的接口类的加载器:自带加载器,用户自定义的类加载器(java.lang.ClassLoader)。类的加载时机。9/2.2

类的验证当一个类被加载之后,必须要验证一下这个类是否合法,比如这个类是不是符合字节码的格式、变量与方法是不是有重复、数据类型是不是有效、继承与实现是否合乎标准等等。总之,这个阶段的目的就是保证加载的类是能够被

jvm所运行。2.类的加载、连接和初始化10/2.3

类的准备准备阶段的工作就是为类的静态变量分配内存并设为jvm默认的初值,对于非静态的变量,则不会为它们分配内存。有一点需要注意,这时候,静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。jvm默认的初值是这样的:基本类型(int、long、short、char、byte、boolean、float、double)的默认值为0。类型的默认值为null。常量的默认值为程序中设定值,比如在程序中定义final

static

int

a=100,则准备阶段中a的初值就是100。2.类的加载、连接和初始化11/2.4

类的解析把常量池中的符号转换为直接。符号直接??2.类的加载、连接和初始化要在内存中找一个类里面的一个叫做show的方法,显然是找不到。但是在解析阶段,jvm就会把show这个名字转换为指向方法区的的一块内存地址,比如c17164,通过c17164就可以找到show这个方法具体分配在内存的哪一个区域了。这里show就是符号

,而c17164就是直接 。在解析阶段,jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址。12/2.5

类的初始化初始化阶段,JVM执行类的初始化语句,为类的静态变量赋予初始值。在程序中,静态变量的初始化有两种途径:1、在静态变量的

处进行初始化2、在静态代码块中进行初始化。2.类的加载、连接和初始化public

class

InitClass{public

static

String

a

=

“nihao”;public

static

long

b;static

{b

=

2//静态变量的 处进行初始化//在静态代码块中进行初始化。System.out.println("初始化InitClass");}}13/2.类的加载、连接和初始化静态变量的 语句,以及静态代码块都被看做类的初始化语句,java虚拟机会按照初始化语句在文件中的先后顺序来依次执行他们。(P286

例)如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句。P287例10-1在类的初始化阶段,只会初始化与类相关的赋值语句和静态语句,也就是有static关键字修饰的信息,没有static修饰的赋值语句和静态语句在实例化对象的时候才会运行。2.5

类的初始化(Cont.)14/2.6

类的初始化时机有六种活动被看做是程序对类或接口的主动使用:创建一个类的实例。如用new语句创建实例等。调用类的静态方法。某个类或接口的静态变量,或者对该静态变量赋值。调用JavaAPI中某些反射方法.初始化一个类的子类。Java虚拟机启动时被标明为启动类的类。例如对于“javaSample"命令,Sample类就是启动类,Java虚拟机会先初始化它。其他为 使用,如final变量的两种情况。关于接口。与静态变量、静态方法的定义位置的相关性.ClassLoader.loadClass().2.类的加载、连接和初始化15/Bootstrap,根类加载器

Extension,扩展加载器

System,系统加载器

用户自定义的加载器3.类加载器16/3.类加载器17/例:P30118/4.类的卸载loader1变量和obj变量间接它。代表Sample类的Class对象,而objClass变量则直接如果程序运行过程中,将上图左侧三个变量都置为null,此时Sample对象结束生命周期,MyClassLoader对象结束生命周期,代表Sample类的Class对象也结束生命周期,Sample类在方法区内的二进制数据被卸载。当再次有需要时,会检查Sample类的Class对象是否存在,如果存在会直接使用,不再重新加载;如果不存在Sample类会被重新加载,在Java虚拟机的堆区会生成一个新的代表Sample类的Class实例(可以通过哈希码查看是否是同一个实例)。19/5.小结对象的生命周期(CH11)20/35在Java虚拟机管辖的运行时数据区,最活跃的就是位于堆区的对象。在Java虚拟机的生命周期中,对象被创建、销毁。在对象生命周期的开始阶段,需要为对象分配内存,并且初始化它的实例变量。当程序不再使用某个对象时,它就会结束生命周期,它的内存可以被Java虚拟机的 回收器回收。创建对象的方式构造方法静态工厂方法垃级回收清除过期的对象对象的强、软、弱小结内容21/4

种显式地创建对象的方式:用new语句创建对象(最常用)。运用反射

,调用java.lang.Class

或者java.lang.reflect.Constructor类的newInstance()实例方法。调用对象的clone()方法。运用反序列化

,调用java.io.ObjectInputStream

对象的readObject()方法。P305例1.创建对象的方式不管采取哪种方式创建对象,Java虚拟机创建一个对象都包含以下步骤。给对象分配内存。将对象的实例变量自动初始化为其变量类型的默认值。初始化对象,给实例变量赋予正确的初始值。22/初始化一个对象通过对象的构造方法完成(构造方法负责对象的初始化工作,为实例变量赋予合适的初始值)。构造方法则:必须满足以下语方法名与类名相同。无返回值。和native

修饰。不能被static、final、synchronized、可重载public

class

Sample

{private

intx;public

Sample(){//不带参数的构造方法this(1);}public

Sample(int

x){//带参数的构造方法this.x=x;}public

int

Sample(int

x){//不是构造方法return

x++;}}23/2.构造函数重载构造函数public

class

Employee

{private

String

name;private

int

age;24/2.构造函数/**

当雇员的

和 都已知,就调用此构造方法*/public

Employee(String

name,

int

age)

{

=name;this.age=age;}/**

当雇员的 已知而 未知,就调用此构造方法*/public

Employee(String

name){this(name,

-1);}/**

当雇员的

和 都未知,就调用此构造方法*/public

Employee()

{this("无名氏");}public

void

setName(String

name){=name;

}public

String

getName(){return

name;

}public

void

setAge(int

age){this.age=age;}public

int

getAge(){return

age;}}Employee

zhangsan=new

Employee("",25);Employee

lisi=new

Employee("

");Employee

someone=new

Employee();this与构造方法(P310)假如在一个构造方法中使用了this

语句,那么它必须作为构造方法的第一条语句.只能在一个构造方法中用this

语句来调用类的其他构造方法.只能用this

语句来调用其他构造方法.默认构造方法,无参的构造方法。系统给的隐含构造方法。显示定底的构造方法。子类调用父类的构造方法。

父类的构造方法不能被继承。

super:

需是构造方法的第一句。例:p312,P312

图11-1

11-22.构造函数25/构造方法的作用域同一个类构造方法通过this调用。子类构造方法通过super调用。

通过new调用。构造方法的

级别public/protected

/private/默认private

主要用于以下情形仅包含静态方法的类。此类不需要初始化。如Math被继承需要把构造自身实例的细节隐

,如静态工厂方法。2.构造函数26/用new语句可创建类的实例。假如要封装创建自身实例的细节,并且控制自身实例的数目,那么可以使用静态工厂方法。3.静态工厂方法public

class

Gender{private

String

description;private

static

final

Gender

female=new

Gender("女");private

static

final

Gender

male=new

Gender("男");private

Gender(Stringdescription){this.description=description;}public

static

Gender

getFemale(){return

female;}public

static

Gender

getMale(){return

male;}public

String

getDescription(){return

description;}}单例类枚举类不可变类、可变类27/等工作中解放出回收,Garbage

Collection把程序员从复杂的内存追踪、监测和

来,减轻程序员进行内存管理的负担。防止系统内存被 ,从而使系统更加健壮和稳定。回收具有以下特点:只有当对象不再被程序中的任何存才可能被回收。变量 时,它的内回收操作。程序无法迫使 回收器立即执行当 回收器将要回收无用对象的内存时,先调用该对象的finalize()方法,该方法有可能使对象

,导致

回收器取消回收该对象的内存。4.回收28/等工作中解放出回收,Garbage

Collection把程序员从复杂的内存追踪、监测和

来,减轻程序员进行内存管理的负担。防止系统内存被 ,从而使系统更加健壮和稳定。回收具有以下特点:只有当对象不再被程序中的任何存才可能被回收。变量 时,它的内回收操作。程序无法迫使 回收器立即执行当 回收器将要回收无用对象的内存时,先调用该对象的finalize()方法,该方法有可能使对象

,导致

回收器取消回收该对象的内存。4.回收29/对象的可触及性可触及状态可 状态不可触及状态4.回收对象的状态转换图30/对象的可触及性可触及状态可 状态不可触及状态4.回收对象的状态转换图31/的回收时间回收器作为低优先级线程独立运行。在任何时候,程序都无法迫使回收器立即执行回收操作。在程序中可以调用System.gc()或Runtime.gc()方法提示回收器尽快执行回收操作,但是这也不能保证调用完该方法后,回收线程就立即执行回收操作,而且不能保证垃圾回收线程一定会执行这一操作。4.

回收32/对象的finalize()方法当 回收器将要 无用对象的内存时,先调用该对象的finalize()方法Java

虚拟机的 回收操作对程序完全是透明的,因此程序无法预料某个无用对象的finalize()方法何时被调用。对象的finalize()方法的特点回收器是否会执行该方法及何时执行该方法,都是不确定的。finalize()方法有可能使对象 ,使它恢复到可触及状态。回回收器在执行finalize()方法时,如果出现异常,收器不会报告异常,程序继续正常运行。

比较finalize()方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论