Java笔记word03.doc_第1页
Java笔记word03.doc_第2页
Java笔记word03.doc_第3页
Java笔记word03.doc_第4页
Java笔记word03.doc_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第一章对象的入门一、Java的五个基本特性(1) 所有东西都是对象。(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。(3) 每个对象都有自己的存储空间,可容纳其他对象。 (4) 每个对象都有一种类型。(5) 同一类所有对象都能接收相同的消息。二、 所有的事物都有两个方面有什么(属性):用来描述对象。能够做什么(方法):告诉外界对象有那些功能。后者以前者为基础。大的对象的属性也可以是一个对象。三、 单根结构所有的类都继承一个终极基础类:Object单根结构的优点:、单根结构中的所有对象都有一个通用的接口,他们最终都属于相同 类型。、实现类似中的模版功能。、单根结构中的所有对象都可以保证拥有一些特定的功能。一个单根结构,加上所有对象都在内存堆中创建,大大简化了参数传递。方便实现垃圾收集器。四、面向对象的基本思想1.对象:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称作主动服务)。2 类:类是具有相同属性和服务的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。3 消息 :消息就是向对象发出的服务请求,它应该包含下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。服务通常被称为方法或函数。 五、面向对象的基本特性1封装性封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界或者说形成一道屏障,只保留有限的对外接口使之与外部发生联系。封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的交叉感染,使软件错误能够局部化,大大减少查错和排错的难度。 2继承性特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 一个类可以是多个一般类的特殊类,它从多个一般类中继承了属性与服务,这称为多继承。 在java语言中,通常我们称一般类为父类(superclass,超类),特殊类为子类(subclass)。 3多态性对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:几何图形的绘图方法,椭圆和多边形都是几何图的子类,其绘图方法功能不同。第二章 一切都是对象一、六大存储位置(1)寄存器:由编译器分配,速度最快。(2)堆 栈:保存对象的句柄,而不是对象本身。要知道保存数据的长度和时间。(3) 堆 : 使用“new”关键字。保存对象,具有更好的灵活性,不要知道数据的长度和存在时间。 (4静态存储:只能加载一次,全局只有一份,一旦改变,所有的引用都要更改。(5)常量存储:常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。(6).非RAM存储:对象保存在磁盘中.即使程序中止运行,它们仍可保持自己的状态不变。二、八大基本类型特殊类型,主要类型 主类型 大小最小值 最大值 封装器类型 默认值 boolean 1bit Boolean false char 16-bit Unicode-0 Unicode216-1 Character null byte 8-bit -128 +127 Byte (byte)0 short 16-bit -215 +215-1 Short (short)0 int 32-bit -231 +231-1 Integer 0 long 64-bit -263 +263-1 Long 0L float 32-bit IEEE754 IEEE754 Float 0.0f double 64-bit IEEE754 IEEE754 Double 0.0d void Void主类型保存在堆栈中,封装器类型则保存在堆中三、高精度数字BigInteger 和 BigDecimal(封装器类型)BigInteger支持任意精度的整数BigDecimal支持任意精度的定点数字(币值)四、作用域作用域同时决定了它的“可见性”以及“存在时间”,作用域是由花括号的位置决定的。参考下面这个例子: int x = 12; /* only x available */ int q = 96; /* both x & q available */ /* only x available */ /* q “out of scope” */作为在作用域里定义的一个变量,它只有在那个作用域结束之前才可使用。五、类、方法1.类的实现包括两个部分:类声明和类体 1类声明:publicabstract|final class className extends superclassName implements interfaceNameList其中,修饰符public,abstract,final 说明了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。2类体类体定义如下:class classNamepublic | protected | private static final transient volatile typevariableName;/成员变量public | protected | private staticfinal | abstract native synchronizedreturnType methodName(paramList) throws exceptionListstatements /成员方法3成员变量成员变量的声明方式如下:public | protected | private static final transient volatile typevariableName; /成员变量其中,static: 静态变量(类变量);相对于实例变量final: 常量 transient: 暂时性变量,用于对象存档,用于对象的串行化,见对象的串行化一节volatile: 贡献变量,用于并发线程的共享2.方法组成:名字、参数、返回值和方法体。六、主成员的默认值主类型 默认值Boolean falseChar u0000(null)byte (byte)0short (short)0int 0long 0Lfloat 0.0fdouble 0.0d注释和嵌入文档:多行注释:/*-*/单行注释: /-/* 这是一个文档注释的例子,主要介绍下面这个类 */public class DocTest/* 变量注释,下面这个变量主要是充当整数计数 */public int i;/* 方法注释,下面这个方法的主要功能是计数 */public void count( ) 第三章 控制程序流程一、运算顺序助记词 运算符类型 运算符UlcerUnary+ - + rest.AddictsArithmetic (and shift)* / % + - ReallyRelational = B ? X : YA LotAssignment= (and compound assignment like *=)二、九类关键字1.原始基本类型:byte short int long float double char Boolean2.循环关键字: do while for break continue3.分支关键字:if 、 else、switch、case、default、break4.方法、变量和类型修饰符:private、public、protected、final、static、abstractSynchronized、volatile、strictfp5.异常处理: try catch 、finally、throw、throws6.对象相关关键字:new、extends、implements、class、instanceof、super7.字面值常量: false 、true、null8.方法相关关键字: return、void9.包相关关键字: package import三、运算符的讲解1.八大基本类型:字符型: char 16逻辑布尔型:boolean 1整数型: byte 8 、short 16、int 32、long 64浮点型: float 32、 double 642.按功能区分运算符算术运算符:+ 、* 、/ 、% 、+ 、 - 关心运算符: 、= 、 、 、 、1、 、赋值运算符: =扩展运算符: += 、 、= 、*= 、 /=条件运算符: ?:例如:a=10011101; b=00111001;则有如下结果:a3 =11110011 a3=00010011;a&b=00011001; a|b=10111101;a=01100010; ab=10100100; 四、控制流语句1.循环语句:while 、do-while 、for2.判断语句:if-else 、switch-case3.异常处理:tray-catch-finally 、throw4.跳转语句:break 、continue、label、return第四章 初始化和清除一、初始化顺序(静态变量、静态初始化块)(变量、初始化块)构造器如果有父类:父类-静态变量 、父类-静态初始化块 、子类-静态变量 、子类-静态初始化块 父类-变量 、父类-初始化块 、父类-构造器 、子类-变量 、子类-初始化块 子类-构造器二、初始化和清除构造函数负责初始化,分配空间。构建器,无返回值,可重载overloading三、方法重载overloading方法重载是让类以统一的方式处理不同类型数据的一种手段。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法, 这就是多态性。根据参数不同或返回值不同而区分相同名字的方法。注意,Java的方法重载要求同名的方法必须有不同的参数表,仅有返回类型不同是不足以区分两个重载的方法。主类型的重载: 若我们的数据类型小于方法中的自变量,就会向上cast,转换。 如果是大于的话,需要强制转换(信息可能丢失)默认构造函数:创建一个空对象。如果定义一个构建函数,那么就不会使用默认的构建函数。四“this”关键字表示调用它的对象的句柄。当前对象的句柄在构建函数中调用构建函数。使用“this”关键字。例如:public class Moop int lit; int pak; public Moop(int x) lit = x; public Moop(int x,int y) this(x); /在构建器中调用了构建函数。this表示当前对象句柄。 pak = y; “static”关键字,static定义的方法没有this句柄注意:我们不可以从一个static方法内部发出对非static方法的调用,除非将这个句柄传到static方法内部。五、清除收尾和垃圾收集 垃圾收集器只知道释放new分配的内存。当需要释放一些特殊内存的时候,Java提供了一个名为finalize ()的方法。可以在我们的类中定义它。 finalize()工作原理:当垃圾收集器准备好释放对象空间,它首先调用finalize()方法,并且需要在下一次垃圾收集的过程中才真正回收对象内存。三个重点: 1、垃圾收集并不等于“破坏”(释放)Java对象并非肯定最为对象被收集。2、我们的对象可能不会当作垃圾被收集掉。3、垃圾收集只和内存有关。什么时候用finalize()呢?答案是最好不用。似乎finalize()没有多少用途,只是在一些特殊的地方。非Java对象调用。六成员初始化:若程序员没有初始化,那编译器会为他们赋一个值:Data Type Inital valueboolean falsechar (Null,不显示)byte 0short 0 int 0long 0float 0.0double 0.0规定初始化:在定义同时赋初值(C+ 中不能这样做)可以用new,方法(带返回值)来初始化构建函数初始化:在用此初始化之前定义的数据成员已经被编译器赋给默认值,所以在构建器中没有强迫我们初始化。静态数据的初始化:static的初始化只有在必要的时候才会进行。初始化时首先是static对象的创建过程:以名为Dog的类为例1.类型为Dog的一个对象首次创建时,或Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在环境变量中设置搜索路径) 2.找到Dog.class后(它会创建一个class对象) 它的所有static初始化模块都会运行.因此,static初始化仅发生一次,即在class对象首次装载时。 3.创建一个new Dog()时,Dog对象分配足够的内存存储空间。 4.这种存储空间会清为零,将Dog中所有基本类型设为他们的默认值。 5.进行字段定义时发生的初始化都会执行。 6.执行构建函数。明确进行静态初始化 例: class Spoon static int i; static /静态初始化开始 i = 47; 六、数组初始化Java中的数组大小在编译的时候才决定,在运行的时候才创建。在编译的时候进行边界检查。牺牲性能换来安全。 int a1 = 1,2,3,4,5; int a2 ; a2 = a1; /复制一个句柄。 对于非基本数据类型的数组初始化:使用new Integer a = new Integer /java1.1以后版本支持 new Integer(1); new Integer(2); ; Integer a = /java 1.0 版本支持(唯一) new Integer(1); new Integer(2); 未知参数数量大小,及类型:变参表/:VarArgs.java /Using the Java1.1 array syntax to create /varivale argument lists class Aint i; public class VarArgs static void f(Object x) for(int i = 0 ; i x.length ; i+) System.out.println(xi); /每一个Object都有一个toString(),自动转换 public static void main(String args) f(new Object/不同的类型 new Integer(47),new VarArgs(), new Float(3.14),new Double(11.11); f(new Objectone,two,three); f(new Objectnew A(),new A(),new A(); 多维数组初始化: int a1 = 1,2,3, 4,5,6, ; Integer a2 = new Integer(1),new Integer(2), new Integer(3),new Integer(4), new Integer(5),new Integer(6), int a3 = new intpRand(7); /pRand(int)是一个随机方法 for(int i = 0; i a3.length;i+) a3i = new intpRand(5); for(int j = 0 ;ja3i.length;j+) a3ij = new intpRand(5); 第五章 隐藏实施过程一、包:库单元1.包 包的创建、声明和导入。包是类的集合用 import 关键字导入一个完整的库时,就会获得一个”封装”(Package)例如: import java.util.*;2.冲突:过*导入了两个库,而且它们包括相同的名字,这时会出现什么情况呢?例如,假定一个程序使用了下述导入语句:import com.bruceeckel.util.*;import java.util.*;由于java.util.*也包含了一个Vector类,所以这会造成潜在的冲突。现在试着生成一个Vector,就肯定会发生冲突。如下所示:Vector v = new Vector();那么怎样才能不发生冲突呢?如下:java.util.Vector v = new java.util.Vector();第六章 类再生一、组合(composition)在新的类中产生现有类的对象(只是复用了现有程序代码的功能,而非它的形式)编译器并不是简单地为每一个引用都创建缺省对象,这一点是很有意义的,因为真要是那样做的话,就会在许多情况下增加不必要的负担。如果你想初始化这些引用,可以在代码中的下列位置进行:1、在定义对象的地方。这意味着它们总是能够在构造器被调用之前初始化。2、在类的构造器中。3、就在你确定需要使用这些对象之前。这种方式被称为“惰性初始化”。每一个非基本类型的对象都有一个toString(),而且编译器需要一个string而你却只有一个对象时,该方法就会被调用。二、继承(inheritance)按照现有类的类型来创建新类,无需改变旧有的类的形式,仅只是采用它的形式并在其中添加新代码。class 子类 extends 基类 子类自动得到基类中所有的数据成员和成员方法。当你创建一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象一样的。二者的区别在于,后者来自外部,而基类的子对象被包装在导出类对象内部。对基类子对象的正确初始化至关重要:Java会自动在导出类的构造器中插入对基类构造器的调用。构造过程是从基类“向外”扩散的,所以基类在导出类构造器可以访问它之前,就已经完成了初始化。三、带参数的构造器如果你的类没有缺省的参数,或者是你想调用一个带参数的基类构造器,你就必须用关键字super显示的编写调用基类构造器的语句,并且配以适当的参数列表。结合使用组合和继承确保正确清除名称屏蔽:如果Java的基类拥有某个已被多次重载的方法名称,那么载导出类中重新定义该方法名称,并不会屏蔽其在基类中的任何版本。组合与继承之间选择:组合技术通常用于你想要在新类中使用现有类的功能而非它的接口的情形,继承使用某个现有类,并开发一个它的特殊版本。受保护的(protected):对于任何继承于此类的导出类或其它任何位于同一个包内的类来说,可以进行访问。四、增量开发引入新代码而不会在现有代码中引发Bug。向上转型(upcasting):“为新的类提供方法”并不是继承技术中最重要的一个方面。其最重要的方面是它被用来表现新类和基类之间的关系。这种关系可以用“新类是现有类的一种类型”来加以概括。将子类的引用转换为父类的引用的动作称为“向上转型”。为什么要使用“向上转型”:由于向上转型是从一个较专用类型向较通用类型,所以总是安全的。五、再次探究组合于继承一个用以判断你到底是该用组合还是继承的最清晰的办法,就是问一问你自己是否需要从新类向基类向上转型。如果你必须向上转型,则继承是必要的,但如果你不需要,则你应该好好考虑是否需要继承。六、关键字final “这是无法改变的”。Final数据:一个即是static又是 final的域只占有一份不能改变的存储空间。对对象引用,final使引用恒定不变。空白final是指被声明为final但又未给定初值的数据成员使用前必须初始化。 Final方法(原因1把方法锁定,以预防任何继承类修改它的意义原因2是效率)Final类:不能有子类初始化及类的加载:知道类的第一个对象被构造时才发生加载,所有的 static 对象和代码都会在加载时依程序中的顺序依次初始化,只会初始化一次。继承与初始化:加载类时,有基类则不管你是否打算产生该基类的对象,都会加载基类。如果基类还有其自身的基类,那么第二个基类就会第七章 多形性一、上溯造型1.上溯造型的定义就是把子类当做父类处理的过程叫做上溯造型或者可以这样讲将一种类型(子类)对象引用的转换成另一种类型(父类)对象引用。2.动态绑定的定义用父类或接口指向子类或接口的实现类来提高代码的灵活性。对象在调用方法的时候能够自己判断改调用谁的方法。 在子类和父类里面有同名函数的时候,如果生成一个子类的对象,并在子类的对象里面调用这个函数,那么到底会是调用的是谁的函数呢?例如class Base int i=47; int f() return g(); intg() return i; class Dervied extends Base int i=27; intg() return i; public class test public static void main (String args) Derived d = new Derived(); /生成Derived的对象 System.out.println(d.f(); / d.f() = Derived.f(d); d.f()等价于对象d调用父类的f()函数,f()函数就会调用return g()这句话,这个时候是在调用谁的g()呢?这个时候需要动态绑定 Binding,所谓的动态绑定,通俗的就是指,对象在调用方法的时候能够自己判断改调用谁的方法是自己的方法还是父类的方法,到底怎样判断呢?我觉得不是很好的理解所以干脆也来个通俗的解释:即 就是调用当前对象的所在类的里面的方法: 如果从当前子类Dervied生成了对象d, 那么以后只要是是调用g()的时候,都会是调用子类Derived里面的g()函数而不会去调用 父类Base里面的g()函数二、抽象类和接口 类java.lang.Object类java.lang.Object处于java开发环境的类层次的根部,其它所有的类都是直接或间接地继承了此类。该类定义了一些最基本的状态和行为。下面,我们介绍一些常用的方法。equals() :比较两个对象(引用)是否相同。getClass():返回对象运行时所对应的类的表示,从而可得到相应的信息。toString():用来返回对象的字符串表示。finalize():用于在垃圾收集前清除对象。notify(),notifyAll(),wait():用于多线程处理中的同步。 1 抽象类java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下:abstract class abstractClass /抽象类abstract returnType abstractMethod(paramlist) /抽象方法抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。 若一个类继承了一个抽象类,则抽象类的抽象方法必须被实现,否则子类必须声明为abstract.2 接口接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面: 通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。 通过接口指明多个类需要实现的方法。 通过接口了解对象的交互界面,而无需了解对象所对应的类。1)接口的定义接口的定义包括接口声明和接口体。接口声明的格式如下:public interface interfaceNameextends listOfSuperInterface extends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。接口体包括常量定义和方法定义常量定义格式为:type NAME=value; 该常量被实现该接口的多个类共享; 具有public ,final, static的属性。在接口中只能声明常量,不可以声明变量。方法体定义格式为:(具有 public和abstract属性,不能声明为protected)returnType methodName(paramlist); 注意:在接口的实现类中,实现的接口方法必须声明为public ,因为接口中定义的方法为public(默认)。所以其实现必须声明为public.否则编译不会通过。2)接口的实现在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。3) 接口类型的使用接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。3.抽象类和接口的区别interface里面没有提供任何具体实现,可以说是一个极度抽象的类,他允许你创建一个能够被向上转型为不止一种基类型的类,以此来实现多重继承。 而抽象类则包含一种或多种抽象方法的类,且可以提供具体的实现。定义抽象类后,其它类可以对它进行扩充并且通过实现其中的抽象方法,使抽象类具体化。 Java中的接口和抽象类的区别,在于接口中没有属性,而且所有的方法都是抽象的,而抽象类可以有属性,而且可以有抽象方法,也可以有实现的方法。但两者都不能被实例化。 使用的时候,一个类可以继承多个接口,但只能继承一个抽象类三、内部类1 内部类的定义和使用内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员,也可以在一个语句块的内部定义,还可以在表达式内部匿名定义。内部类有如下特性: 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称.名字不能与包含它的类名相同。 可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。 可以定义为abstract。 可以声明为private或protected。 若被声明为static,就变成了顶层类,不能再使用局部变量。 若想在Inner Class中声明任何static成员,则该Inner Class必须声明为static。例:import java.awt.*;import java.awt.event.*;public class TwoListenInner private Frame f;private TextField tf;public static void main(String args) TwoListenInner that=new TwoListenInner();that.go(); public void go() f=new Frame(Two listeners example);f.add(North,new Label(Click and drag the mouse);tf=new TextField(30);f.add(South,tf);f.addMouseMotionListener(new MouseMotionHandler();f.addMouseListener(new MouseEventHandler();f.setSize(300,300);f.setVisible(true); public class MouseMotionHandler extends MouseMotionAdapter public void mouseDragged(MouseEvent e)String s=Mouse dragging:X=+e.getX()+Y=+e.getY();tf.setText(s);public class MouseEventHandler extends MouseAdapter public void mouseEntered(MouseEvent e)String s=The mouse entered;tf.setText(s);public void mouseExited(MouseEvent e)String s=The mouse left the building;tf.setText(s); 说明:Frame类的add方法来自于其祖先类Container类,addMouseMotionListener和addMouseListener方法来自于其祖先类Component, addMouseListener方法的参数为MouseListener接口,MouseAdapter类是实现了MouseListener接口的类。可见图形界面对于外部事件的响应是通过添加listener实现的2 内部类的优缺点内部类的第一个好处就体现出来了 隐藏你不想让别人知道的操作,也即封装性。 同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法,那就是利用其外部类的方法创建并返回。内部类的第二个好处一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!这是一个非常有用的特性,为我们在设计时提供了更多的思路和捷径。要想实现这个功能,内部类对象就必须有指向外部类对象的引用。Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用: 外部类.this 有了它,我们就不怕这种屏蔽的情况了静态内部类 和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。局部内部类 Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。 public class Goods1 public Destination dest(String s) class GDestination implements Destination private String label;private GDestination(String whereTo) label = whereTo;public String readLabel() return label; return new GDestination(s); public static void main(String args) Goods1 g= new Goods1();Destination d = g.dest(Beijing); 上面就是这样一个例子。在方法dest中我们定义了一个内部类,最后由这个方法返回这个内部类的对象。如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部,就可以这样做。当然,定义在方法中的内部类可以使设计多样化,用途绝不仅仅在这一点。匿名内部类java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的: new interfacename().; 或 new superclassname().; 下面接着前面继续举例子: public class Goods3 public Contents cont()return new Contents()private int i = 11;public int value() return i; ; 这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象,看上去的确十分简洁。 在java的事件处理的匿名适配器中,匿名内部类被大量的使用。例如在想关闭窗口时加上这样一句代码: frame.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0); ); 有一点需要注意的是,匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法: 如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。 将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。 在这个匿名内部类中使用初始化代码块。嵌套类意味着:1要创建嵌套类的对象,并不需要其外围类的对象。2不能从嵌套类的对象中访问非静态的外围类对象。嵌套类与普通的内部类还有一个区别。普通内部类的属性与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static属性,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。创建内部类的对象,必须使用此外围类的一个对象来创建其内部类的一个对象。在一个普通的(非静态)内部类中,通过一个特殊的this引用,可以链接到其外围类对象,嵌套类就没有特殊的this引用,这使得它类似于一个static方法。正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。要运行嵌套类,执行java 外部类$内部类 即可。你可以使用这个类来做测试,但是你不必在发布的产品种包含它,只需简单地在将产品打包前删除外部类$内部类.class。除非你已经有了外围类的一个对象,否则不可能生成内部类的对象。因为此内部类的对象会悄悄地链接到创建它的外围类的对象。如果你用的是嵌套类(静态的内部类

温馨提示

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

评论

0/150

提交评论