1JAVA语言程序设计周敏彤zhoumintong@suda.edu.cn2第五讲类和对象1.面向对象概述面向对象的五个基本概念2.类的描述3.类成员的访问4.成员方法3面向对象概述面向对象编程的特点用客观世界中描述事物的方法来描述程序中要解决的问题万事万物都是对象程序便是成堆的对象,彼此通过消息的传递,请求其他对象进行工作4面向对象概述五个基本概念1.对象(object)2.消息(message)3.类(class)4.继承(inheritance)5.多态性(polymorphism)5面向对象概述1.对象(object)everythingisanobject现实世界的对象:桌子、书、自行车、电视、狗、文件、表格、按钮、窗口对象包含两个特性状态/属性(state):指对象本身的信息行为(behavior):实现对信息的访问自行车状态/属性:两个车轮、一些齿轮、速度、挡数行为:刹车、加速、减速和换挡书很多信息访问所包含信息的方法(一页一页的看,通过目录找到感兴趣的内容)6面向对象概述1.对象(object)状态变量(variables)行为方法(method)对象就是变量和相关方法的集合一个对象可以由其他对象组合而成窗口(按钮,菜单条,文本框,状态栏等)程序就是对象的集合,对象之间相互交互和通信完成任务搭积木Aprogramisabunchofobjectstellingeachotherwhattodobysendingmessages7面向对象概述1.对象(object)对象的组成:变量和方法变量状态信息数据仅通过该对象所提供的方法才能访问封装(encapsulation)对象本身的数据得到保护/隐藏其他对象仅仅需要知道对该对象的访问方法(接口/interface)即可封装的好处:模块化--每个对象的源文件可以是相互独立的,可以被不同的程序调用,每个对象是一块积木,可以搭建不同的形状信息隐藏--通常定义一个公共接口/方法实现对对象的访问,可以调整对象的私有信息和方法,而不会对其他调用它的对象产生影响黑盒子(电脑的DIY)8面向对象概述2.消息(message)对象之间的交互和通信是通过相互间发送消息来实现消息传递的实现消息的接收者(对象)接收对象所采用的方法方法所需的参数接收对象在执行相应的方法后返回给发送对象的信息以前程序的例子System.out.println();System.out.println(helloworld);9面向对象概述2.消息(message)Lightlt=newLight();lt.on();10面向对象概述3.类(class)概念的最早起源亚里士多德:theclassoffishesandtheclassofbirds现实世界中存在很多同类的对象,很多桌子、书、自行车类是一种原型(prototype)/一种抽象/一种共性/一个模板Everyobjecthasatype类的具体化/实例化(instance)就得到一个对象一个对象是类的一个特定实体类是对象的一种抽象表格(类)填入不同的个人信息不同的对象11面向对象概述classStudent{Stringname;doubletest1,test2,test3;}12面向对象概述classStudent{Stringname;doubletest1,test2,test3;doublegetAverage(){return(test1+test2+test3)/3;}}13面向对象概述publicclassStudent{privateStringname;publicdoubletest1,test2,test3;Student(StringtheName){name=theName;}publicStringgetName(){returnname;}publicdoublegetAverage(){return(test1+test2+test3)/3;}}Studentst1=newStudent(“ali”);st1.test1=89;st1.test2=65;st1.test3=70;System.out.println(st1.getAverage());14面向对象概述类和对象的关系类是对象的模板(template)/抽象一个对象是类的一个实例(instance)对象类实例化抽象15面向对象的基本概念4.继承(inheritance)为什么会有继承?建立一个类后,发现另一个新的类有相类似的特性,两个选择:重新定义一个新的类;在已有类的基础上进行扩展(增加或赋予新的特性)父类和子类子类继承(拥有)父类所有的数据和方法同时子类可以定义新的数据和方法“青出于蓝,而胜于蓝”树型结构(层次化结构)根(基类)16面向对象概述4.继承(inheritance)运输工具航空运输工具陆地运输工具水上运输工具人力驱动引擎驱动二轮四轮客运货运17面向对象的基本概念4.继承(inheritance)继承关系的表示18面向对象的基本概念4.继承(inheritance)继承和发扬继承父类的方法和变量添加新的方法/变量以及方法的重写(overriding)表达方式:extendsimportjava.applet.Applet;importjava.awt.Graphics;publicclassHelloWorldextendsApplet{publicvoidpaint(Graphicsg){g.drawString(Helloworld!,50,25);}}19面向对象的基本概念4.继承(inheritance)多重继承类A类B类C类D类F类G一个类拥有多个父类产生二义性,例类C和类D都有一个同名的方法,类G?JAVA中仅仅支持单一继承,同时JAVA采用Interface(接口)实现多重继承而避免父类二义性20面向对象的基本概念5.多态性(polymorphism)存在于子类和父类之间多个子类同属一个父类,所有子类有相同的父类(继承父类的方法)在不同的子类中同样的方法有不同的表现形式21面向对象的基本概念5.多态性(polymorphism)多态性的表示22面向对象的基本概念5.多态性(polymorphism)classSquareextendsShape{voiddraw(){System.out.println(Square.draw());}voiderase(){System.out.println(Square.erase()“);}}classTriangleextendsShape{voiddraw(){System.out.println(Triangle.draw());}voiderase(){System.out.println(Triangle.erase());}}classShape{voiddraw(){}voiderase(){}}classCircleextendsShape{voiddraw(){System.out.println(Circle.draw());}voiderase(){System.out.println(Circle.erase());}}23面向对象的基本概念5.多态性(polymorphism)publicclassTest{publicstaticShaperandShape(){switch((int)(Math.random()*3)){default:case0:returnnewCircle();case1:returnnewSquare();case2:returnnewTriangle();}}publicstaticvoidmain(String[]args){Shape[]s=newShape[9];for(inti=0;is.length;i++)s[i]=randShape();for(inti=0;is.length;i++)s[i].draw();}}Circle.draw()Triangle.draw()Circle.draw()Circle.draw()Circle.draw()Square.draw()Triangle.draw()Square.draw()Square.draw()24第五讲类和对象1.面向对象概述编程语言的发展面向对象的五个基本概念2.类的描述3.类成员的访问4.成员方法25程序是对象的集合,而对象是类的实例化源程序就是一个个的Java类JAVA本身提供的类(核心API)见JAVA文档中描述程序员可以对其进行调用j2sdk1.4.2_03\jre\lib\rt.jar(22.4MB)程序员如何定义自己所写的类类的描述26类的定义格式[类修饰符]class类名[extends父类名]implements[接口名]{类型成员变量1;类型成员变量2;………………类型成员方法1(参数1,[参数2,…]){方法体;}类型成员方法2(参数1,[参数2,…]){方法体;}………………}类的描述27定义一个Car类类的描述类声明开始classCar{类体privateStringBrand;privateintGas;成员变量Car(Strings,inti){Brand=s;Gas=i;}构造方法voidrun(){if(Gas0)Gas-=10;elseSystem.out.println(“没有油了!”);}成员方法run()voiddisplay(){System.out.println(“品牌:”+Brand+“油量:”+Gas);}成员方法display()类声明结束}28Car类的应用classTest{publicstaticvoidmain(Stringargs[]){Carmycar=newCar(“Audi”,10);mycar.display();mycar.run();System.out.println(“汽车正在运行!”);mycar.run();}}类的描述D:\javaTest品牌:Audi油量:10汽车正在运行!没有油了!D:\实例化一个对象mycar29类的定义格式[类修饰符]class类名[extends父类名][implements接口名]{………………}常见的类修饰符public:Declaresthattheclasscanbeusedbyanyclassregardlessofitspackage(无任何限制)无修饰:aclasscanbeusedonlybyotherclassesinthesamepackage(仅仅能被同一个包中的其他类引用)abstract:Declaresthattheclasscannotbeinstantiated(声明该类不能被实例化,抽象类,出现在继承关系中)final:Declaresthattheclasscannotbesubclassed(声明该类不能有子类)类的描述30包(package)的概念packageorg.jalpha;classtest{……}1.源文件位置:“D:\src\test.java”3.编译方法:“cdD:\src\”“javac–d.test.java”4.class文件位置:“D:\src\org\jalpha\test.class”5.运行:“cdD:\src\”“javaorg.jalpha.test”类的描述31包(package)的概念构成层次化的结构通过包来管理类名空间防止同名类名的冲突类的描述对个体(个人和机构)将类文件放在不同的目录下防止重名org\jalpha\name1\***.javaorg\jalpha\name2\***.javaABC公司Engine.javaXYZ