Java04(深入面向对象编程).ppt_第1页
Java04(深入面向对象编程).ppt_第2页
Java04(深入面向对象编程).ppt_第3页
Java04(深入面向对象编程).ppt_第4页
Java04(深入面向对象编程).ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、深入面向对象编程,本章内容,类的继承 高级访问控制 包 =运算符与equals()方法 Object类的方法,类的继承,继承是面向对象程序设计语言的另一重要特征,理解继承是理解面向对象程序设计的关键,通过继承可以实现代码的复用,使程序的复杂性线性的增长,而不是随规模的增大呈几何级数增长。 在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。 在Java中,不允许多继承,即一个类只能有一个父类。,车辆,机动车,非机动车,内燃机车,电车,人力车,蓄力车,柴油机车,汽油机车,马车,手推车,自行车,继承示例,类的继承,继承能够使子类拥有父

2、类的所有的属性和方法,而不需要在子类的类定义时重新定义父类的这些属性和方法,子类即可以保持父类原有的属性和方法,也可以对从父类那里继承而来的属性和方法进行修改,在定义了继承关系后,我们改动父类的一个属性或方法时,子类也会自动改变,但是这些属性和方法必须是非私有,并且没有被子类重新定义的 注:子类拥有父类的所有的属性和方法但不能访问父类中的私有属性与方法,一个继承的例子,public class Student extends Person private int id; public void setId(int id) this.id=id; public void study() Syst

