使用java实现面向对象编程 (2).doc_第1页
使用java实现面向对象编程 (2).doc_第2页
使用java实现面向对象编程 (2).doc_第3页
使用java实现面向对象编程 (2).doc_第4页
使用java实现面向对象编程 (2).doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

使用java实现面向对象编程第1章 、抽象和封装1.为什么使用面向对象1.面向对象就是采用“现实模拟”的方法设计和开发程序。面向对象技术利用“面向对象的思想”去描述“面向对象的世界”,实现了虚拟世界和现实世界的一致性,符合人们的思维习惯,使客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅,同时有代码重用性高、可靠性高等优点,大大提高了软件尤其是大型软件的设计和开发效率。2.面向过程和面向对象有什么区别?面向过程的核心是函数,以功能为中心,实现了函数级别的代码重用,面向对象的核心是封装了属性和方法(行为)的类,以数据为中心,实现了类级别的代码重用,面向对象因为采用了类,所以具有继承和多态特性,可以进一步重用代码和简化编程,而面向过程中没有继承和多态特性。2.使用面向对象进行程序设计1.面向对策设计的过程就是抽象的过程,分为3个步骤来完成。第一步:发现类(一般为名词)第二步:发现类的属性(一般为名词)第三步:发现类的方法(一般为动词)2.抽象时遵循的原则如下:属性、方法的设置是为了解决业务问题。关注主要属性、方法、如没有必要,勿增加额外的类、属性和方法。通过创建对象实现领养宠物功能3.创建对象的三种方式:1、使用new关键字。2、反射。3、克隆。4.面向对象中的两个核心概念:类(Class)和对象(Object)是面向对象中的两个核心概念。类是对某一类事物的描述,是抽象的、概念上的定义。对象是实际存在的、具体的事物个体。5.类主要有属性和行为组成:属性和行为又称为类的成员变量(或者成员属性)和成员方法,统称为类的成员(除此之外,类的成员还包括构造方法、代码块等)6.常量:用来存储不变的数据,常量在程序运行过程中不会发生变化,只能被引用,不能被重新赋值,也就是值能在定义是修改其值。Java中的常量用final关键字修饰,并且常量名通常都大写。为了方便调用,可以使用sstatic修饰,(推荐使用)。如:final String SEX_MALE=”Q仔”;final String SEX_FEMALE=”Q妹”;7.类名、属性名、方法名以及常量名的命名规范:v 类名由一个或几个单词组成,每个单词的第一个字母大写,如:Dog、StringBufferv 属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其它单词首字母大写。v 如health、stuName、println() 、getMessage()。v 构造方法名是唯一可以大写的,如Penguin()。v 常量名有一个或者几个单词组成,所有字母大写,如PISEX_MALE。常用的快捷键:封装:Alt+Shift+S,R无参构造方法:Alt+Shift+S,C有参构造方法:Alt+Shift+S,O3.构造方法及其重载1.构造方法的特点和主要作用:特点就是,方法名和类名相同,没有返回值。主要作用就是创建对象是执行一些初始化操作,如给成员变量赋初值。2.构造方法的重载:在同一个类中,方法名相同,参数列表不同。如下列,有参构造方法中的示例:在使用this调用自身的其它构造方法时,只能作为第一条语句。方法重载:如果同一个类中包含两个或两个以上的方法,它们的方法名相同,方法参数个数或参数类型不同,则称该方法被重载了,这个过程称为方法重载。方法重载的判断依据:v 必须在同一个类里。v 方法名相同。v 参数列表(方法参数的个数或参数类型)不同。v 与方法返回值和方法修饰符没有任何关系。无参构造方法:/* * 无参构造方法 * */public Penguin() /加上返回值void的构造方法不在是构造方法了而是与构造方法同名的成员方法name=男男;love=20;sex=Q妹;System.out.println(执行构造方法);有参构造方法:/* * 两个参数的构造方法 */ public Penguin(String name,String sex) =name; this.sex=sex; /* * 四个参数的构造方法 */ public Penguin(String name,int heath,int love,String sex) =name; this.heath=heath; this.love=love; this.sex=sex; 4.Static修饰符Static 可以用来修饰属性、方法和代码块。static修饰的变量属于这个类所有,即有这个类创建的所有对象共用同一个static变量。 属性方法使用Static修饰类属性(类变量)类方法不用static修饰实例属性(实例变量)示例方法1.结论:v 在加载类的过程中,完成静态变量的内存分配,在执行静态块,两者是在创建对象之前执行的。v 类属性、类方法可以通过类名和对象名访问,实例属性、实例方法只能通过对象名访问。v (静态方法中不能使用this和super关键字。)v 类方法只能访问类属性和其他类方法。v 在方法里不可以定义static变量,也就是说,类变量不能是局部变量。5.封装:封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法实现对隐藏信息的操作和访问。1.封装的具体步骤:修改属性的可见性来限制属性的访问;为每个属性创建一对赋值(getter)和取值(setter)方法,用于对这些属性的存取;在赋值方法中,加入属性的存取控制语句。2.封装的好处:隐藏类的实现细节;让使用着只能通过程序规定的方法来访问数据;可以方便地加入存取控制语句,限制不合理操作。修饰符的访问权限同类子类同包不同包private默认(Friendly)protectedpublic3.This关键字:This关键字是对一个对象的默认引用。在每个实例方法内部,都有一个this引用变量,指向调用这个方法的对象。This不能调用类变量和类方法,也不能调用局部变量。使用this调用成员变量,解决成员变量和局部变量的同名冲突。public Pet(String name)=name;/成员变量和局部变量同名,必须使用this使用this调用成员方法。public void play()health=health=n;this.print();/this可以省略,直接调用print();使用this调用重载的构造方法,只能在构造方法中使用,必须是构造方法的第一条语句。 public Penguin(String name,int heath,int love,String sex) super(name,sex);/调用重载的构造 this.heath=heath; this.love=love; 第2章 、继承1.继承(Inheritence)上一章中根据需求抽象出了Dog类和Penguin类,在这两个类中有许多相同的属性和方法,如Name、health和love属性及相关的getter方法,还有print()方法。这样设计的不足之处主要表现在两方面:一是代码重复;二是如果要修改,则两个类都要修改,如果涉及的类较多,修改量就很大,如果有效地解决这个问题呢?2. 其实我们只要把两个类中相同的属性和方法提取出来单独放在一个类里面,保留住特有的属性和方法;这就是需要继承了。2.语法:修饰符 Subclass extends Superclass/类定义部分通过extends关键字来实现,其中的Subclass称为子类,SuperClass称为父类、基类或超类。修饰父如果public,则该类在整个项目中可见;若无public修饰则该类只在当前包可见;不可以使用private和protected修饰类继承是面向对象的三大特性之一,是Java中实现代码重用的重要手段之一。Java中只支持单继承,即每个类只能有一个直父类。继承表达的是is a 的关系。或者说是一种特殊和一般的关系,如Dog is a Pet。在Java中,所有的Java类都直接或间接地继承Java.lang.Object类。Object类是Java类的祖先。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类。3.Java.lang.Object类的方法修饰符的访问权限本类子类同包其他private默认(Friendly)protectedpublic2.重写和继承关系中的构造方法1.子类重写父类方法1.在子类的构造方法执行前,必须先执行父类的构造方法。v 如果父类没有无参构造方法,子类必须指定调用其他构造方法v 默认总是调用父类的无参构造方法。v 所以,如果父类没有提供无参构造方法,那么程序员必须手动的根据需要在代码中显式调用父类的某个带参的构造方法。(调用必须写在第一句)2.方法的重写在子类中可以根据需求对从父类的方法进行重新编写,称为方法的重写或方法的覆盖(overriding)。方法重写必须满足的要求:重写方法和被重写方法必须具有相同的方法名。重写方法和重写方法必须具有相同的参数列表。重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。重写方法不能缩小被重写方法的访问权限。3.重载和重写的区别和联系:重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。重写涉及的是子类和父类之间的同名方法,要求方法名相、参数列表相同、返回值类型相同(或是其子类)、访问修饰符不能严于父类。4.Super的使用super代表对当前对象的直接父类的默认引用。在子类中可以通过super关键字访问父类的成员。Super必须出现在子类(子类的方法和构造方法)中,而不是其他位置。可以访问父类的成员,如父类的属性、方法、构造方法。注意访问权限的限制,如无法通过super访问private成员。例如,在Dog类中可以通过如下语句来访问父类成员(以下父类成员和构造方法都不是private权限)。S;/访问直接父类的name属性Super/print();/访问直接父类的print()方法Super(name);/访问直接父类的对应构造方法,只能出现在构造方法中3.继承关系中的构造方法1.继承条件下构造方法的调用规则。v 如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认调用父类的无参构造方法。在这种情况下,有没有”super()”;语句,效果都是一样的。v 如果子类的构造方法中通过super显示调用父类的有参构造方法,则在相应构造方法中应用以上两条规则。v 特别注意的是,如果存在多级关系,则在创建一个子类对像时,以上规则会多次向更高一级父类应用,一直执行顶级父类Object类的无参构造方法为止。v 在构造方法中付过有this语句或super语句出现,则只能是第一条语句。v 在一个构造方法中不允许同时出现使用this和super语句调用构造方法(否则就有两条第一条语句)。v 在类的方法中不允许出现this或super关键字。v 在示例方法中,this和super语句不要求是第一条语句,可以共存。2. 继承关系中构造方法的执行顺序4.抽象类1.抽象类和抽象方法的特点(1) 抽象类和抽象分都通过abstract关键字来修饰。(2) 抽象类不能实例化。抽象类中可以没有、有一个或者多个抽象方法,甚至全部都可以是抽象方法。(3) 抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重新所有抽象方法才能实例化,否则子类还是一个抽象类。抽象类:public abstract class Pet /抽象方法/属性问题:抽象类可有构造方法吗?解答:抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是有private修饰,也可以被本类的子类中类构造方法调用。5.Final 修饰符1.Final 的应用(1)、用final 修饰类,不能再被继承,如以下代码所示。Final class penguinClass SubPenguin extends Penguin/此行出现错误(2)、用final修饰符的方法不能被子类重写,如:Class penguinPublic final void print()提示错误:The type SubPenguin cannot subclass the final class,即Penguin类不能被继承。Class SubPenguin extends PenguinPublic void print()/此行出现错误提示错误:cannot override the final method from Penguin ,即print()方法不能被子类重写。(3)、用final修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次,如:Public class penguinFinal String home=”南极”;/居住地Public void setHome(String name)This.home=home;/错误,home不可以再次赋值提示错误:The final filed Penguin.home cannot be assigned,即不可以再次赋值。2.final和abstract的区别v final 和abstract是功能相反的两个关键字,可以对比记忆。v abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。Final可以用来修饰类、方法和属性,不能修饰构造方法。v Java 提供的很多类都是final类,如String 类、Math类,它们不能再有子类。Object类中一些方法,如getClass()、notify()、wait()都是final方法,只能被继承而不能被重写,但是hashCode()、toString()、equals(Object obj)不是final方法,可以重写。使用final修饰引用型变量时,变量的值时固定不变的,而变量所指向的对象属性值时可变的。(2)abstract是否可以和private、static、final共用?(1) abstract不能和private同时修饰一个方法。(2) abstract不能和static同时修饰一个方法。(3) abstract不能和final同时修饰一个方法或类。第3章 、多态1.什么是多态多态(polymorphism)是具有多种形态的能力的特征。(同一个实现接口,使用不同的实例执行不同的操作。)(其核心是重写,核心机制是动态绑定)子类到父类的转型(向上转型)在引用数据类型的子类和父类之间也存在着转换问题,Dog dog=new Dog(“欧欧”,”雪丽娜”);/不涉及类型转换Dog.eat();Pet pet=new Dog(“欧欧”,”雪丽娜”);/子类到父类的转换 Pet.eat();/会调用dog类重写eat()方法,而不是Pet类的eat()方法Pet.catchingFlyDisc();/编译错误,父类的引用无法调用类特有的方法v 将一个父类的引用指向一个子类对象,称为向上转型(upcasting),自动进行类型转换。v 此时通过父类引用变量调用的方法是子类覆盖或继承的方法,不是父类的方法。v 此时通过父类引用变量无法调用子类特有的方法。2.使用父类作为方法形参实现多态是Java中实现和使用多态的主要方法之一。/* * 主人给Dog喂食 */public void feed (Dog dog)dog.eat();/* * 主人给Penguin喂食 */public void feed(Penguin pgn)pgn.eat();多态的明显优势:可以减少代码量,提高代码的可扩展性和可维护性。3.使用父类作为方法返回值实现多态是Java中实现和使用多态的另一种方式。public class Master private String name =;/主人名字private int money=0;/元宝数public Master(String name ,int money)=name;this.money=money; public void feed(Pet pet)pet.eat();public Pet getPet(int typeId)Pet pet=null;if(typeId=1)pet=new Dog(欧欧,雪娜瑞);else if(typeId=2)pet=new Penguin(楠楠,Q妹);return pet;1.总结:v 继承的存在(继承是多态的基础,没有继承就没有多态)。v 子类重写父类的方法(多态下调用子类重写后的方法)。v 父类引用变量指向子类对象(子类到父类的类型转换)。4.父类到子类的转换(向下转型)父类到子的转换。同时,会使用instanceof运算符来判断对象的类型。将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换。调用不同的宠物子类对象的特有方法,在预编译阶段,虚拟机对引用采用静态绑定,没有办法动态获取到子类中特有的方法。public class Test / public static void main(String args) Pet pet =new Dog(欧欧,雪娜瑞);/Pet pet=new Penguin(楠楠,Q妹);pet.eat();/pet.catchingFlyDisc();/编译错误,无法调用子类特有的方法if(pet instanceof Dog)Dog dog=(Dog) pet;/强制类型转换成狗对象dog.catchingFlyDisc();/调用狗狗玩飞盘else if(pet instanceof Penguin)Penguin pgn=(Penguin)pet;/强制类型转换成企鹅对象pgn.swimming();/调用企鹅游泳1.将出现ClassCastException异常。基本数据类型之间进行强制性转换是对把=被强制转换类型”做手术”,如:Doublie dl=5:/对5”做手术”,变成5.0Int a =(int )3.14;/岁3.14做手术,变成3引用类型之间强制转换时是还原类的真正面目,而不是给子类“做手术”。Pet pet=new Dog(“欧欧”,”雪娜瑞”);Dog dog =(Dog)pet;/正确!还原子类的真实面目Penguin pgn =(Penguin)pet;/出现异常!给子类“做手术”5.Instanceof运算符1.语法:对象 instanceof 类或接口该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或者false。在强制类型转换之间通过instanceof运算符检查对象的真实类型,在进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。Pet pet =new Dog(欧欧,雪娜瑞);/Pet pet=new Penguin(楠楠,Q妹);pet.eat();/pet.catchingFlyDisc();/编译错误,无法调用子类特有的方法if(pet instanceof Dog)Dog dog=(Dog) pet;/强制类型转换成狗对象dog.catchingFlyDisc();/调用狗狗玩飞盘else if(pet instanceof Penguin)Penguin pgn=(Penguin)pet;/强制类型转换成企鹅对象pgn.swimming();/调用企鹅游泳v 使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指的类或接口在继承树上有上下级关系,否则会出现编译错误。例如,pet instanceof String 会出现编译错误。v Instanceof 通常和强制类型转换结合使用。第4章 、接口为什么需要接口第一,继承中必须符合is a 的关系;第二,Java只支持单继承。什么是接口接口是一种规范和标准,它们可以约束类的行为,是一些方法特征的集合,但是没有方法的实现。(接口可以看作是一种特殊的“抽象类”)抽象类利于代码复用,接口利于代码的扩展和维护。语法:修饰符 interface 接口名 父接口1:父接口2,./常量定义/方法定义实现语法:Class 类名 extends 父类名 implements 接口1,接口2,.类成员v 接口的命名规则与类相同。如果修饰符是public ,则该接口在整个项目总可见;如果省略修饰符,则该接口值在当前包可见。v 接口中可以定义常量,不能定义常量。接口中的属性都会自动用public static final修饰,v 即接口中的属性都是全局静态常量。接口中的常量必须在定义是指定初始值。Public static final int PI=3.14;Int PI=3.14;/在接口中,这两个定义语句效果完全相同Int PI;/错误!在接口中必须指定初始值,在类中会默认有默认值v 接口中所有方法都是抽象方法。接口中都会自动用public abstract 修饰,即接口中只有全局抽象方法。v 和抽象类一样,接口也不能实例化,接口中不能有构造方法。v 接口之间通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。v 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。v 一个类只能有一个直接父类,但可以通过implements实现接口。当类在继承父类的同时又实现多个接口时,extends关键字必须位于implements关键字之前。特性:1. 接口不可以实例化2. 实现类必须实现接口的所有方法。3. 实现类可以实现多个接口4. 接口中的变量都是静态常量。接口的概念相当于现实世界中的规范或者契约。接口表示一种能力一个类实现了某个接口,就表示这个类具备了某种能力。有些接口只有方法名称,接口比抽象类更好的特性1. 可以多继承2. 设计和实现完全分离,3. 更自然的使用多态4. 更容易搭建程序框架5. 更容易更换实现接口表示一种约定在面向对象编程中提倡面向接口编程,而不是面向实现编程。接口体现了约定和实现分离的原则,通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。面向接口就意味着:开发系统是,主体构架使用接口,接口构成系统的骨架,这样就可以通过更换接口的类来实现更换系统。经验:面向接口编程可以实现接口和实现的分离,这样做最大的好处就是能够在客户端未知的情况下修改实现代码。那么怎样抽象出接口呢?一种是用在层和层之间的调用。层和层之间最忌讳耦合度过高或修改过于频繁。设计优秀的接口能够解决这个问题。另一种使用在那些不稳定的部分上,如果某些需求的变化性很大,那么定义接口也是一种解决方法。设计良好的接口就像日常使用的万能插座,不论插头如何变化,都可以使用。最后强调一点,良好的接口定义来自于需求的,它绝对不是程序员绞尽脑汁想出来的。第5章 、项目案例:QuickHit第6章 、异常异常就是在程序的运行过程中所发生的不正常的事件。异常处理异常处理机制就像我们对平时可能遇到的意外情况,预先想好了一些处理办法。也就是说,在程序执行代码的时候,万一遇到了异常,程序会按照预定的处理办法对异常进行处理,异常处理完毕后,程序会继续运行。Java异常处理是通过5个关键字来实现的:try、catch、finally、throw和throws。Try-catch块v 如果try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略。v 如果try语句块在执行过程中遇到异常,并且这个异常与catch中申明的异常类型相匹配,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行。v 在catch块中可以加入用户自定义处理信息,也可以调用异常对象的方法输出异常信息,常用的方法主要有以下两种。n Void printStackTrace(); 输出异常堆栈信息。堆栈信息包括程序运行到当前类的执行流程,它将输出从方法调用处到异常抛出的方法调用序列,n String getMessage();返回异常信息描述字符串。该字符串描述异常产生的原因,是print输出信息的一部分。如果try块在执行过程中遇到异常,那么在try块中其余剩下的代码都将会被忽略,系统自动生成相应的异常对象,包括异常的类型、异常出现时程序的运行状态及对该异常的详细描述。如果这个异常对象与catch中申明的异常类型相匹配,会把该异常对象赋给catch后面的异常参数,相应的catch块将会被执行。常见异常类型异常说明Exception异常层次结构的根类ArithmeticException算术错误情形,如以零作除数ArrayIndexOutOfBoundsException数组下标越界NullPointerException尝试访问null对象成员ClassNotFoundException不能加载所需的类InputMismatchException欲得到的数据类型与实际输入的类型不匹配IllegalArgumentException方法接收到非法参数ClassCastException对象强制类型转换出错NumberFormatException数字格式转换异常,如果“abc”转换成数字Try-catch-finally块v 如果try块中所有语句正常执行完毕,那么finally块就会被执行。v 如果try语句块在执行过程中碰到异常,无论这种异常能否被catch块捕获到、都将执行finally块中的代码。v Try-catch-finally结构中try 块是必需的,catch和finally块为可选,但两者至少须出现其中之一。v 需要特别注意的是,即使在try 块和catch块中存在return语句,finally块中语句也会被执行。v 发生异常时的顺序:执行try块或catch中return之前的语句,先执行finally块中的语句,在执行try块catch中return语句退出。v Finally块中语句不被执行的唯一情况:在异常处理代码中执行System.exit(1),将退出java虚拟机。多重catch运行时,系统从上到下分别对每个catch语句块处理的异常类型进行检查,并执行第一个与异常类型匹配的catch语句。执行其中的一catch语句之后,其后的catch语句 都将被忽略。但是排列顺序必须是从子类到父类,最后一个一般都是Exception类。因为所有异常子类都继承自Exception类,所以如果将父类异常放到前面,那么所有的异常都被捕获,后面的catch块汇总的子类异常将得不到被执行的机会。public class Test4 private static Logger logger=Logger.getLogger(Test4.class.getName();public static void main(String args) / TODO Auto-generated method stubtry Scanner in = new Scanner(System.in);System.out.print(请输入被除数:);int num1 = in.nextInt();(输入被除数:+num1);System.out.print(请输入除数:);int num2 = in.nextInt();(输入除数:+num2);System.out.println(String.format(%d/%d=%d, num1, num2, num1/ num2);/ 格式化输出(输出结果:+String.format(%d/%d=%d, num1, num2, num1/ num2);catch (InputMismatchException e) logger.error(输入了非整数+e); catch (ArithmeticException e) logger.warn(除数不能为零+e); catch (Exception e) finally System.out.println(感谢使用本程序!);声明异常throwsJava语句中通过关键字throws声明某个方法可能抛出的各种异常。throws可以同时声明多个异常,之间用逗号隔开。通过try-catch捕获并处理异常。通过throws继续声明异常。如果调用者不打算处理异常,可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将有java虚拟机来处理。public class Test public static void foo(int i) throws Exception /声明异常try if(i=1)throw new Exception(); catch (NullPointerException e) System.out.println(2);finallySystem.out.println(3);System.out.println(4);抛出异常throw在java语言中,可以使用throw关键字来自行抛出异常。(代表一种设计意图)public class Person private String name=;/姓名private int age =0;/年龄/* * 年龄限制 * param age * throws Exception */public void setAge(int age) throws Exception if(age0&ageerrorwarninfodebug2. 日志输出目的地Appender log4j.rootLogger=info,stdout,logfileStdout、logfile指的是输出目的地的名字。最常用的Appender有以下两种。ConsoleAppender:输出日志事件到控制。通过Target属性配置输出到System.out或者System.err,默认的目标是System.out.FileAppender:输出日志事件到一个文件。通过File属性配置文件的路径及名称。3. 日志布局类型LayoutAppender必须使用一个与之相关联的布局类型Layout,用来指定它的输出样式。HTMLLayout:格式化日志输出为HTML表格。SimpleLayout:以一种非常简单的方式格式化日志输出,它输出级别Level,然后跟着一个波折号“”,最后是日志消息。PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多样的输出格式。4. 转换模式ConversationPattern%d:用来设置输出日志的日期和时间,默认格式为ISO8601,也可以在其后指定器格式。%m:用来输出代码中指定的消息。%n:用来输出一个回车换行符。%l:用来输出日志事件的发生位置,包括类名,发生的线程,以及在代码中的行数。%p:用来输出优先级,%F:用来输出文件名。%M:用来输出方法名。#设置Logger输出级别和输出目的地#把日志信息输出到文件#log4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=jbit.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p %F %M %m %n第七章、集合框架 1.集合框架概述引入集合框架(安全、高效、方便统一)集合只能存对象,不能存基本数据类型。集合框架包含的内容集合框架都包含三大块内容:对外接口、接口的实现对集合运算的算法。接口:表示集合的抽象数据类型,如:Collection、List、Set、Map、Iterator。实现:集合框架中接口的具体实现,如:ArrayList、LinkedList、HashMap、HashSet。算法:在一个实现了某个集合框架的接口的对象身上完成某种有用的计算的方法,如查找、排序等。Java提供了进行集合操作的工具类Collections,她提供了对集合进行操作排序的等多种算法和实现类。Java集合框架中的两大接口:Collection和Map,其中Collection又有两个子接口:List和Set。所说的java集合框架共有3大接口:List、Set、Map。它们的共同点:都是集合接口,都可以用来存储很多对象。Collection接口存储一组唯一(允许重复)、无序的对象。Set接口继承Collection接口,存储一组唯一(不允许重复)、无序对象。List接口继承Collection接口,存储一组不为一(允许重复)、有序(以元素插入的次数来放置元素,不会重新排序)的对象。Map接口存储一组成对的键值对象,提供key(键)到value(值)的映射。Map中的key不要求有序,不允许重复。Value同样不要求有序,但允许重复。Iterator接口是负责定义访问和遍历元素的接口。01234AaaaDdddCcccEeeeDdddList集合示意图List接口实现List接口的常用类有ArrayList和LinkedList。它们都可以容纳所有类型的对象,包括null,允许重复,并且都保证元素的存储顺序。ArrayList对数组进行了封装,实现了长度可变的数组。ArrayList存储数据的方式和数组相同,都是在内存中分配连续的空间,它的优点在于遍历元素和随机访问元素的效率比较高。删除和新增的效率较低。01234AaaaDdddCcccEeeeDdddArrayList存储方式示意图LinkedList采用链存储方式,优点在于插入、删除元素时的效率比较高。它提供了额外的addFirst()、addLast()、removeFirst()和removeLast()等方法,可以LinkedList的首尾进行插入或删除操作。这些方法使得LinkedList可被用作堆(stack)或者队列(queue)。LinkedList存储方式:在两端记录下上一个元素和下一个元素的地址2.ArrayList集合类import java.util.ArrayList;import java.util.Iterator;import java.util.List;/* * 测试Arrylist的add()、size()、get()方法 * author Administrator */public

温馨提示

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

最新文档

评论

0/150

提交评论