JavaOO-08.面向对象高级特性.ppt
《JavaOO-08.面向对象高级特性.ppt》由会员分享,可在线阅读,更多相关《JavaOO-08.面向对象高级特性.ppt(61页珍藏版)》请在三一办公上搜索。
1、第八章,面向对象高级特性,本章要点,static的含义继承的规则子类实例化的过程方法的覆盖final关键字抽象类的特性接口的规范数据类型的转换包和访问权限修饰符包装类和内部类,静态修饰符static,static可以修饰的元素 属性 共享;分配在静态存储区,而不是分配在堆内存中。静态属性描述了该类的所有对象的共同特征,而非静态属性描述的是每个对象独有的特征,静态属性可以不用实例化,可以直接访问。因为访问的都是同一块内存,所以变量的值是一样的。静态属性在该类第一次被加载到JVM时,分配了静态存储区,以后每次运行不再分配空间,仍然使用以前的空间。直到JVM停止之前,静态存储区的变量一直存在,不会失
2、效。方法 访问的方式块 执行的时机只能修饰类成员,不能修饰局部变量。需要注意的问题:静态方法可以直接访问静态变量,如要访问非静态变量必须先实例化。静态方法中不能this。静态方法不能被非静态方法覆盖。,静态属性,所有对象共享也称为类变量两种方式访问:类名.属性;对象名.属性;,0 x8000,0 x3000,200,Circle p,0 x3000,radius,100,radius,Circle q,0 x8000,3.14,pi,静态存储区,静态方法,不需要实例化,可以直接访问;也称为类方法因为该方法对于类的所有对象来说已经是共享的了。两种方式访问:直接访问:类名.方法名();实例化后访问
3、:对象名.方法名();作用:简化方法的使用;比如Math类中的所有方法都是静态的。便于访问静态属性;常提供静态方法访问静态属性。限制:静态方法只能直接访问静态成员(静态属性、静态方法)。因为静态方法在实例化之前就可以被类调用,而此时非静态成员还不存在。静态方法中不能用this;静态方法不能被非静态方法覆盖;,特殊的静态方法main,在类中有一个我们经常使用的静态方法main(),它是程序执行的入口。一般来说,在一个项目中应该有一个类提供了main函数,整个项目从这个main方法开始运行。该方法的格式是固定的,除了括号中的形参名称可以改变,别的都不能改变必须public权限修饰符:保证在任何位置
4、都可以访问它。必须static静态修饰符:无需实例化,可以直接调用。必须返回空值void:main方法仅是程序的启动没必要返回任何值。main函数名不可改变:固定的,注意大小写。String args命令行参数:从程序外部传入的参数。那么,请思考:主函数会被谁调用呢?,主函数main(),一般运行一段程序都是通过Java解释器的。D:javac Circle01.java 进行编译生成字节码;D:java Circle01 进行运行;而不是 D:java Cirlce01.classJava解释器是通过类名找到字节码文件的,再找到该字节码文件中的main函数的,然后执行整个程序。Java要求类
5、名必须和文件名相同也就是这个道理,否则java解释器就找不到字节码文件了。Java解释器在调用main方法时,直接通过类名调用这个静态方法,没有必要先实例化类再通过对象来调用。这样不仅减少程序执行的步骤,还保证程序运行的效率。可以明白,main函数的static 修饰符是非常重要的。,变量初始化的顺序,隐式赋予变量默认值;显式赋予初始值;构造方法体赋予新值;注意:可能有的程序第2、3赋值步骤不存在,但是必定有第1个步骤。见示例PersonVariableOrder.java每实例化一个对象,属性在堆内存中的值,就是如上这3个步骤的结果。所以对于非静态属性,每次实例化时都要按以上步骤赋值。静态的
6、属性就不同,因为它是类属性,不属于任何对象,也可以说它被所有对象共享。它在第一次装载到JVM时被赋值,对象实例化时不需要给静态属性赋值。总之,静态属性的赋值要优先于非静态属性的赋值。而且,静态属性的赋值只有一次,非静态属性的赋值要发生多次。,程序块,静态程序块非静态程序块,类的继承 Inheritance,格式:Java中只能单继承,也就是说每个类只能有一个父类。,修饰符 class 子类名 extends 父类名,生物,植物,动物,人类,猫类,继承 续,子类实际上继承了父类的所有特征,同时子类在父类的基础上还增加了自己的特征。所以,子类和父类相比具有更丰富的功能。其实,在继承关系中我们还能发
7、现一个规律:子类是父类的一种,也可以说“子类就是父类”。如:人类就是动物,动物就是生物。记住这个定律对我们理解继承的概念非常有帮助。但是,反过来看,父类是子类的说法正确吗?见示例 Person.java、Student.java,类的继承(续),父类的别名:基类BaseClass超类SuperClass子类的别名:衍生类Child ClassDerived Class,类继承的规则,子类继承父类的所有属性和所有方法;但是构造器不继承;,Vehicle,typetopSpeed,start()stop(),MotorVehicle,typetopSpeedcylinders,start()sto
8、p(),Car,typetopSpeedcylinders,start()stop()squeal(),Boat,typetopSpeedcylinders,start()stop()sinkBoat(),子类实例化的过程,子类实例化是先实例化其父类,然后实例化子类。要先调用父类的构造器,父类构造器运行完毕,才调用子类的构造器。如果实例化类D,说出构造器执行的顺序。总之,一个类的实例化不仅要调用本类的构造器,还要调用它所有父类的构造器,先完成父类构造器中的代码,最后完成本类构造器中的代码。,A,B,C,D,E,super和this关键字,如果父类Person具有多个构造器重载,那么子类Stud
9、ent实例化时如何选择调用父类的构造器呢?super()作用:调用父类的构造器只能出现在子类的构造器中,且必须是第一行super()中的参数,决定了调用父类哪个构造器如果子类构造器中没有出现super,那么默认super(),即调用父类的空构造器。this()作用:调用本类的构造器只能写在构造器的第一行在同一个构造器中super()和this()不能同时出现,super和this关键字(续),super.指向父类的引用。通过关键字super我们可以指定子类在构造时调用父类的哪个构造器,达到先实例化父类然后实例化子类的目的。子类的构造器默认的调用父类无参构造器,即子类构造器中没有用super指明
10、调用父类哪个构造器的话,实际上编译器会自动的在子类构造器第一行加入代码super();this.我们知道子类在实例化时必须调用父类的构造,实际上有的子类构造也可以先调用本类的其他构造,然后在通过那个构造调用父类的构造无论是调用父类的构造还是子类的构造,最终都是找到最顶级的父类自上而下的实例化。只要中间环节有一个构造没找到,这个子类就无法完成实例化。见示例!指向本类的引用。,方法的覆盖,所谓“覆盖(override)”是在声明子类的成员方法时,其名称和参数都与父类的成员方法的名称和参数一样,在面向对象的程序设计中称为方法的覆盖。,方法覆盖的规则,在父子类之间继承时发生多个方法的名称相同返回值类型
11、必须相同每个方法参数数量和参数类型和顺序相同权限修饰符要求:子类方法的要不小于父类方法的子类方法只能抛出父类方法异常或其异常的子类。方法覆盖如下例所示:父类方法:protected void getArea(int w,int h)throws IOException;子类方法:public void getArea(int x,int y)throws FileNotFoundException;,关键字final,final可以修饰的元素:变量(属性和局部变量):不能被重新赋值;可以在声明的同时赋值,还可以在构造器中赋值,其他的方法中不能够赋值。在程序中经常使用的一些常量,如圆周率,没必要
12、在程序中频繁的修改它那么我们可以:首先把它设置为静态static,多个实例共享该常量,没有必要每个对象保存一份;其次,设置为final类型,赋值以后不能再改变;最后注意遵守常量命名规范,所有字母大写、单词之间用下划线。方法:不能被子类覆盖、重写,即不能修改。类:不能被继承、不能产生子类。,抽象方法,只有方法声明,没有方法实现的方法;抽象方法必须用abstract声明,没有方法体,以“;”结尾。,public abstract void getArea();,抽象类,含有抽象方法的类必须声明为抽象类;用abstract声明class。,public abstract class Rectangl
13、e public abstract void getArea();,抽象类的规则,注意:抽象类不能被实例化;因为即使实例化以后我们也无法调用对象的抽象方法。所以抽象类只能作为父类使用,让其他类继承抽象类。其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;抽象方法不能为static;在下列情况下,一个类必须声明为抽象类:当一个类的一个或多个方法是抽象方法时;当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;,抽象类的思考,抽象类是否能够实例化?抽象类是否需要构造器?,抽象类的本质,抽象类是抽象
14、方法和非抽象方法的集合特殊情况全部是抽象方法全部为非抽象方法实际上是一套规范,它规定了子类必须定义的方法,除非子类严格的执行了这套规范,否则这个子类将不能实例化和使用。,接口interface,接口不是一个类,不能实例化;接口是常量和抽象方法的集合;接口对类来说是一套规范,是一套行为协议;定义格式如下:,public interface MyInterface interfaceBody,类实现接口,接口实质上就是一个常量和抽象方法的集合。为了使用一个接口,你要编写实现接口的类。如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象。格式如下:,public
15、 class MyClass implements MyInterface/实现接口中所有抽象方法,接口的特点,接口使用interface关键字来定义,而不是class。接口中定义的变量都是公共静态最终变量。接口中没有自己的构造函数,而且接口中定义的方法全部都是抽象方法,即只提供方法的定义,而没有提供方法的具体实现的语句。接口采用多继承机制,而不像类一样采用单继承机制。如果在实现某个接口的同时还继承了某个类,那么,extends要写在 implements之前。接口默认:常量:public static final抽象方法:public abstract,接口与抽象类的区别,接口不能含有任何非
16、抽象方法,而抽象类可以。类可以实现许多接口,但只能有一个父类。接口和接口之间可以多继承 如:public interface A extends B,C B,C也是接口.接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法完全是抽象方法,是一套纯粹的规范。一般来说,有关系的类才能继承同一个抽象类,而无关的类不可能有同一个抽象父类,但是无关的类可以实现同一个接口。,类的继承,interface,implements,class A implements C,D,class,class,class A extends B,inte
17、rface,class,implements,class A implements C,class,class,class A extends B implements C,implements,interface,implements,interface,class A extends B implements C,D,抽象类的继承,class,abstract class,class A extends B,abstract class,abstract class A extends B,abstract class,implements,interface,abstract class
18、 A implements C,D,implements,interface,abstract class A implements C,abstract class,interface,abstract class A extends B implements C,D,interface,implements,接口的继承,interface A extends B,interface,interface,interface,interface A extends B,C,D,interface,访问接口中常量,public static final int MAX_SPEED=100;接口中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaOO 08. 面向 对象 高级 特性

链接地址:https://www.31ppt.com/p-6509356.html