面向对象编程四详解演示文稿_第1页
面向对象编程四详解演示文稿_第2页
面向对象编程四详解演示文稿_第3页
面向对象编程四详解演示文稿_第4页
面向对象编程四详解演示文稿_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

面向对象编程四详解演示文稿目前一页\总数二十九页\编于二十点优选面向对象编程四目前二页\总数二十九页\编于二十点Object类是所有Java类的根父类(最高父类)任何一个java的类(class)都直接或者间接继承自Object类如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类

publicclassPerson{ ... }

等价于:publicclassPersonextendsObject{ ...}目前三页\总数二十九页\编于二十点在父类中定义一个构造方法,2个static{},2个{}.在子类中定义一个构造方法,2个static{},2个{}.在场景类中创建一个子类对象,观察结果,观察调用顺序.目前四页\总数二十九页\编于二十点对Java对象的类型转换称为造型在造型前通常使用instanceof操作符测试一个对象的类型从子类到父类的类型转换可以自动进行(多态)从父类到子类的类型转换必须通过造型(强制类型转换)实现子类的对象可以当做基类的对象来使用称作向上转型(多态),反之称为向下转型无继承关系的引用类型间的转换是非法的目前五页\总数二十九页\编于二十点//Person及Student类可自行定义publicclassTest{ publicvoidmethod(Persone){ System.out.println(e.getSchool());//

if(einstanceofStudent){ Studentme=(Student)e; System.out.println(me.getSchool()); } } publicstaticvoidmain(Stringargs[]){ Testt=newTest();

Personm=newStudent(); t.method(m); }}目前六页\总数二十九页\编于二十点Object类中定义有publicStringtoString()方法,其返回值是String类型,描述当前对象的有关信息。//默认情况是打印的是类名@hashcode的十六进制表示在进行String与其他类型数据的连接操作时(如:System.out.println("info"+person)),将自动调用该对象类的toString()方法。可以根据需要在用户自定义类型中重写toString()方法。目前七页\总数二十九页\编于二十点toString方法的列子:目前八页\总数二十九页\编于二十点

Object类的方法

publicinthashCode()方法

返回该对象的哈希码值。

publicClassgetClass()方法

返回此Object的运行时类。目前九页\总数二十九页\编于二十点==操作符相同的字符串常量相等两个Integer,如果其中至少一个是new出来的,则不等;如果都是同一个常量赋值的,则相等(-128~127).基本数据类型和封装类会拆箱比较数值两个不同封装类的对象不能比较,编译报错.两个不同的基本数据类型,如果可以自动转换,则可以比较.有继承关系的引用数据类型对象之间可以比较,当指向同一个对象时相等.没有继承关系的引用数据类型不能比较.目前十页\总数二十九页\编于二十点equals方法在Object类中定义的equals方法: publicbooleanequals(Objectobj) 注意:形参是Object类型!!equals()方法的调用者必须是引用数据类型调用equals(...)方法时的实参可以是基本数据类型,java会自动进行装箱.目前十一页\总数二十九页\编于二十点==操作符与equals方法在比较引用数据类型时,==操作符与equals()作用完全一样------看引用的是不是同一对象除非在自定义的类中重写了equals方法,或是下面的四类已经重写了equals方法的特例:java.io.File;java.lang.String;//先讲,再讲自定义类重写.封装类

这四类当用equals()方法进行比较时,只比较类型及内容而不看引用的是不是同一对象.目前十二页\总数二十九页\编于二十点==操作符与equals方法举例classTestEquals{

//请自行定义能满足需要的MyDate类

publicstaticvoidmain(String[]args){ MyDatem1=newMyDate(24,3,2001); MyDatem2=newMyDate(24,3,2001); if(m1==m2){ System.out.println("m1==m2"); }else{ System.out.println("m1!=m2"); } if(m1.equals(m2)){ System.out.println("m1isequaltom2"); }else{ System.out.println("m1isnotequaltom2"); }

m2=m1; if(m1==m2){ System.out.println("m1==m2"); }else{ System.out.println("m1!=m2"); }}}目前十三页\总数二十九页\编于二十点应用场景:在定义一个类时,有些方法暂时还不知道该怎么实现,只能等子类把这些方法都实现后才能使用.这样的方法应该定义为抽象abstract方法.含有抽象方法的类必须定义为抽象abstract类.目前十四页\总数二十九页\编于二十点用abstract来修饰类或方法

[修饰符]abstractclass类名{…}

