Java语言教学课件:06-面向对象(下)_第1页
Java语言教学课件:06-面向对象(下)_第2页
Java语言教学课件:06-面向对象(下)_第3页
Java语言教学课件:06-面向对象(下)_第4页
Java语言教学课件:06-面向对象(下)_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

1、06.面向对象(下)本章要点包装类equals、toString方法static、finally关键字abstract关键字和抽象类接口的定义与作用内部类的作用枚举类JAR包基本数据类型的包装类八大数据类型的包装类分别为:Byte、Short、Integer、Long、Character、 Float、Double、Boolean。把基本数据类型变量包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个包装类中除了Character之外,还可以通过传入一个字符串参数来构建包装类对象。如果希望获得包装类对象中包装的基本类型变量,则可以使用包装类提供的XxxValue()实例方法。自动装箱与自

2、动拆箱JDk还提供了自动装箱和自动拆箱。自动装箱就是把一个基本类型的变量直接赋给对应的包装类变量,自动拆箱则与之相反。包装类还可以实现基本类型变量和字符串之间的转换,除了Character之外的所有包装类都提供了一个parseXxx(String s)静态方法。如果将基本类型转换为这符串,只需在后面加+ “”进行连接运算。Java 7对包装类的增强Java 7为所有包装类增加一个新方法: compare(x , y)的方法。该方法用于比较两个包装类实例,当xy,返回大于0的数;当x=y,返回0;否则返回小于0的数。对象的方法打印对象和toString方法:toString方法是系统将会输出该对

3、象的“自我描述”信息,用以告诉外界对象具有的状态信息。Object 类提供的toString方法总是返回该对象实现类的类名 + +hashCode值。=和equals比较运算符:=要求两个引用变量指向同一个对象才会返回true。equals方法则允许用户提供自定义的相等规则。Object类提供的equals方法判断两个对象相等的标准与=完全相同。因此开发者通常需要重写equals方法。类成员在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属于类成员,类Field既可通过类来访问,也可以通过类的对 象来访问。当通过对象来访问类

4、属性时,系统会在底层转换为通过该类来访问类 属性。类成员规则类成员并不是属于实例,它是属于类本身的。只要类存在,类成员就存在。即使通过null对象来访问类成员,程序也不会引发NullPointerException。类成员不能访问实例成员。单例类如果一个类始终只能创建一个对象,称为单例类。须符合以下几个条件:1.我们把该类的构造器使用Private修饰,从而把该 类的所有构造器隐藏起来。2.则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰3.该类还必须缓存已经创建的对象,必须用static修饰final变量final修饰变量时,表示该变量一旦获得

5、初始值之后就不可被改变。final既可修饰成员变量,也可以修饰局部变量。final修饰成员变量成员变量是随类的初始化或对象初始化而初始化的。final修饰的成员变量必须由程序员指定初始值。对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。对于实例属性,要么在普通初始化块中指定初始值。要么在定义时、或构造器中指定初始值。final修饰局部变量使用final修饰局部变量时既可以在定义时指定默认值,也可以不指定默认值。给局部变量赋初始值,只能一次,不能重复。final修饰基本类型和引用类型当使用final修饰基本数据类型变时,不能对其重新赋值,不能被改变。但对引用类型的变量而言,它

6、仅仅保存的是一个引用,final只能保证他的地址不变,但不能保证对象,所以引用类型完全可以改变他的对象。可执行“宏替换”的final变量 对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足3个条件,这个final变量就不再是一个变量,而是相当于一个直接量。使用final修饰符修饰;在定义该final变量时指定了初始值;该初始值可以在编译时就被确定下来。final方法final 修饰的方法不可以被重写。final 修饰的方法仅仅是不能重写,但它完全可以被重载。final 类final 修饰的类不可以被继承不可变的类不可变的类要满足以下几个条件:1.使用private

7、和final修饰符来修饰该类的属性2.提供带参数的构造器,用于根据传入参数来初始化类里的属性3.仅为该类的属性提供getter方法,不要为该类的属性提供setter方法,因为普通方法无法修改final修饰的属性4.如有必要,重写Object类中hashCode 和equals缓存实例的不可变类:如果程序经常需要使用不可变类的实例,则可对实例进行缓存。抽象方法和抽象类抽象方法和类都必须使用abstract来修饰,有抽象方法的类只能定义成抽象类,抽象里也可以没有抽象方法。 抽象类不能被实例化,可以通过其子类给他赋值,普通类里有的抽象里也有,定义抽象方法只需在普通方法上增加abstract修饰符,并

