资源预览内容
第1页 / 共71页
第2页 / 共71页
第3页 / 共71页
第4页 / 共71页
第5页 / 共71页
第6页 / 共71页
第7页 / 共71页
第8页 / 共71页
第9页 / 共71页
第10页 / 共71页
亲,该文档总共71页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
课程回顾n类的定义n对象的创建。强调只有创建了对象以后才可以对其进行调用n构造方法n对象的生命周期n方法的重载n方法间的参数传递新的问题n我们研究了类和对象,知道了对象在内存中的存储方式。那么大量相同的对象又是如何管理的呢?n生活中我们总是需要保存大量的数据集合,如一个班级学生的数据,那么如何对这些集合数据进行表示?n数组数组n一维数组n二维数组数组数组一维数组:定义一维数组:定义n一维数组的定义方式为:ntype arrayName ; n其中类型(type)可以为Java中任意的数据类型,包括简单类型和组合类型,数组名arrayName为一个n合法的标识符, 指明该变量是一个数组类型变量。n例如: nint intArray ;声明了一个整型数组,数组中的每个元素为整型数据。数组数组一维数组:定义一维数组:定义n我们还可以定义一个复合类型的数组,例如:nDate dateArray ;n声明了一个容纳复合数据类型Date的数组。nJava在数组的定义中并不为数组元素分配内存,因此 中不用指出数组中元素的个数,即数组长度,而且对于如上定义的一个数组是不能访问它的任何元素的。nJAVA中是把数组当作对象来处理的,也就是中是把数组当作对象来处理的,也就是说必须经过创建对象并初始化后,才能应用数说必须经过创建对象并初始化后,才能应用数组的元素。组的元素。数组数组一维数组:定义一维数组:定义n除了这种定义数组的方式之外,java语言还提供了其他的定义形式,如下所示:ntype arrayName;n 对于以上举出的例子,我们也可以这样定义:nint intArray;nDate dateArray;数组数组一维数组:初始化一维数组:初始化n一维数组定义之后,必须经过初始化才一维数组定义之后,必须经过初始化才可以引用。数组的初始化分为静态初始可以引用。数组的初始化分为静态初始化和动态初始化两种:化和动态初始化两种:n静态初始化:静态初始化:在定义数组的同时对数组元素进行初始化,例如:nint intArray =1,2,3,4;/定义了一个含有4个元素的int型数组。数组数组一维数组:初始化一维数组:初始化n动态初始化:动态初始化:使用运算符new为数组分配空间,n对于简单类型的数组,其格式如下:n type arrayName =new typearraySize;n type arrayName=new typearraySize;n对于复合类型的数组,需要经过两步空间分配。n首先: type arrayName =new typearraySize;n然后:arrayName0=new type(paramList);n n arrayNamearraySize-1=new type(paramList);数组数组一维数组:初始化一维数组:初始化n例如:例如:nString stringArrar; /定义一个String类型的数组nstringArray = new String3; /给数组stringArray分配3个应用 /空间,初始化每个引用值为nullnstringArray0=new String(“how”);nstringArray1=new String(“are”);nstringArray2=new String(“you”);数组数组一维数组:引用一维数组:引用n当定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。元素的引用方式为: narrayNameindexnindex为数组下标,可以是整型常数或表达式,如:arrayName1, arrayNamei, arrayName6*i等。n下标是0序的,即从0开始,一直到数组长度减1。数组数组一维数组:边界检查一维数组:边界检查nJava对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度,例如:nintArray.length指明数组intArray的长度。 数组数组一维数组:示例一维数组:示例npublic class ArrayTest n public static void main( String args ) n int i;n int a = new int5;n for( i=0; i=0; i- ) n System.out.println(a+i+ = +ai);n n n 数组数组一维数组:示例一维数组:示例n运行结果为:nC:java ArrayTest na4 = 4na3 = 3 na2 = 2 na1 = 1na0 = 0示例n整数数组中查找一个指定的数据n思路:n1,定义一个查找方法n2,主方法中定义数组并初始化数组数组二维数组二维数组nJava中的数组是一种复合数据类型,其每个元素的数据类型都是相同的,数据元素可以是基本类型,复合类型(类对象),还可以是数组.n当数组的元素又是数组时,就构成了多维数组。多维数组都被看作数组的数组。比如二维数组是一个特殊的一维数组,其每一个元素又是一个一维数组。n我们仅研究二维数组,高维数组与此类似。数组数组二维数组:定义二维数组:定义n二维数组的定义方式ntype arrayName ; n例如:nint intArray ; n也可以采用另一种定义方式:ntype arrayName;n与一维数组一样,这时对数组元素也没有分配内存空间,同样要使用运算符new来分配内存,然后才可以访问每个元素。数组数组二维数组:初始化二维数组:初始化n二维数组的初始化也分为静态和动态两种。n静态初始化:静态初始化:在定义数组的同时为数组分配空间。nint intArray =1,2,2,3,3,4;n不必指出数组每一维的大小,系统会根据初始化时给出的初始值的个数自动算出数组每一维的大小。数组数组二维数组:初始化二维数组:初始化n动态初始化:动态初始化:对高维数组来说,分配内存空间有下面两种方法:n1.直接为每一维分配空间,如:ntype arrayName =new typearraylength1arraylength2n例如:nint a =new int23;数组数组二维数组:初始化二维数组:初始化n2.从最高维开始(而且必须从最高维开始),分别为每一维分配空间,如:nint data =new int ;ndata0=new int2;ndata1=new int3;ndata00=15;ndata01=19;ndata10=12;ndata11=76;ndata12=98;数组数组二维数组:初始化二维数组:初始化nJava中允许二维数组中每行的元素个数不同,即每行的列数可以不同.n如前例数组数组二维数组:引用及示例二维数组:引用及示例n二维数组的引用二维数组的引用n对二维数组中每个元素,引用方式为: narrayNameindex1index2n其中index1和index2为数组下标,为整型常数和表达式,都是0序的。n二维数组举例二维数组举例二维数组示例n在一个表中,二维数组查找一个数;n在二维数组中指定不同行的长度,理解多维数组的组织形式.n多维数组都被看作数组的数组。比如二维数组是一个特殊的一维数组,其每一个元素又是一个一维数组。二维数组示例npublic class Ex3_3 n public static void main(String args) n int a = 12, 1, 2, 3, 4, 4, 56, 7, 4, 6, 77, 6, 23, 5, 34;n int temp = 99;n int i=0;n loop: for ( i = 0; i a.length; i+) n for (int j = 0; j ai.length; j+) n if (aij = temp) n System.out.println(找到 + temp + 在第 + i + 行,第 + j + 列);n break loop;n n n n if(i=a.length)n System.out.println(找不到);n n n数组小结n一维数据n二维数组,数组的元素又是数组n数组是当作对象来处理的课程回顾n对象的调用前必须创建对象 static:类变量和类方法:类变量和类方法n分析如下程序的问题nclass StaticErrorn String mystring=“hello”;n public static void main(String args) n System.out.println(mystring);n nn为什么会产生这个的错误?n那是因为,类是一般特性的描述,是一个抽象的概念。对象才是实实在在的实例 static:类变量和类方法:类变量和类方法n当我们编写一个类时,其实是在描述其对象的属性和行为,而并没有产生实质的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存单位,对象才可以供外部调用。n有的时候我们希望无论是否产生了对象,或是产生了多少对象,某些特定的数据在内存中只有一份,例如所有的中国人都有国家名称,每个中国人都共享这一国家名称。不必为每个中国人的实例对象单独分配一个用于代表国家名称的变量。 static:类变量和类方法:类变量和类方法nclass Chinesenstatic String country=“中国”;nString name;nint age;nvoid singOurCountry()nSystem.out.println(“啊!,亲爱的”+country);nn static:类变量和类方法:类变量和类方法n虽然在各个实例对象中没有分配country这个变量,但是我们可以程序中通过中国人的实例对象来访问这个变量。n我们还可以直接使用类名来访问这个变量。 static:类变量和类方法:类变量和类方法nclass TestChinesenpublic static void main(String args)nSystem.out.println(“我们的国家叫”+Chinese.country);n/上面的程序代码直接用了类名.成员这样的格式nchinese ch1=new chinese();nSystem.out.println(“我们的国家叫”+ch1.country);nch1.singOurCountry();nn static:类变量和类方法:类变量和类方法类变量类变量的生存期不依赖于对象我们不能把任何方法体内的变量声明的静态的如下面这样是不行的:fun()static int i=0;用static标识符修饰的变量,它们在类被载入的时候创建,只要类存在,staitc变量就存在。Java名字空间及访问规则名字空间及访问规则 static:类变量和类方法:类变量和类方法n由于静态成员变量能被所有对象所共享,所以我们可以用它来实现一些特殊的效果。如果我们想统计在程序运行中一共产生了多少个实例对象,我们可以用下面的方法nclass Anprivate static int count=0;npublic A()ncount=count+1;nn static:类变量和类方法:类变量和类方法 回到开始的问题,不正确的引用回到开始的问题,不正确的引用class StaticError String mystring=“hello”; public static void main(String args) System.out.println(mystring); 编译时错误信息: nonstatic variable mystring cannot be referenced from a static context “System.out.println(mystring);”。为什么不正确:只有对象的方法可以访问对象的变量。 static:类变量和类方法:类变量和类方法n解决的办法1. 将变量改成类变量将变量改成类变量class NoStaticError static String mystring=“hello”; public static void main(String args) System.out.println(mystring); Java名字空间及访问规则名字空间及访问规则 static:类变量和类方法:类变量和类方法n解决的办法2. 先创建一个类的实例先创建一个类的实例class NoStaticError String mystring=“hello”; public static void main(String args) NoStaticError noError; noError = new NoStaticError(); System.out.println(noError.mystring); static:类变量和类方法:类变量和类方法n在使用静态方法时要注意如下几点:n1、在静态方法里只能直接调用类中其它在静态方法里只能直接调用类中其它的静态成员(包括变量和方法),而不的静态成员(包括变量和方法),而不能直接访问类中的非静态成员能直接访问类中的非静态成员。这是因为对象非静态的方法和变量,需要先创建一个类的实例对象后才可以使用,而静态的方法在使用前不用创建任何对象。 static:类变量和类方法:类变量和类方法n2、静态方法不能以任何方式引用静态方法不能以任何方式引用this和和super关键字关键字,原因和上面一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。n3、main()方法是静态的,因此java虚拟机在执行main方法时不创建main方法所在的类的实例对象,因此在main方法中不能直接访问该类方法中不能直接访问该类是的非静态的成员,是的非静态的成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。 static:类变量和类方法:类变量和类方法面向对象的三大特性n封装n继承n多态面向对象的三大特性面向对象的三大特性(一)(一)封装封装n封装把对象的所有组成部分组合在一起.私有数据私有数据 方法方法 方法方法数据数据对象对象A对象对象B公有数据公有数据封装定义程序如何引用对象的数据。封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。面向对象的三大特性面向对象的三大特性(一)(一)封装封装nclass personnprivate int age;npublic void setAge(int i)nif (i130) return;nage=i;nnpublic int getAge()nreturn age;nnpublic class TestPersonnpublic static void main(String args)nperson P1=new person();np1.setAge(3);nSystem.out.println(p1.getAge();nn面向对象的三大特性面向对象的三大特性(一)(一)封装封装n一个类就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容.n强内聚弱藕合。在进行程序的详细设计时,应尽量避免一个模块直接修改或操作别一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外界干预),弱藕合(提供给外界尽量少的方法调用). 由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。 类是java中的封装特性的一种,包同样也现了java面向对象编程的特性的封装机制。 类的访问权限两种public和默认的,当为默认时只能被同一包的其他类访问。 类成员的访问权限:public,protected,缺省,private封装-包和访问权限包和访问权限 打包 Java中用package语句来将一个Java源文件中的类打成一个包。package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:package pkg1.pkg2.pkg3; Java编译器把包对应于文件系统的目录管理,package语句中,用 . 来指明目录的层次。封装-包和访问权限包和访问权限为了能使用Java中已提供的类,我们需要用import语句来引入所需要的类。import package1.package2.(classname |*);例如:import myclass.graphics.*;import java.io.*;myclasspathSquaregraphics封装-包和访问权限包和访问权限n当一个类可以被访问时,对类内的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。 同一个类中 同一个包中 不同包中的子类 不同包中的非子类(任意类)privatedefaultprotectedpublic封装-包和访问权限包和访问权限 public: 任何其它类、对象只要可以看到这个类的话,那么任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。它就可以存取变量的数据,或使用方法。 protected:同一类,同一包可以使用。不同包的类要使用,:同一类,同一包可以使用。不同包的类要使用,必须是该类的子类。必须是该类的子类。 private:不允许任何其他类存取和调用。:不允许任何其他类存取和调用。 friendly(default,前边没有修饰字的情况,前边没有修饰字的情况):在同一程序包:在同一程序包中出现的类才可以直接使用它的数据和方法中出现的类才可以直接使用它的数据和方法.封装-包和访问权限包和访问权限n关于protected 和friendly(default)的实例)的实例npackage ch3.pac1;npublic class Sam1 n protected double area(double length,double width)n return length*width;n n封装-包和访问权限包和访问权限封装-包和访问权限包和访问权限nimport ch3.pac1.Sam1;npublic class Sam2 extends Sam1npublic static void main(String args)ndouble c1=1.3;ndouble c2=2.3;nSam2 s2=new Sam2();nSystem.out.println(s2.area(c1,c2);n n面向对象的三大特性(二)继承n继承:即子类可以继承父类的属性和方法,以实现代码复用。n是面向对象技术贴近自然,贴近人才思维习惯的又一例证。n通过继承可以简化类的定义 。n继承而得到的类为子类,被继承的类为父类,通过在类的声明中加入extends子句来创建一个类的子类:nclass SubClass extends SuperClassnnn面向对象的三大特性(二)继承n示例:n动物(属性:名字,年龄,动作:叫,跑)n猫(逮耗子)n狗(看家)n狼狗面向对象的三大特性(二)继承nJava只支持单继承,不允许多重继承。 n可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。 n例如:狼狗类,不能继承狼,又同时继承狗面向对象的三大特性(二)继承n子类可以继承在同一个包中父类中访问权限设定为public、 protected、 default的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。n若父类和子类在不同的包中,则只能继承父类中访问权限设定为public、 protected的成员变量和方法。nJava中有一个比较特殊的类,就是Object,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承Object类。nObject类是java类层中的最高层类,是所有类的超类。面向对象的三大特性(二)继承n何时选择继承?一个很好的经验:“B是一个A吗?”如果是则让B做A的子类.常犯的错误常犯的错误A有一个有一个B吗吗? 例如让汽例如让汽车轮子成为汽车的子类是错误的车轮子成为汽车的子类是错误的如果父类不允许通过继承产生的子类访问它的某些如果父类不允许通过继承产生的子类访问它的某些成员,那么父类中必须以成员,那么父类中必须以private方式声明这些成员方式声明这些成员面向对象的三大特性面向对象的三大特性(二)(二)继承继承n子类对父类构造函数的继承和调用n子类无条件地继承父类不含参数的构造函数,当通过子类不含参数的构造函数创建子类对象时,先执行父类不含参数的构造函数,再执行子类的不含参数的构造函数。n如果子类调用父类的构造函数,则通过super()调用来实现n如果一个类要被继承,则需加上无参数的构造方法,示例。面向对象的三大特性(二)继承面向对象的三大特性(二)继承n方法的重写n有继承也就有批判-方法的覆盖(重写)n覆盖使得在子类中可以重新定义父类中已有的方法,从而体现出子类自己的行为。n重写方法的调用n对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。(动态邦定)n子类重新定义从父类继承来的同名变量称为变量的隐藏,即子类同名变量隐藏了父类的同名变量n方法的重写与方法的重载有什么区别?面向对象的三大特性(二)继承n示例动物(属性:名字,年龄,动作:叫,跑)猫(逮耗子,自己的方法)狗(看家,自己的方法)面向对象的三大特性(二)继承npublic class Animal n String name;n int age;npublic void run()n System.out.print(我们动物都能运动);nnpublic void say()n System.out.print(我们动物都能发出声音);nn面向对象的三大特性(二)继承npublic class Cat extends Animalnpublic void catchmouse()n System.out.print(我最大的特点就是能带老鼠);nnpublic void say()n System.out.print(我们猫发出的声音是“喵喵”);nn面向对象的三大特性(二)继承npublic class Dog extends Animalnpublic void watch()n System.out.print(我最大的特点就能看家护院);nnpublic void say()n System.out.print(我们狗发出的声音是“汪汪”);nn public void run()nn面向对象的三大特性(二)继承npublic class TestAnimal npublic static void main(String args)n TestAnimal t=new TestAnimal();n Cat c=new Cat();n t.doRun(c);n t.doSay(c);nnpublic void doRun(Animal a)/理解动态绑定n a.run();nnpublic void doSay(Animal a)/理解动态绑定n a.say();nnn面向对象的三大特性(二)继承nSuper关键字关键字n子类若要引用父类的同名变量和方法,要用super关键字。nsuper指这个对象的父类。Super也可以用来引用父类中的构造方法。npublic class apple extends fruitsnn public apple(int price)n n super(price);n super.var = value;n super.method(paraList);n n以上程序表示使用父类的构造方法生成实例,super必须是子类构造方法的第一条语句。面向对象的三大特性(三)多态n理解多态:n系统根据运行时的情况来决定做什么操作,就是前面我们所提到的“动态邦定”,比如doSay(Animal a)方法,在实际运行中根据传过来的的对象不同发出不同的叫声。这种多态也叫运行时多态。面向对象的三大特性(三)多态n所谓多态,即同一个事物所表现出来的多种状态,例如动物这一般都可以发出叫声,但是狗发的叫声是“汪汪”,猫发出的叫声是“喵喵”。多态性是面向对象的程序设计的一个重要特性。面向对象的三大特性(三)多态n多态一:Java语言中的多态性表现之一是允许出现重名现象,在同一个类中允许完成不同功能的多个方法使用同一个名字,但其参数列表不同,即方法重载。这种也叫编译时多态。面向对象的三大特性(三)多态n多态二:另一种多态是系统根据运行时的情况来决定做什么操作,就是前面所提到的“动态绑定”。n比如在某个方法中调用动物的say(Animal a)方法,在实际运行中根据传过来的对象不同发出不同的叫声,传递的Dog类的对象,发出“汪汪”的声音,传递的Cat类对象,发出“喵喵”的声音。n这种多态也叫运行时多态。运行是多态建立在方法重写的基础上。面向对象的三大特性(三)多态n后续的抽象类和接口中还会继续去理解多态n1、子类转换成父类n自动转换,如前例中Dog或Cat类对象,自动转换成Animal类对象子类父类转换子类父类转换n2、父类转换成子类n当父类对象转换为子类对象时,必顺要强制类型转换。转换格式为:n(子类名)父类对象n父类对象向子类对象强制转换时,通常用运算符instancedof判断要转换的对象是否为子类对象,如果不是刚不能转换,否则程序会产生错误。子类父类转换子类父类转换npublic class TestAnimal npublic static void main(String args)n TestAnimal t=new TestAnimal();n Cat c=new Cat();n t.doteshe(c);nnpublic void doteshe(Animal a)n if(a instanceof Dog)n Dog d =(Dog)a;n d.watch();nelse if(a instanceof Cat)n Cat c =(Cat)a;n c.catchmouse();n
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号