[修饰符]abstract返回值类型方法名([形参列表]);抽象类不能被实例化,抽象方法必须被全部重写后,其子类才可以声明为非抽象的,才能生成它的子类对象。如果一个子类没有实现抽象基类中所有的抽象方法,则子类也要声明为一个抽象类。抽象类不一定包含抽象方法----不想让人直接实例化可以声明抽象类类型的引用,把它作为方法形参,返回值类型等目前十五页\总数二十九页\编于二十点在类中没有实现的方法就是抽象方法,抽象方法没有方法体(不同于方法体为空{})。思考:构造方法,静态方法,public方法,protected方法,default方法,private方法,final方法能不能被声明为抽象的方法。思考:属性能否用abstract来修饰?目前十六页\总数二十九页\编于二十点思考:抽象类中可以有普通方法吗?抽象类中可以有构造方法吗?抽象类中可以有static方法吗?抽象类中可以有static属性吗?抽象类中可以有实例属性吗?目前十七页\总数二十九页\编于二十点关键字final在Java中声明类、属性和方法时,可使用final修饰符来修饰。final标记的类不能被继承。final标记的方法不能被子类重写。final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,且在使用前必须被赋值。final标记的方法的形参不能被重新赋值.final标记的成员变量必须在声明的同时或在每个构造方法(或构造语句块)中显式赋值(不会被默认初始化),然后才能使用。构造方法不能用final来修饰,因为构造方法不能被继承,更无所谓重写,用final修饰没有意义,编译会报错.目前十八页\总数二十九页\编于二十点关键字final应用举例publicfinalclassTest{ publicstaticinttotalNumber=5; publicfinalintid; publicTest(){ id=++totalNumber; } publicstaticvoidmain(String[]args){ Testt=newTest(); System.out.println(t.id); finalinti=10; finalintj; j=20; j=30;//非法 }}目前十九页\总数二十九页\编于二十点练习:对比static/final关键字参考前面章节,复习static修饰符的用法;练习前页例子及下述程序,并改正其错误,体会final关键字修饰变量时的用法;publicclassTestFinal{ publicstaticvoidmain(Stringargs[]){ inti=1; finalintj=10; j=100; finalintk; k=100; k=200;System.out.println("i="+i+"j="+j+"k="+k); }}目前二十页\总数二十九页\编于二十点修饰符修饰对象规则static属性类或类的实例来调用,最好用类引用方法只能调用静态变量或静态方法,不能使用this,super代码块程序一加载静态代码块就运行,而且只运行一次final变量常量,finalinti=12;或者finalinti;i=12;方法该方法不能被子类重写,可以被继承类该类不能被继承。abstract方法该方法只有方法声明,没有方法体构造方法和static方法不能是抽象的有该方法的类称为抽象类,类名前必须加abstract类抽象类不能被实例化抽象类可以具有指向子类对象的引用抽象类可以有普通方法,只能子类调用父类的抽象方法必须在子类中实现(用子类实例对象)目前二十一页\总数二十九页\编于二十点接口(interface)是抽象方法和常量值组成的一个数据结构。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现[jdk8之前]jdk8之后,接口中可以定义default方法(一种实例方法),static方法接口定义举例publicinterfaceRunner{ intid=1; voidstart(); publicvoidrun(); abstractvoidstop();}接口(1)目前二十二页\总数二十九页\编于二十点接口(2)多个类可以实现同一个接口一个类可以实现多个接口与继承关系类似,接口与实现类之间存在多态性定义java类的完整语法格式:

[<modifier>]class<name>[extends<superclass>] [implements<interface>[,<interface>]*]{ <declarations>* }目前二十三页\总数二十九页\编于二十点接口应用举例(1)publicinterfaceRunner{ voidstart(); publicvoidrun(); publicvoidstop();}目前二十四页\总数二十九页\编于二十点接口应用举例(1)publicclassPersonimplementsRunner{ publicvoidstart(){

//弯腰、蹬腿、咬牙、瞪眼、开跑 } publicvoidrun(){

//摆动手臂、维持直线方向 } publicvoidstop(){

//减速直至停止、瘫倒、吐血、送医院 }}目前二十五页\总数二十九页\编于二十点接口应用举例(2)<<interface>>Runner+start()+run()+stop()Person+start()+run()+stop()+dance()Car+start()+run()+stop()+fillFuel()+crack()Bird+start()+run()+stop()+fly()目前二十六页\总数二十九页\编于二十点接口应用举例(3)interfaceRunner{publicvoidrun();}interfaceSwimmer{publicdoubleswim();}abstractclassAnimal{publicabstractinteat();}//classPersonextendsAnimalimplementsRunner,Swimmer{ publicvoidrun(){……} publicdoubleswim(){……} publicinteat(){……}}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Testt=newTest();

温馨提示

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

评论

0/150

提交评论