8、把普通方法的方法体(也就是方法后花括号括起来的部分)全部去掉,并在方法后增加分号即可。抽象类的特征抽象类的特征:有得有失,得到了新能力,可以拥有抽象方法;失去了创建对象的能力。抽象类的作用抽象类代表了一种未完成的类设计,它体现的是一种模板。抽象类与模板模式。接口的概念接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用的方法。接口体现了规范与实现分离的设计。接口的定义和类定义不同,定义接口不再用class关键字,而是使用interface关键字。语法如下:修饰符 interface接口名 extends 父接口1,父接口2 .零个到多个常量定义.零个

9、到多个抽象方法定义.零个到多个内部类、接口、枚举定义.零个到多个默认方法或类方法定义.接口里的成分在定义接口时,接口里可以包含成员变量(只能是常量),方法(只能是抽象实例方法、类方法或默认方法),内部类(包括内部接口、枚举类常量都是:public static final修饰方法都是:public abstract 修饰内部的类:public static接口的继承接口的继承和类继承不一样,接口完全支持多继承,子接口扩展某个父接口将会获得父接口的所有抽像方法,常量属性,内部类和枚举类定义。使用接口接口可以用于声明引用类型的变量,但接口不能用于创建实例。当使用接口来声明引用类型的变量时,这个引用

10、类型的变量必须引用到其实现类的对象。一个类可以实现一个或多个接口,继承使用extends关键字,实现接口则使用implements关键字。实现接口一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法);否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类。 接口和抽象类的相似性接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。接口与抽象类的区别接口里只能包含抽象方法,不同包含已经提供实现的方法;抽象类则完全可以包含普

11、通方法。接口里不能定义静态方法;抽象类里可以定义静态方法。接口里只能定义静态常量属性,不能定义普通属性;抽象类里则既可以定义普通属性,也可以定义静态常量属性。接口不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而让其子类调用这些构造器来完成属于抽象类的初始化操作。接口里不能包含初始化块,但抽象类则完全可以包含初始化块。一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。面向接口编程接口体现了规范与实现分离的原则。充分利用接口可以很好地提高系统的可扩展性和可维护性。接口与简单工厂模式、命令模式等。内部类我

12、们把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,有的也叫嵌套类,包含内部类的类也被称为外部类有的也叫宿住类。内部类提供了更好的封装,内部类成员可以直接访问外部类的私有数据,因为内部类被当成其他外部类成员。匿名内部类适合用于创建那些仅需要一次使用的类。非静态内部类定义内部类非常简单,只要把一个类放在另一个类内部定义即可。当在非静态内部类的方法内访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,如果存在该名字的局部变量,就使用该变量,如果不存在,则到该方法所在的内部类中查找是否存在该名字的属性,如果存在则使用该属性。总之,第一步先找局部变量,第二步,内部类的

13、属性,第三步。外部类的属性。静态内部类 如果用static修饰一个内部类,称为静态内部类。静态内部类可以包含静态成员,也可以包含非静态成员。所以静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。静态内部类的对象寄存在外部类里,非静态内部类的对象寄存在外部类实例里使用内部类1.在外部类内部使用内部类不要在外部类的静态成员中使用非静态内部类,国为静态成员不能访问非静态成员。 2.在外部类以外使用非静态内部类。private 修饰的内部类只能在外部类内部使用。在外部类以外的地方使用内部类,内部类完整的类名应该OuterClass.InnerClass.在外部类以外的地方使用非静态内部类创建

14、对象的语法如下:OuterInstance.new InnerConstructor()在外部类以外的地方使用静态内部类创建对象的语法如下:new OuterClass.InnerConstructer();局部内部类如果把一个内部类放在方法里定义,这就是局部内部类,仅仅在这个方法里有效。局部内部类不能在外部类以外的地方使用,那么局部内部类也不能使用访部控制符和static修饰匿名内部类匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下:new 父类构造器(实例列表) |实现接口) /匿名内部类的 类体部分匿名内部类不能是抽象类,匿名内部类不能定义构造器。Lambda表达式

15、入门Lambda表达式主要作用就是代替匿名内部类的繁琐语法。它由三部分组成:形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。箭头(-),必须通过英文等号和大于符号组成。代码块。如果代码块只有包含一条语句,Lambda表达式允许省略代码块的花括号,如果省略了代码块的花括号,这条语句不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。Lambda表达式与函数式接口 如果采用匿名内部

16、类语法来创建函数式接口的实例,只要实现一个抽象方法即可,在这种情况下即可采用Lambda表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口。Lambda表达式有如下两个限制:Lambda表达式的目标类型必须是明确的函数式接口。Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口(函数式接口)创建对象。 为了保证Lambda表达式的目标类型是一个明确的函数式接口,可以有如下三种常见方式:将Lambda表达式赋值给函数式接口类型的变量。将Lambda表达式作为函数式接口类型的参数传给某个方法。使用函数式接口对Lambd

