版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章面向对象本章内容编程语言的发展面向过程的设计思想面向对象的设计思想对象和类的概念类之间的关系对象和引用Java类的定义构造函数对象的创建和使用this关键字static关键字package和import语句类的继承方法的重写final关键字对象转型多态抽象类接口编程语言的发展机器语言---直接由计算机的指令组成,指令、数据、地址都是以“0”和“1”的符号串组成;可以被计算机直接执行。汇编语言---用容易理解和记忆的符号表示指令、数据以及寄存器等,抽象层次很低,程序员需要考虑大量的机器细节。高级语言---屏蔽了机器的细节,提高了语言的抽象层次,接近于人的自然语言,60年代出现的结构化编程语言提出了结构化数据和语句,数据和过程抽象等概念。面向对象的语言---与以往的各种语言的根本不同的是,它的设计出发点是为了更能直接的描述问题域中客观存在的事物。语言的发展是朝着人类更容易理解的方向前进面向对象设计的思想面向对象设计的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。面向对象更加强调运用人类在日常的思维逻辑中经常采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。面向过程的设计思想和面向对象的设计思想我要去新疆面向过程我开车,我挂档,我踩油门,我过河北,我过陕西……面向对象我命令车去新疆车怎么去不关我的事信息封存在车这个类的内部我不用去了解车整个开动的过程对象和类的概念对象是用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所具有的静态和动态属性。类可以看成一类对象的模板,对象可以看成该类的一个具体实例。类(对象)之间的关系之关联关系继承关系(一般和特殊)XX是一种XX聚合关系(整体和部分)实现关系多态课堂练习抽象出下面系统中的“类”及其关系我要去新疆,这句话中的类和方法是什么?Java与面向对象对象是Java程序的核心,在Java程序中“万事万物皆对象”。对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体。类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法。J2SDK提供了很多类供编程人员使用,编程人员也可以定义自己的类。我们的语言:成员变量=属性方法=函数为什么用对象?面向对象的编程---一组对象互相配合通过沟通完成特定功能所有paradigm(范例)都是对现实问题的抽象汇编是对机器语言的抽象面向过程的语言是对汇编语言的抽象对象更加符合对于现实问题的抽象对象都有对外服务的接口通过继承可以复用对象隐藏内部服务的实现通过聚合可以复用面向对象更加容易使我们达到这些年来苦苦追求的境界Reusable、Extensibility、维护和替换更加方便组件---比对象更高层次的抽象(二进制级别)EJB、WebService、CORBA、COM、…成员变量成员变量可以是Java语言中任何一种数据类型(包括基本类型和引用类型)。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。(右图)成员变量的作用范围为整个类体。Dog.java面向对象基本概念—引用
Java语言中除基本类型之外的变量型都称之为引用类型。
Java中的对象是通过引用对其操作的。例如:/**声明了一个String类型的引用变量,*但并没用使用它指向一个对象*/Strings;/*使用new语句创建了一个String类型的*对象并用s指向它,以后可以通过s完成*对其的操作*/s=newString(“Helloworld”);如何在内容中区分类和对象?类是静态的概念,在代码区对象是new出来的,位于堆内存,类的每个成员变量来自不同的对象中都有不同的值(除了静态变量),而方法只有一份,执行的时候才占有内存。对象的创建和使用必须使用new关键字创建对象。使用对象(引用).
成员变量来引用对象的成员变量。使用对象(引用).
方法(参数列表)来调用对象的方法。同一类的每个对象有不同的成员变量存储空间。同一类的每个对象共享该类的方法。类和对象的关系构造方法(构造函数)使用new+构造方法创建一个新的对象。构造函数是定义在Java类中的一个用来初始化对象的函数。构造函数与类同名且没有返回值。例如:Person类的构造函数publicclassPerson{intid;intage;Person(intn,inti){id=n;age=i;}}构造函数
创建对象时,使用构造函数初始化对象的成员变量。
publicclassTest{publicstaticvoidmain(Stringargs[]){Persontom=newPerson(1,25);Personjoin=newPerson(2,27);Personkate=newPerson();}}构造函数
当没有构造函数时,编译器为类自动添加形如类名(){}
的构造函数。例如:classPoint{publicintx;publicinty;}---Pointp=newPoint();---约定俗成的命名规则类名的首字母大写变量名和方法的首字母小写运用驼峰标识实例(1)//定义如下类:classBirthDate{ privateintday; privateintmonth; privateintyear; publicBirthDate(intd,intm,inty){ day=d;month=m;year=y; } publicvoidsetDay(intd){day=d;} publicvoidsetMonth(intm){month=m;} publicvoidsetYear(inty){year=y;} publicintgetDay(){returnday;} publicintgetMonth(){returnmonth;} publicintgetYear(){returnyear;} publicvoiddisplay(){ System.out.println(day+“–”+month+“–”+year); }}实例(2)publicclassTest{ publicstaticvoidmain(Stringargs[]){ Testtest=newTest(); intdate=9; BirthDated1=newBirthDate(7,7,1970); BirthDated2=newBirthDate(1,1,2000); test.change1(date); test.change2(d1); test.change3(d2); System.out.println(“date=”+date); d1.display(); d2.display(); } publicvoidchange1(inti){i=1234;} publicvoidchange2(BirthDateb){b=newBirthDate(22,2,2004);} publicvoidchange3(BirthDateb){ b.setDay(22); }}方法的重载方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。例如:在Person类中添加如下的方法:voidinfo(){System.out.println(“Myidis”+id);}voidinfo(Stringt){System.out.println(t+“”+id+”“+age);}//运行如下程序publicclassTest{publicstaticvoidmain(Stringargs[]){Personp=newPerson(1,20);();(“hello”);}}构造方法的重载与普通方法一样,构造方法也可以重载;例如:课本79页Student类的构造方法作业创建一个基本类Desk,描述桌子的长、宽、高和颜色属性,其中长、宽、高用double数据类型,颜色用String型。在基本类Desk中添加构造方法Desk(doublea,doublew,doubleh),用来在创建桌子对象时指定桌子的长、宽、高,颜色设置一个默认值“白色”。在基本类Desk中添加构造方法Desk(Stringc),用来在创建桌子对象时指定桌子的颜色,长款高都设置默认值1.0再加一个构造方法,通过长宽高和颜色四个属性来定制桌子在测试类中创建长为1.2,宽为2.5,高为1.0,颜色为黄色的桌子,添加输出语句在控制台上显示该桌子的长宽高和颜色。复习:对象的创建和使用必须使用new关键字创建对象。使用对象.成员变量来引用对象的成员变量。使用对象.方法(参数列表)来调用对象的方法。同一类的每个对象有不同的成员变量存储空间。同一类的每个对象共享该类的方法。非静态方法是针对每个对象进行调用变量的分类和作用域局部变量:定义在块内、方法内的变量(包括方法的参数)。作用域是以块和方法为单位的,仅在定义该变量的块或方法内有效先定义赋值,然后再使用,不可以超前使用在查找时,首先被查找。若局部变量与类成员变量名相同时,则该类成员变量在方法体内被暂时“屏蔽”起来。方法体内不能定义静态变量。类成员变量:定义在类内、方法外的变量,使用了修饰符static的变量是静态变量,也称为类变量。作用域是以类为单位的一般情况下,类成员变量应该先定义后使用。但类成员变量可以超前引用,即在定义位置前引用,但静态变量不能超前引用静态变量。注意:类外面不能有变量的声明this关键字在类的方法定义中使用的this关键字代表使用该方法的对象的引用。当必须指出当前使用方法的对象是谁时要使用this。有时使用this可以处理方法中成员变量和参数变量重名的情况。this可以看作是一个变量,它的值是当前对象的引用。可以使用this调用本类的其他构造方法,但该语句出现的位置要求是所隶属的构造方法的第一条可执行语句。Leaf.javaBall.javathis使用方法总结利用this.可以调用当前对象的方法或属性。一个类的若干构造方法之间可以互相调用,当一个构造方法需要调用另一个构造方法时,应使用this(实参列表),同时这条调用语句应该是整个构造方法中的第一条可执行语句。在利用this调用构造方法时,根据实参的个数匹配调用的是那个其他的构造方法。当方法需返回当前正在讨论的对象时,可以使用returnthis形式。static关键字在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。可以通过对象引用或类名(不需要实例化)访问静态成员。Cat.javaEmpTest.java静态初始化器静态属性和非静态属性都需要初始化,非静态属性的初始化可以在声明的同时进行,也可以放在构造方法中完成。而对于静态属性,这两种方式的初始化效果不同。Student.java作为静态属性,可以在静态初始化器中完成初始化静态属性可以在两个地方完成初始化赋值工作,一是在声明时,二是在静态初始化器中。语法如下:static{
静态属性名=初始值;}package和import语句为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重命名空间。package和import语句package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:packagepkg1[.pkg2[.pkg3…]];Java编译器把包对应于文件系统的目录管理,package语句中,用‘.’来指明包(目录)的层次,例如使用语句packagecom.sww;则该文件中所有的类位于.\com\sww目录下设置Classpath变量javac–d.Book.javapackage和import语句如果将一个类打包,则使用该类时,必须使用该类的全名(例如:com.sww.MyClass),Java编译器才会找到该类。也可以使用import在文件的开头引入要使用到的类,例如:可以不需要用import语句直接使用java.lang包中的类。
importcom.sww.MyClass;importjava.util.*;//引入java.util包中的所有的类
………MyClassmyClass=newMyClass();//可以直接使用类名
………packageimport总结如果想将一个类放入包中,在这个类源文件第一句话写package必须保证该类的class文件位于正确目录下该类的源码可能会产生影响删除或转移到另外的目录另外的类想访问的话:写全名引入.具体类名访问位于同一个包中的类不需要引入必须使class文件的最上层包的父目录位于classpath下J2SDK中主要的包介绍java.lang—包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用的功能。java.awt---包含了构成抽象窗口工具类(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。java.applet—包含applet运行所需的一些类。—包含执行与网络相关的操作的类。java.io—包含能提供多种输入/输出功能的类。java.util—包含一些使用工具类,如定义系统特性、使用与日期日历相关的函数。jar-cvfxx.jar*.*类的继承与权限控制Java中使用extends关键字实现类的继承机制,其语法规则为:
<modifier>class<name>[extends]<superclass>]{……}通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。java只支持单继承,不允许多继承;一个子类只能有一个基类一个基类可以派生出多个子类//继承中的权限控制classParent{privateintn_private=1;intn_friendly=2;protectedintn_protected=3;publicintn_public=4;}classChildextendsParent{publicvoidf(){n_private=10;n_friendly=20;n_protected=30;n_public=40;}}访问控制Java权限修饰符publicprotectedprivate置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。对于class的权限修饰只可以用public和defaultpublic类可以在任意地方被访问
default类只可以被同一个包内部的类访问Rectangle.javaCubic.java继承中的访问修饰符父子类在同一包中定义子类可以无条件地继承父类的所有非私有属性父子类在不同包中定义只有父类中被public和protected修饰的属性能被子类继承下来父类中缺省修饰符修饰的属性不能被子类所引用方法的重写在子类中可以根据需要对从基类中继承来的方法进行重写。重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。重写方法不能使用比被重写方法更严格的访问权限。TestOverWrite.javasuper关键字在Java中使用super来引用基类的成分;例如:
classFatherclass{publicintvalue;publicvoidf(){value=100;system.out.println(“FatherClass.value=”+value);}}classChildClassextendsFatherClass{publicintvalue;publicvoidf(){super.f();value=200;System.out.println(“ChildClass.value=”+value);System.out.println(value);System.out.println(super.value);}}TestInherit.java继承中的构造方法子类的构造过程中必须调用其基类的构造方法。子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法。使用this(argument_list)调用本类的另外的构造方法如果使用super,必须写在子类构造方法的第一行如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。TestSuperSub.java课堂练习classA{ protectedvoidprint(Strings){ System.out.println(s); } A(){print(“A()”);} publicvoidf(){print(“A:f()”);}}classBextendsA{ B(){super();print(“B()”);} publicvoidf(){print(“B:f()”);} publicstaticvoidmain(Stringargs[]){ Bb=newB();b.f(); }}
分析输出结果,体会构造函数和一般成员函数在继承中的区别。OverWriteOverRide实例(1)classPerson{ privateStringname; privateStringlocation; Person(Stringname){ =name; location=“beijing”; } Person(Stringname,Stringlocation){ =name; this.location=location; } publicStringinfo(){ return“name:“+name+”location:“+location; }}classStudentextendsPerson{ privateStringschool; Student(Stringname,Stringschool){ this(name,school,”beijing”); }
Student(Stringn,Stringl,Stringschool){ super(n,l); this.school=school; } publicStringinfo(){ ()+”school:“+school; }}实例(2)publicclassTest{ publicstaticvoidmain(String[]args){ Personp1=newPerson(“A”); Personp2=newPerson(“B”,”shanghai”); Students1=newStudent(“C”,”S1”); Students2=newStudent(“C”,”shanghai”,”S2”); System.out.println(()); System.out.println(()); System.out.println(()); System.out.println(()); }}分析输出结果和对象的构造过程:课堂练习根据上面的程序,构造“Teacher”类,继承“Person”类。要求:增加”职称(String)”属性.具有和”Student”类类似的重载构造方法.重写“Person”类的info()方法,增加职称信息.Object类Object类是所有Java类的根基类如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
publicclassPerson{…….}
等价于:
publicclassPersonextendsObject{……}toString方法Object类中定义有publicStringtoString()方法,其返回值是String类型,描述当前对象的有关信息。在进行String与其它类型数据的连接操作时(如:System.out.println(“info”+person)),将自动调用该对象类的toString()方法可以根据需要在用户自定义类型中重写toString()方法。TestToString.javaequals方法Object类中定义有:publicbooleanequals(Objectobj)方法提供定义对象是否“相等”的逻辑。Object的equals方法定义为:x.equals(y)当x和y是同一个对象的引用时返回true否则返回falseJ2SDK提供的一些类,如String,Date等,重写了Object的equals方法,调用这些类的equals方法,x.equals(y),当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回true否则返回false。可以根据需要在用户自定义类中重写equals方法。TestEquals.java对象转型(casting)一个基类的引用类型变量可以“指向”其子类的对象。一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)对象转型实例1(1)classAnimal{ publicStringname; Animal(Stringname){ =name; }classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n);eyeColor=c; }}classDogextendsAnimal{ publicStringfurColor; Dog(Stringn,Stringc){ super(n);furColor=c; }}对象转型实例1(2)publicclassTest{ publicstaticvoidmain(Stringargs[]){ Animala=newAnimal(“name”); Catc=newCat(“catname”,”blue”); Dogd=newDog(“dogname”,”black”); System.out.println(ainstanceofAnimal);//true System.out.println(cinstanceofAnimal);//true System.out.println(dinstanceofAnimal);//true System.out.println(ainstanceofCat);//false a=newDog(“bigyellow”,“yellow”); System.out.println();//bigyellow System.out.println(a.furColor);//!error System.out.println(ainstanceofAnimal);//true
System.out.println(ainstanceofDog);//true Dogd1=(Dog)a;//要加强制转换符
System.out.println(d1.furColor);//yellow }}对象转型实例2publicclassTest{ publicstaticvoidmain(String[]args){ Testtest=newTest(); Animala=newAnimal(“name”); Catc=newCat(“catname”,“blue”); Dogd=newDog(“dogname”,”black”; test.f(a);test.f(c);test.f(d); } publicvoidf(Animala){ System.out.println(“name:“+); if(ainstanceofCat){ Catcat=(Cat)a; System.out.println(““+cat.eyesColor+”eyes”); }elseif(ainstanceofDog){ Dogdog=(Dog)a; System.out.println(““+dog.furColor+”fur”); } }}动态绑定和多态动态绑定是指在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。上面例子中,根据Lady对象的成员变量pet所引用的不同的实际类型而调用相应的enjoy方法。classBirdextendsAnimal{ privateStringfeatherColor; Bird(Stringn,Stringf){ super(n); featherColor=f; } publicvoidenjoy(){ System.out.pringln(“鸟叫声……”); }publicclassTest{ publicstaticvoidmain(Stringargs[]){ Ladyl3=newLady(“l3”,newBird(“birdname”,”green”); ls.myPetEnjoy(); }}动态绑定使软件可扩展性达到极致,三个条件:1要有继承2要有重写3父类引用指向子类对象TestPolymoph.java抽象类用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。抽象类不能被实例化抽象方法只需声明,而不需实现。abstractclassAnimal{privateStringname;Animal(Stringname){=name;}publicabstractvoidenjoy();}classCatextendsAnimal{privateStringeyesColor;Cat(Stringn,Stringc){super(n);eyesColor=c;}publicvoidenjoy(){System.out.println(“猫叫声……”);}}final关键字final的变量的值不能够被改变final的成员变量final的局部变量(形参)final的方法不能够被重写final的类不能够被继承String,Math等类都属于finalTestFinal.java接口接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口定义举例:publicinterfaceRunner{publicstaticfinalintid=1;publicvoidstart();publicvoidrun();publicvoidstop();}接口特性接口可以实现多重实现;接口中声明的属性默认为publicstaticfinal的;也只能是publicstaticfinal的;接口中只能定义抽象方法,而且这些方法默认为public的、也只能是public的;接口可以继承其他的接口,并添加新的属性和抽象方法。接口多个无关的类可以实现同一个接口。一个类可以实现多个无关的接口。与继承关系类似,接口与实现类之间存在多态性。定义Java类的语法格式
<modifier>class<name>[extends<superclass>][implements<interface>[,<interface>]*]{<declarations>*}接口举例interfaceSinger{publicvoidsing();publicvoidsleep();}classStudentimplementsSinger{privateStringname;Student(Stringname){=name;}publicvoidstudy(){System.out.println(“studying”);}publicStringgetName(){returnname;}publicvoidsing(){System.out.println(“studentissinging”);}publicvoidsleep(){System.out.println(“studentissle
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿项目式学习与探究能力考核试卷
- 时尚市场的市场细分与定位考核试卷
- 广告创作与互动媒体考核试卷
- 活动临时附加合同范例
- 政府工程欠款合同范例
- 熊猫居间协议合同模板
- 亲子服务合同模板
- 灯箱制作安装合同模板
- 抖音项目合同范例
- 改造光纤工程合同模板
- DSM-5量表(ADHD)
- BAS建筑设备监控系统施工调试方法及程序
- 物业合资公司组建方案
- 《埃博霉素生物合成》PPT课件.ppt
- 风光摄影教程
- 山东省义务教育必修地方课程小学五年级上册《环境教育》教案 全册精品
- 最实用七年级语文语法:词性实词、虚词部编本
- 《正确的写字姿势》PPT课件.ppt
- 汽车类西班牙语词汇
- 检维修风险分析记录10001
- 海拉EPS角度传感器ppt课件
评论
0/150
提交评论