接口,构造器与垃圾回收机制,对像的生命周期。非静态方法与静态方法。

java不充许多继承是,为了避免“致命方块”的出现
例如 B继承A,C继承A。 C和C里面都有play()方法 。
现在D继承了B,C 想想D.play()调用 的是哪个play()呢,这就是问题所在。

所以java提供了接口来解决此问题。

问:接口并不是真正的多重继承,因为你无法在它里面实现程序代码,
不是吗?如果是这样,那还要接口做什么?

答:多态,多态,多态。接口有无比的适用性,若你以接口取代具体的子类或
抽象的父类作为参数或返回类型,则你就可以传入任何有实现该接口的东西。
这么说吧,使用接口你就可以继承超过一个以上的来源。类可以 extend过某个父类
,并且实现其他的接口。同时其它的类也可以实现同一个接口。因此你就可以为不同的需求组合出不同的继承层次。
事实上,如果使用接口来编写程序,你就是在说:“不管你来自哪里,只要你实现这个接口,别人就会知道你
一定会履行这个合约”。
大部分良好的设计也不需要在抽象的层次定义出实现细节,我们所需的只是个共同的合约定义。让细节在具体的
子类上实现也是很合理的。

接口可以做为方法的参数 。只要实现过这个接口的类,都可以做为参数传入这个方法。

要如何判断应该是设计类、子类、抽象类或接口呢?
1、如果新的类无法对其它的类通过is-a测试时,就设计不继承其它类的类。
2、只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有的类。
3、当你需要定义一群子类的模板,又不想让程序员初始化些模板时(不想让程序员直接用它),设计出抽象的类给

它们用。
4、如果想要定义出类可以扮演的角色,使用接口。

构造器与垃圾回收机制
栈与堆:生存空间
在java中,程序员会在乎内存中的两种区域:
1、对象生存空间堆(heap)
2、方法调用及变量的生存空间栈(stack)。

实例变量是被声明在类而不是方法里面。
局部变量和方法的参数都是被声明在方法中的。在栈上。

栈顶上方法是目前正在执行中的。

二、创建对象的奇迹。
声明对象和赋值有三个步骤:
声明引用变量,创建对象,连接对象和引用。
声明引用变量
Duck myduck
创建对象
new Duck()
连接对象和引用
Duck myduck = new Duck()

如果你写了构造函数,则编译器就不会再给你构建默认的构造函数。

实例变量有默认值,原始类型的默认值是 0/0.0/false,引用类型的默认值是null

在创建新对象时,所有继承下来的无参构造函数都会执行。

执行new的指令是个重大事件,它会启动构造函数连锁反应。
还有,就算是抽象的类也有构造函数。虽然你不能对抽象的类执行
new操作,但抽象的类还是父类,因此它的构造函数会在具体子类
创建出实例时执行。

调用父类的构造函数用super()方法。他必须定在子类构造不函数的第一个语句。

父类的构造函数有参数时,继承的子类也必须super(相应的参数),才能继承。

如果有个重载版的构造函数,有个构造函数的代码要重复使用。就可以用this()或this("a")或this(67,x)
this()只能用在构造函数中,且它必须是第一行语句!
这样会跟super()起冲突吗?
所以必须选择:
每个构造函数可以选择调用super()或this(),但不能同时调用。

三、对像的生命周期。

对象的生命周期完全要看引用 到它的“引用”。引用活着,则对象也活在堆上。
如果引用死了,对象就殉情了。

1、局部变量只会存活在声明该变量的方法中。
2、实例变量的寿命与对象相同。如果对象还活着,则实例变量也会是活的。

当最后一个引用消失时,对象就会变成可回收的。
有3种方法 可以释放对象的引用。
1、引用永久性的离开它的范围。
void go(){
Life z = new Life();//z会在方法结束时消失。
}
2、引用被赋值到其他的对象上。
Life z = new Life();
z = new Life();

3、直接将引用设定为null
Life z = new Life();
z = null;

非静态方法与静态方法的差别。
以引用变量的名称调用非静态的方法。

取得新对象的方法只有通过new或者序列化(deserialization)以及我们不会讨论的java ReflectionAPI。

静态方法没有对象实例的,所以也不存在this。
所以静态方法不能调用非静态的变量和方法 。

静态变量它的值对所有的实例来说都相同。

静态变量只初始化一次,
静态变量是共享的。
同一类所有的实例共享一份静态变量。