17、a表达式进行强制类型转换。方法引用与构造器引用 种类示例说明对应的Lambda表达式引用类方法类名:类方法函数式接口中被实现方法的全部参数传给该类方法作为参数。(a,b,.) - 类名.类方法(a,b, .)引用特定对象的实例方法特定对象:实例方法函数式接口中被实现方法的全部参数传给该方法作为参数。(a,b, .) - 特定对象.实例方法(a,b, .)引用某类对象的实例方法类名:实例方法函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数。(a,b, .) -a.实例方法(b, .)引用构造器类名:new函数式接口中被实现方法的全部参数传给该构造器作为参数。(a,b

18、, .) -new 类名(a,b, .)Lambda表达式与匿名内部类 Lambda表达式与匿名内部类存在如下相同点:Lambda表达式与匿名内部类一样,都可以直接访问“effectively final”的局部变量,以及外部类的成员变量(包括实例变量和类变量)。Lambda表达式创建的对象与匿名内部类生成的对象一样, 都可以直接调用从接口继承得到的默认方法。 Lambda表达式与匿名内部类主要存在如下区别:匿名内部类可以为任意接口创建实例不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可。但Lambda表达式只能为函数式接口创建实例。匿名内部类可以为抽象类、甚至普通类创建实例,

19、但Lambda表达式只能为函数式接口创建实例。匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;但Lambda表达式的代码块不允许调用接口中定义的默认方法。 手动实现枚举类可以采用如下设计方式: 通过private将构造器隐藏起来。把这个类的所有可能实例都使用public static final属性来保存。如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配实例。JDK 5新增的枚举支持J2SE1.5新增了一个enum关键字,用以定义枚举类。正如前面看到,枚举类是一种特殊的类,它一样可以有自己的方法和属性,可以实现一个或者多个接口,也可以定义自己的构造器。一个

20、Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。枚举类枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang. Comparable两个接口。枚举类的构造器只能使用private访问控制符,如果省略了其构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远

21、都不能产生实例。列出这些实例时系统会自动添加public static final修饰,无需程序员显式添加。所有枚举类都提供了一个values方法,该方法可以很方便地遍历所有的枚举值。 枚举类的属性、方法和构造器 枚举类也是一种类,只是它是一种比较特殊的类,因此它一样可以使用属性和方法。枚举类通常应该设计成不可变类,也就说它的属性值不应该允许改变,这样会更安全,而且代码更加简洁。为此,我们应该将枚举类的属性都使用private final修饰。一旦为枚举类显式定义了带参数的构造器,则列出枚举值时也必须对应地传入参数。 实现接口的枚举类枚举类也可以实现一个或多个接口。与普通类实现一个或多个接口完

22、全一样,枚举类实现一个或多个接口时,也需要实现该接口所包含的方法。 如果需要每个枚举值在调用同一个方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的实现方式,从而让不同枚举值调用同一个方法时具有不同的行为方式。 包含抽象方法的枚举类可以在枚举类里定义一个抽象方法,然后把这个抽象方法交给各枚举值去实现即可。枚举类里定义抽象方法时无需显式使用abstract关键字将枚举类定义成抽象类,但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误。垃圾回收机制垃圾回收机制只负责回收堆内存中对象,不会回收任何任何物理资

23、源(例如数据库连接,网络IO等资源)。程序无法精确控制垃圾回收的运行,垃圾回收会在合适时候进行垃圾回收。当对象永久性地失去引用后,系统就会在合适时候回收它所占的内存。垃圾回收机制回收任何对象之前,总会先调用它的finalize方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收对象在内存中的状态 激活状态:当一个对象被创建后,有一个以上的引用变量引用它。则这个对象在程序中处于激活状态,程序可通过引用变量来调用该对象的属性和方法。去活状态:如果程序中某个对象不再有任何引用变量引用它,它就进入了去活状态。在这个状态下,系统的垃圾回收机制准备回收该对象所占用

24、的内存,在回收该对象之前,系统会调用所有去活状态对象的finalize方法进行资源清理,如果系统在调用finalize方法重新让一个引用变量引用该对象,则这个对象会再次变为激活状态;否则该对象将进入死亡状态。死亡状态:当对象与所有引用变量的关联都被切断,且系统会调用所有对象的finalize方法依然没有使该对象变成激活状态,那这个对象将永久性地失去引用,最后变成死亡状态。只有当一个对象处于死亡状态时,系统才会真正回收该对象所占有的资源。 强制垃圾回收 强制系统垃圾回收有如下两个方法:调用System类的gc()静态方法:System.gc()调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()finalize方法 finalize方法有如下四个特点:永远不要主动调用某个对象的finalize方法,该方法应交给垃圾回收机制调用。finalize方法的何时被调用,是否被调用具有不确定性。不要把finalize方法当成一定会被执行的方法。当JVM执行去活对象

温馨提示

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

评论

0/150

提交评论