JAVA编程思想ppt课件_第1页
JAVA编程思想ppt课件_第2页
JAVA编程思想ppt课件_第3页
JAVA编程思想ppt课件_第4页
JAVA编程思想ppt课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

JAVA编程思想,1,主要内容,访问控制符类再生多形性对象序列化数据流与文件处理网络传输多线程JavaBeanJDBC,2,访问控制符,对Java的每个数据成员或方法,访问控制符都置于前边,控制着对它们的访问。对类成员控制访问的原因:1、防止用户接触他们不应接触的工具;2、允许设计者改变类的内部工作机制而不必担心会对用户造成什么影响,如接口和实施细节早已经进行了明确的分隔与保护,设计者可以方便地修改实施细节,而不要求用户改写他们的代码。,3,访问控制符(续),访问控制规则:应尽可能将所有东西都保持为private,而只显示那些想让别人使用的方法。private:同一个类中可以使用,其它类(包括子类)不可用;protected:同一类、同一包以及子类可使用;Privateprotected:同一类、子类可使用;public:都可用。,4,类再生,为实现代码的重复利用或再生,我们利用现有的类或者创建新类来重复使用代码。合成:在新类里简单地加入原有类的对象。为进行合成,在新类中置入原有类的对象的句柄即可。编译器并不为每个句柄创建一个默认对象(对父类型可以),因为这样会增加不必要的开销,如果希望句柄得到初始化,可在下面这些地方进行:,5,类再生(续),1、定义对象的时候,这样在构造函数调用之前肯定能得到初始化;2、在类的构造函数中;3、在使用该对象之前,如果对象不需要创建,可减少不必要的开销。,6,类再生(续),继承:用原有作为父类来创建新类。初始化父类:在创建子类的对象时封装了父类的一个“子对象”,在子类的构造函数中,Java会自动调用父类的构造函数,但在子类的构造函数中要对新增加的属性赋值。,7,类再生(续),到底选择合成还是继承?创建和使用代码的一般做法是将数据和方法统一封装到一个类里并使用类的对象。一般都采用合成技术用现有的类来构成新类,而要慎重使用继承,只有在清楚地知道在所有方法中最有效的前提下才考虑使用继承。判断使用合成还是继承最简单的方法就是考虑是否需要从新类上溯造型回父类,若必须上溯,就需要继承;如果不需要上溯,就应提醒自己防止继承的滥用。,8,类再生(续),final关键字:不允许改变final数据:常数final类:不需要改变或不允许继承的类。由于不允许继承,类中的所有方法默认为final,9,类再生(续),final方法:有两方面的原因:1、为方法“上锁”,防止任何继承类改变它的本来含义,不允许被覆盖或改写。2、提高程序的执行效率。执行final方法时,不采用常规的方法调用机制(自变量入栈跳至方法代码处并执行跳回并清除堆栈自变量处理返回值),而是用方法主体内实际代码的副本来替换方法的调用,这样就避免了方法调用时的开销。但只有方法本身代码很少时才有明显效果。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖时,才考虑将一个方法设为final。,10,类再生(续),初始化和类装载:类代码在首次使用时载入系统。首次被使用的地方也是static初始化的地方。装载的时候,所有的static对象和static代码块都会按照本来的顺序(代码中写入的顺序)初始化。static数据只会初始化一次。,11,类再生(续),继承初始化:对一个类运行时,首先是装载程序到外面找到那个类。在装载过程中,装载程序发现有父类(有extends关键字),也会随之将其装入,若父类还有另一个父类,则另一个父类也会载入,依次类推。接下来会对根父类执行初始化,再对下一个子类初始化,依次类推。保证这个顺序是由于子类的初始化要依赖于父类成员的正确初始化。,12,类再生(续),只有在必要的类全部装载完毕才能创建类的对象。首先,对象中的所有基本数据都会被设成默认值,而将对象的句柄设为null,随后会调用父类构造函数。调用自动进行,也可以用super来自行指定构造函数调用。父类的构建采用与子类构造函数完全相同的处理过程。父类构造函数完成以后,实例变量会按本来的顺序得以初始化,最后执行构造函数剩余的主体部分。,13,多形性,在面向对象的程序设计中最基本的三个特征是:数据抽象、继承和多形性。通过继承可以创造一系列类,通过java的多形性概念我们知道同一系列中的类的所有对象都具有共性,这就意味着我们编写的代码不必再依赖特定的类型信息而通过它们共有的父类对一系列的对象进行操作。这使得程序更易扩展,包容力也更强,程序的构建和维护变得更方便。此外,java还通过“接口”提供了复用代码的第三种途径。同时多形性将接口从具体实施细节中分离出来,实现了“是什么”与“怎样做”两个模块的分离,使代码的组织以及可读性都得到了改善。,14,多形性(续),上溯造型:把子类当作它的父类处理的过程。为什么要上溯造型?为减少代码量,方法中将父类作为自变量或参数使用,而不是使用那些特定的子类,在使用时,通过上溯造型,将子类当作它的父类处理。上溯造型肯定是安全的,因为是从特殊类型到常规类型。但也有缺点:子类中对接口扩展的部分不可以在父类中使用,所以一旦上溯造型,就不可再调用新的方法。,15,多形性(续),16,多形性(续),针对从Shape衍生出来的所有类,Shape建立了一个通用接口,所有(几何)形状都可以描绘和删除,子类覆盖了这些定义,为每种特殊类型的几何形状都提供了具体的行为。classShapevoiddraw()system.out.println(“Shape.draw()”);voiderase()system.out.println(“Shape.draw()”);ClassCircleextendsshapevoiddraw()system.out.println(“Circle.draw()”);voiderase()system.out.println(“Circle.erase()”);(接下页),17,classLineextendsshapevoiddraw()system.out.println(“Line.draw()”);voiderase()system.out.println(“Line.erase()”);classSquareextendsshapevoiddraw()system.out.println(“Square.draw()”);voiderase()system.out.println(“Square.erase()”);publicclassShapespublicstaticShaperandShape()swicth(int)(math.random()*3)case0:returnnewCircle();case1:returnnewLine();case2:returnnewSquare();(接下页),18,publicstaticvoidmain(Stringargs)Shapes=newShape9;for(i=0;is.length;i+)si=randShape();for(i=0;is.length;i+)si.draw();/etc运行结果:Circle.draw();Line.draw();Square.draw();Circle.draw();Line.draw();Square.draw();Circle.draw();Square.draw();Line.draw();,19,多形性(续),在主类Shapes里,有一个static方法randShape(),它的作用是在每次被调用时为随机选择的Shape对象生成句柄。因为上溯造型是在return语句中发生的,它将获得一个指向Circle、Line或Square的一个句柄,并作为Shape类型返回,也就是说,无论什么时候调用这个方法,都无法知道它的具体几何类型到底是什么,因为获得的肯定是一个Shape句柄。那么编译器怎么能知道它是一个什么几何类型(比如知道它是一个Circle,而不是一个Line或Square)?,20,多形性(续),方法调用的绑定绑定:将一个方法调用同一个方法主体连接到一起。早期绑定:在程序执行以前执行绑定(由编译器和链接程序执行)。如C语言的方法调用就是早期绑定。后期绑定:绑定在运行期间进行。方法调用机制能够在运行期间判断对象的类型,并分别调用不同的方法。(并非由编译器完成,此时编译器仍然不知道对象的具体类型,检查工作由方法调用机制本身实现)。不同语言实现绑定的方法不同,但都是在对象中安插了某些特殊的类型信息。Java中的所有绑定都采用后期绑定,除非方法被声明为final。它告诉编译器不必进行绑定,方法调用执行效率高。正是由于java的后期绑定并具有多形性,使得代码可以直接与父类沟通,同时又能保证子类用相同的代码正常地工作。,21,多形性(续),方法的重载与覆盖重载:同名方法被多次重新定义。覆盖:将原有的方法覆盖,提供功能更完全的方法。抽象类和抽象方法抽象类:是一种特殊的对象类,它只部分地定义了类的数据结构和方法,而完整的数据结构和方法则由其子类进一步确定。因此抽象类本身不能有任何实例。一个抽象类至少有一个子类,并只能建立子类的实例。抽象类中至少有一个方法是抽象的。抽象类可用来涵盖同一概念的不同实施,它对类的行为作概念性的定义,但实施则由子类完成。抽象方法:一种不完整的方法,只有一个声明,没有方法主体,方法的具体实现由子类完成。,22,多形性(续),接口:定义一个类提供给外界的方法,而不揭示其内在结构或具体实施。从形式上看更象抽象类,但不带有任何属性,只有抽象方法。Java的“多重继承”在一个子类中,不一定非要有一个抽象或具体的父类,如果要有,只能从一个类继承,其它的必须是接口(在关键字inplements后边),并用逗号分隔,每个接口都会成为一个独立的类型,可对其进行上溯造型。,23,多形性(续),什么时候使用接口?1、可以上溯造型至多个父类;2、防止创建该类的对象。使用接口还是抽象类?如果想创建的父类没有任何方法定义或成员变量,最好使用接口,否则才使用抽象类。利用继承技术,可以方便地为一个接口添加新的方法声明,也可以将几个接口合并成一个新接口。(举例如下页所示),24,/HorrorShow.javainterfaceMonstervoidmenace();/怪物危险/危险的怪物伤人interfaceDangerousMonsterextendsMonstervoiddestroy();/具体的怪物恐龙classDragonZillaimplementsDangerousMonsterpubilcvoidmenace()/*/方法的具体实现publicvoiddestroy()/*/方法的具体实现/吸血鬼吸血(同时实现两个接口)interfacevampireextendsDangerousMonster,LethalvoiddrinkBlood();(接下页),25,classHorrorShowstaticvoidu(Monsterb)b.menace();staticvoidv(DangerousMonsterd)d.menace();d.destroy();publicstaticvoidmian(Stringargs)DragonZillaif2=newDraggonZilla();u(if2);v(if2);通常,我们只能对一个类应用extends关键字,在构建新的接口时,extends可能引用多个接口,可以将多个接口的名字简单地用逗号隔开。,26,多形性(续),内部类:将一个类定义置于另一个类定义中。使用内部类的好处:利用内部类可以对逻辑上相互联系的类进行分组,并可控制一个类在另一个类里的“可见性”,这样我们就可以很方便地隐藏实施细节,得到的就是一个父类或接口的句柄。链接外部类:内部类对象同时拥有指向封装对象(这些对象封装或生成了内部类)的链接,拥有对封装类所有元素的访问权限,可以访问封装对象的成员。,27,多形性(续),static内部类:1、创建static内部类对象时不需要外部类对象;2、不能从static内部类对象访问外部类对象;3、static内部类不能有static数据或static内部类。内部类不可覆盖。内部类标识符:封装类名称.内部类名称.class.如果内部类是匿名的,编译器只是简单地生成数字作为内部类的标识符。,28,多形性(续),下溯造型:将父类对象作为子类对象处理。在下溯造型时,我们并不知道子类对象的具体类型,为了保证下溯造型的正确进行,java会对所有的造型进行自动检查和核实,如果类型不对,会到一个ClassCastException(类造型违例)。造型前的检查:用关键字instanceof告诉我们对象是不是一个特定类型的实例,它会返回一个布尔值:if(xinstanceodWTObject),29,运行期类型鉴定,RTTI:在运行期间查找对象和类信息,主要以下包括三种。经典造型Class对象instanceof,30,运行期类型鉴定(续),classShapevoiddraw()System.out.println(this+.draw();classCircleextendsShapepublicStringtoString()returnCircle;classSquareextendsShapepublicStringtoString()returnSquare;classTriangleextendsShapepublicStringtoString()returnTriangle;,31,运行期类型鉴定(续),publicclassShapespublicstaticvoidmain(Stringargs)Vectors=newVector();s.addElement(newCircle();s.addElement(newSquare();s.addElement(newTriangle();Enumeratione=s.elements();while(e.hasMoreElements()(Shape)e.nextElement().draw();/:,32,多运行期类型鉴定(续),Class对象每个类都对应一个Class对象,该对象包含了与类有关的信息,保存在同名的.class文件中。运行时一旦想生成某个类的一个对象,JVM首先检查那个类型的Class对象是否载入。若尚未载入,JVM就会查找同名的.class文件,并将其载入。载入后,就用它创建那个类型的所有对象。,33,多运行期类型鉴定(续),instanceof告诉我们对象是不是一个特定类型的实例,返回一个布尔值.,34,对象序列化,只要实现了serialzable接口的对象就可以实现序列化。所谓“对象序列化”是将对象转换成一系列字节,并可以在以后恢复回原来的样子,这一过程也可以通过网络进行,这就意味着序列化机制能自动补偿操作系统间的差异。Java中实现了对象序列化后,可提供两种主要特性的支持:1、远程方法调用(RMI):2、JavaBeans。,35,对象序列化(续),1、RMI:远程方法的调用使得本来存在于其他机器的对象可以表现出好象在本地机器上的行为。将信息发给远程对象时,需要通过对象序列化来传输参数和返回值。2、JavaBeans:对象的序列化也是JavaBeans必需的。使用一个Bean时,它的状态信息通常在设计期间配置好。程序启动以后,这种状态信息必须保存下来,以便程序启动后恢复,具体工作由对象系列化完成。,36,对象序列化(续),序列化的具体实现:为序列化一个对象,首先要创建某些OutputStream对象并将其封装到ObjectOutputStream对象内,调用writeObject()即可实现对象的序列化;相反,要恢复对象的原来信息是将一个InputStream对象封装到ObjectInputStream内,再调用readObject()。我们最后得到的是一个上溯造型Object句柄,所以我们必须下溯造型以便直接设置。在对一个可序列化对象进行重新装配的过程中,不会调用任何构造函数(甚至默认构造函数)。整个对象都是通过从InputStream中获取数据恢复的。,37,对象序列化(续),序列化的控制:默认的序列化机制实现很简单,但如果不希望对象的某一部分序列化或某一个子对象完全不必序列化,因为对象恢复以后,那一部分需要重新创建,例如密码,我们不希望它被序列化机制自动保存与恢复,因为即使被设为private属性,一旦经过序列化处理,就可以通过读取一个文件,或者拦截网络传输得到它。,38,对象序列化(续),为防止对象的敏感部分被序列化,一个方法是将自己的类实现为Externalizable,这样就没有任何东西可以自动序列化,只能在writeExternal()中明确指出需要序列化的部分。然而,若操作的是一个Serializable对象,所有序列化操作都会自动进行。为解决这个问题,可以用transient(临时)关键字逐个字段地关闭序列化。由于Externalizable对象默认时不保存它的任何字段,所以transient关键字只能伴随Serializable使用。,39,网络传输,主要内容:计算机地址InetAddress类客户端Socket类服务器ServerSocket类,40,网络传输(续),计算机地址InetAddress类getAddress():获得IP地址。(数组)getByName(Stringhost):根据机器名获得计算机的地址(返回InetAddress对象),host可以是机器名,也可以是数字地址,若为null,表示当前的计算机。getHostName():获得主机名。,41,网络传输(续),客户端Socket类Socket用来写客户端程序的类。所谓客户端程序,是指会向某一台计算机发出联机的请求,以便接收资料的程序,例如网页浏览器等。客户端程序会向服务器端计算机的某个连接端口发出联机的请求,等服务器端计算机同意联机后,便可以开始传送或接收资料。不同的服务器端与其相对的客户端,使用的连接端口通常不一样,否则会造成服务器端与客户端无法沟通的情形,所以你如果写一个自己独特的服务器端与客户端程序,最好选用一个其它程序没有用到的端口。,42,网络传输(续),服务器ServerSocket类ServerSocket是用来写服务器程序的类,所谓服务器程序,通常会监听某一个连接端口,如果有某一个客户端计算机发出联机的请求,则服务器就必须做出一个反应。例如网页服务器预设是监听编号为80的连接端口,当在某一台计算机上执行浏览器程序时,浏览器会向这个连接端口发出信号,网页服务器接收到后便会把网页的内容传过去。,43,习题,编写程序,输出自己计算机的地址及主机名。,44,多线程,线程:有时根据需要将一个程序转换成多个独立运行的子任务,每个子任务叫做一个“线程”。进程:一种“自包容”的运行程序,有自己的地址空间。“多任务”操作系统能同时运行多个进程(程序)但实际是由于CPU分时机制的作用,使每个进程都能循环获得自己的时间片。但由于轮换速度非常快,使所有程序好象是在“同时”运行一样。”线程”是进程内部单一的一个顺序控制流,因此,一个进程可能容纳了多个同时执行的线程。,45,多线程(续),多线程的应用条件:程序的一些部分同特定的事件或资源联系在一起,同时又不想为它而停止程序其它部分的执行,就可以考虑创建一个线程,令其与特定的事件或资源关联到一起,并让它独立与主程序运行。一个很好的例子就是”退出“按钮我们不希望在程序的每个部分都轮询这个按钮,同时又希望该按钮能及时地作出响应。实际上,多线程最主要的一个用处就是构造一个”反应灵敏“的用户界面。EJB不支持多线程。,46,多线程(续),创建一个线程的简单方法是从Thread类继承。这个类包含创建和运行线程所需的一切东西,其中最重要的方法是run().但为了使用run(),必须对其进行过载或覆盖。使其能充分按自己的吩咐行事,因此run()可与程序中其它线程”并发“或”同时“执行的代码。在一个程序(进程)中可以创建任意数量的线程,并通过为每个线程分配一个独一无二的编号(由一个静态变量产生),从而对不同的线程进行跟踪,run()方法每通过一次循环,计数就减1计数为0时循环结束。Run()采用一种无限循环的方式,如果不通过外部调用线程的stop()或destroy()方法,它会一直运行下去,直到程序结束。,47,JavaBean,JavaBeanJavaBean就是Java的可重用组件技术。对复杂的功能分离出来成为独立可重复利用的模块。利用JavaBean能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发)。,48,JavaBean(续),在VisualCafe中JavaBean的制作及应用:制作JavaBean将制作好的JavaBean保存为.jar文件1、“Project”Options”“Deployment”规定存储位置及文件名;2、“Project”AutoJAR”。将制作好的JavaBean加入到组件板中:在ComponentPallete上单击鼠标右键,选”CustomizePallete“,在左边下拉框中找到自己的Bean,点击”Add“。,49,JDBC,JDBC是用于执行SQL语句的Java应用程序接口,由一组用Java语言编写的类与接口组成,在JSP中将使用JDBC来访问数据库。JDBC是一种规范,它让各数据库厂商为Java程序员提供标准的数据库访问类和接口,这样就使得独立于DBMS的Java应用程序的开发工具和产品成为可能。一般的Java开发工具都带有JDBC-ODBC桥驱动程序,这样,只要是能够使用ODBC访问的数据库系统,也就能够使用JDBC访问了。,50,JDBC(续),准备工作1、引入包:importjava,sql.*;2、加载适当的驱动程序,例如:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);驱动程序名称3、与数据库创建连接,例如:Connectioncon=DriverManager.getConnection(“jdbc:odbc:tablesource”);数据库来源名称,51,JDBC(续),驱动程序管理员DriverManager类在用Class类的forName()加载适当的驱动程序,例如:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);后,系统自动向DriverManager注册说明现在已经有某个驱动程序可供使用了。我们可以一次加载许多驱动程序,在与数据库连接时,DriverManager会根据你的程序挑选适当的驱动程序来使用。DriverManager没有构造函数,它的所有方法都是静态的。,52,JDBC(续),*连接数据库Connection接口是DriverManager与数据库之间的桥梁,我们必须通过Connection创建的Statement、CallableStatement或PreparedStatement组件才能执行SQL指令。*执行SQL指令Statement接口用来执行SQL指令,如果指令会返回结果,则回产生一个ResultSet组件。要注意的是,一个ResultSet组件只能产生一组查询结果(ResultSet),即它只会保留最近一次产生的结果,如果想要产生两组以上的查询结果,则必须使用不同的Statement组件。,53,JDBC(续),*与Statement相似PreparedStatement接口执行SQL指令,在要保存的数据中有等字串时很方便,因为它可以将要保存的数据先用问号代替,只要在执行SQL指令前一一将问号代换成真正的数据就行了,而且可以重复使用。对那些有问号的SQL指令来说,后来要填入的真正数据就象参数一样。,54,JDBC(续),*记录查询结果ResultSet接口光标的移动方式:TYPE_FORWARD_ONLY:光标

温馨提示

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

评论

0/150

提交评论