实例变量:每个实例一个。
静态变量:每个类一个。

静态的final变量是常数。常数变量的名称应该大写。

final的静态变量值必须在声明或静态初始化程序中赋值:
static{
DOG_CODE = 40;
}

final也可以用来防止方法的覆盖或创建子类。
final的变量代表你不能改变它的值。
final的method代表你不能覆盖掉该method。
final的类代表你不能继承该类(也就是创建它的子类)

时间: 2024-10-17 23:44:38

接口,构造器与垃圾回收机制,对像的生命周期。非静态方法与静态方法。的相关文章

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

.net垃圾回收机制编程调试试验

1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被回收.GC通过代的概念来跟踪对象的持续时间,活跃时间段的对象被归为0代,而活跃时间更长的被归为1代和2代.CLR认为大多数对象都是短暂活跃的,因此0代被收集的频率远远高于1代和2代. 看下GC中对象及其代龄分布: 在.net中,初始分配的小对象在0代上: 通过垃圾回收后,存活的有根对象将被移动到后一

java语言及其垃圾回收机制简单概述

 一.java 语言概述 Java 语言是一门纯粹的面向对象编程语言,它吸收了c++语言的各种优点.又摈弃了c++里难以理解的多继承,指针等概念因此Java语言具有功能强大和简单易用两个特征. Java语言的几个重要概念如下: J2ME:主要用于控制移动设备和信息家电等有限存储设备 J2SE:整个java技术的核心和基础, J2EE:java技术中应用最最广泛的部分,它提供了企业应用开发相关的完整的解决方案. API: 核心类库 JRE:运行Java程序所必须的环境的集合,包含JVM标准实现及J

Java深度历险(四)——Java垃圾回收机制与引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存

你不得不知道的-垃圾回收机制及析构函数原理解析

前言 当学习到Web API中摸索原理时,对于其中有关垃圾回收只是有点印象并未深入去了解其原理并且对索引器用的也很少,所以利用放假期间好好回顾下已经忘记或者遗漏的知识,温故而知新大概就是这道理吧,虽然园子中关于这两者的文章也是多不胜数,但笔者也有自己独特的见解. 垃圾回收机制 引言 我们知道.NET Framework中的对象是创建在托管堆中的,但是像C.C++等其他底层语言中的对象是创建在非托管堆中的,所以在这类语言中就会出现编程人员忘记去释放已经没有用的对象,同时编程人员也可能会去试图访问已

JVM内存管理机制和垃圾回收机制

JVM自身结构物理图: Java代码编译和执行的整个过程包含了以下三个重要的机制: 1.java源码编译机制 1)分析和输入到符号表 class文件结构包含: 结构信息.包括class文件格式版本号及各部分的数量与大小的信息 元数据.对应于Java源码中声明与常量的信息.包含类/继承的超类/实现的接口的声明信息.域与方法声明信息和常量池 方法信息.对应Java源码中语句和表达式对应的信息.包含字节码.异常处理器表.求值栈与局部变量区大小.求值栈的类型记录.调试符号信息 2.类加载机制 1)Boo

Java 垃圾回收机制概述

摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区.关于对象分配内存问题,笔者的博文<JVM 内存模型概述>已经阐述了 如何划分可用空间及其涉及到的线程安全问题,本文将结合垃圾回收策略进一步给出内存分配规则.垃圾回收机制的引入可以有效的防止内存泄露.保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理.本文着重

Java垃圾回收机制学习心得

本文章是我在学习Java垃圾回收机制中总结的知识点的整理,在此特别感谢http://www.cnblogs.com/andy-zcx/p/5522836.html和http://blog.csdn.net/zsuguangh/article/details/6429592的博客. 内存泄漏:内存泄漏是指内存空间使用完毕后未进行回收操作.一般来说,Java中的内存泄漏是因为内存对象生命周期超出其在程序中存在的时间长度 垃圾回收意义:解决编程时需要考虑的内存管理问题,有效解决内存泄漏问题,充分利用空

成为JavaGC专家(2)—如何监控Java垃圾回收机制

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 本文是成为Java GC专家系列文章的第二篇.在第一篇<深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响. 在本文中,我将解释JVM到底是如何执行垃圾回收处理的. 什么是GC监控? 垃圾回收收集监控指的是搞清楚JVM如何执行GC的过程,例如,我们可以查明: 1.        何时一个新生代中的对象被移