3、em.out.println(getName()+ is reading!); public void showInfomation() System.out.println(id:+id+ name:+getName()+ age:+getAge(); public static void main(String args) Student stu=new Student(); stu.setName(zhangsan); stu.setAge(20); stu.study(); stu.showInfomation(); ,构造方法不能被继承,子类不从超类继承构造方法 子类的构造方法一定会

4、调用父类的构造方法,默认调用不带参的构造方法 在子类中用super()来调用父类的构造方法,特殊变量super,特殊变量super,提供了对父类的访问。 可以使用super访问父类被子类隐藏的变量或覆盖的方法。 每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造方法,那么在编译的时候就会报错。,方法的覆盖(override),在子类中定义一个与父类同名、返回类型、参数类型均相同一个方法,称为方法的覆盖。 覆盖发生在子类与父类之间。,方法覆盖的规则,覆盖方法的返回值类型必须与它所覆盖的方法相同 覆盖方法不能比它所覆盖的方法的访问性差 覆盖方法不能比它所覆盖的方

5、法抛出更多的异常,方法的覆盖与重载的区别,方法的覆盖是子类和父类之间的关系,而重载可以是发生在一个类内部多个方法间 方法的覆盖一般是两个方法间的,而重载时可能有多个重载方法 覆盖的方法有相同的方法名和形参表,而重载的方法只能有相同的方法名,不能有相同的形参表 覆盖时区分方法的是根据调用他的对象,而重载是根据形参来决定调用的是哪个方法 用final修饰的方法是不能被子类覆盖的,只能被重载,多态的概念,多态是指在一棵继承树中的类可以有多个同名但不同方法体以及不同形参的方法。 有两种情况: 覆盖:在子类中直接定义和父类同样的属性和方法,但重新编写了方法体,即子类与父类方法的形参与返回值都相同,而内部

6、处理不同,这种方法在使用过程中,Java虚拟机会根据调用这个方法的对象来确定哪个方法被调用 重载:同一个类定义中有多个同名的方法,但有不同的形参,而且每个方法有不同的方法体,调用时根据形参的个数和类型来决定调用的是哪个方法,对象在继承关系中改变,Java语法规定: 子类实例可以被当作父类的一个对象使用,而父类实例不能被当作子类的一个对象使用 如果一个被父类对象通过赋值指向的地址是子类对象所在的地址,按照前一条准则,这个对象仍然是父类的对象,但它可以通过强制类型转换成子类对象。,对象的类型转换,类型转换用来恢复一个对象的全部功能 向上的类型转换(子类转父类)是隐含地实现的 向下的类型转换(父类转

7、子类)必须针对子类,并由编译器检查。也就是说类型转换只能发生在有继承关系的父类与子类之间 可以使用instanceof来测试一个对象的类型,类型转换示例,Person person=new Person(); Student student=new Student(); Worker worker=new Worker(); person=student; person=worker; worker=(Worker)person; student=(Student)person; /执行出错,抛出ClassCastException worker=(Worker)student; /编译出错,

8、两个对象没有继承关系 if(person instanceof Student) student student=(Student)person; if(person instanceof Worker) worker=(Worker)person;,多态性的一个呈现,请指出下面代码的执行结果: class Person public void showInfo() System.out.println(i am a person!); class Student extends Person public void showInfo() System.out.println(i am a s

9、tudent!); class Test public static void main(String args) Person p=new Student(); p.showInfo(); ,包(package),为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。,包(package),package语句必须是文件中的第一条语句。也就是说,在package语句之前,除了空白和注释之外不能有任何语句。 如果不加package语句,则指定为缺省包或无名包。 包对应着文件系统的目录层次结构。 在package语句中,用“.”来指明包(目录)的层次。,

10、编译并生成包,在当前目录下生成包 javac d . Test.java 在指定目录下生成包 javac d E:JavaLesson Test.java,import语句,引入包中的类。 import java.io.File; 引入整个包。 import java.io.*; 在同一包中的类可以互相引用,无需import语句。,高级访问控制,类的访问说明符 1、public :能被其它所有的类访问和引用, 可使用import从另一个包中引入所需要的类,但被 引入的类必须是public 修饰。 2、默认(friendly):只能被同一个包中的类访问和 引用,一个.Java文件必须有而且最多有

11、一个public修饰的类,且该类的名称要与.java的文件名一致。,高级访问控制,方法的访问说明符 1、 public :如果类也是public 修饰的话,这些属性和方法可以被所有的类访问和使用 2、 private:只能被该类自身访问和调用 3、protected:保护访问控制符,可被同一个包中的 类或不同包中该类的子类以及该类自身访问和引用 4、默认:具有包内访问性,只能被同一个包中的其他类访问和引用,方法的访问控制,不同 情形下,访问说明符,到此为止-final,final在变量之前,则定义一个常量. final在方法之前,该方法不能被覆盖 final在类之前,该类不能被继承.,常量的定

12、义,使用关键字final定义常量,例如: final double PI=3.1415926; 作为一种约定,在定义常量时,通常采用大写形式。 final常量可以在声明的同时赋初值,也可以在构造函数中赋初值。 为了节省内存,我们通常将常量声明为静态的(static)。,final方法,为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(overridden),可以使用final方法。 为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优化。要注意的是:编译器会自行对final方法进行判断,并决定是否进行优化。通常在方法的体积很小,而我们确实不希望它被覆盖时,才将它声明

13、为final。 class中所有的private和static方法自然就是final。,“=”和“equals”的用法,在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。 “=”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。 对于基本数据类型的数据,只要他们的值相等,“=”返回true 对于两个字符串对象,只要他们的内容一致,“equals” 返回true,=返回false 对于没有重写equals方法的对象(c1 和c2),“=”和“equals”都返回

14、false 对于赋值语句后的结果(c1=c2),“=”和“equals”均返回true,对象的内存分配图,栈内存,堆内存,str1,str2,a,b,c,a,b,c,0088:4400,0088:4400,0088:4660,0088:4660,str1标识的对象,str2标识的对象,当我们声明一个引用类型变量时,系统只为该变量分配了引用空间,并未创建 一个具体的对象;当用new为对象分配空间后,将对象的引用赋值给引用变量。,函数的调用,在Java中,传参时,都是以传值的方式进行。 对于基本数据类型,传递的是数据的拷贝;对于引用类型,传递的引用的拷贝。,函数的调用,x,main,change,

15、栈内存,y,4(3),3(4),4,3,class StringTest public static void change(int x,int y) x=x+y; y=x-y; x=x-y; public static void main(String args) int x=3; int y=4; change(x,y); System.out.println(x=+x); System.out.println(y=+y); ,x,y,函数的调用,pt,main,change,栈内存,堆内存,Point类的对象,pt,0088:4660,0088:4660,0088:4660,class

16、StringTest public static void change(Point pt) pt.x=pt.x+pt.y; pt.y=pt.x-pt.y; pt.x=pt.x-pt.y; public static void main(String args) Point pt=new Point(); pt.x=3; pt.y=4; change(pt); System.out.println(x=+pt.x); System.out.println(y=+pt.y); class Pointint x, y;,Object类,Object类是所有类的基类,如果一个类的定义中没有继承任何类

17、,这个类默认继承自Object类 Object类中定义了下列主要方法: protected Object clone()用来生成当前对象的一个拷贝,并返回这个复制对象。 public boolean equals(Object obj)用来比较两个对象是否相同。 public Class getClass()用来获取当前对象所属类的信息,返回class对象 protected void finalize()用来定义回收当前对象时所需完成的清理工作。 public String toString()用来返回当前对象本身的有关信息,按字符串对象返回。 public int hashCode() 用

18、来返回当前对象的散列码,toString方法,toString()方法用于将一个对象的信息变换出字符串后,返回,当我们使用println(obj)来输出一个对象时,默认会调用该对象的toString方法,一个良好的编程习惯是在每一个实体类中,重写toString()方法,以便于调试,下面是Student类中重写该方法的一个示例: public String toString() return name=+name+ age=+age+; ,equals方法,equals()用于比较两个对象的内容是否相等,当我们执行两个对象的比较时,需要使用到equals方法,如果被比较的对象没有重写该方法,除

19、非它们指向同一个对象,否则永远返回false,在很多其它的JAVA类的某些方法中(如集合类的contains(obj)方法),默认也会调用该方法,下面是重写学生类的equals方法的一个示例: public boolean equals(Object obj) if(obj=this) return true; if(!(obj instanceof Student) return false; Student other=(Student)obj; return name.equals(other.getName() ,getClass方法,该方法返回对象的结果信息,返回值是Class,Class是类结构的封装,是进行类反射的基础,该方法被声明为final的,不能被覆盖,下面的代码演示了如何在程序运行中动态的获取类的完整名字。 Object obj=new Person(); String cName=obj.getClass().getName(); System.out.println(cName);,hashCode方法,hashCode方法用于返回一个对象的散列码,该方法在某些需要使用对象散列码值的场合(如该对象作为hashtable的key值时)会被调用,正常情况下,如果两个对象的equa

温馨提示

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

评论

0/150

提交评论