单元3 认识类与对象ppt课件.ppt

上传人:春哥&#****71; 文档编号:15236630 上传时间:2022-05-11 格式:PPT 页数:61 大小:1.99MB
返回 下载 相关 举报
单元3 认识类与对象ppt课件.ppt_第1页
第1页 / 共61页
单元3 认识类与对象ppt课件.ppt_第2页
第2页 / 共61页
点击查看更多>>
资源描述

《单元3 认识类与对象ppt课件.ppt》由会员分享,可在线阅读,更多相关《单元3 认识类与对象ppt课件.ppt(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、在此输入您的封面副标题单元3 认识类与对象JAVA 程序设计程序设计单元三单元三 认识类与对象认识类与对象v学习目标:学习目标: 理解面向对象编程的基本特点 理解类与对象的含义 掌握类与对象的使用 掌握构造方法的使用 掌握方法重载技术 理解访问控制修饰符的作用 任务一任务一 用程序描述学生特性用程序描述学生特性1任务二任务二 计算两点之间的距离计算两点之间的距离2任务三任务三 复数的加法运算复数的加法运算3拓展任务拓展任务4任务一任务一 用程序描述学生特性用程序描述学生特性 v一、任务描述描述一个“对象”,首先就应该考虑这个对象“有什么”和“做什么”这两个基本问题,也就是描述一个对象最基本的“

2、属性”与“行为”。本任务将用程序描述“学生”这个现实世界里常见的事物,描述学生所具有的属性和功能,即学生的基本信息和输出其自我介绍信息。v 1.声明学生类声明学生类(1)设计学生类)设计学生类Student类是对象的抽象。一个学生最基本的属性有:姓名、学号、性别、年龄等,若要建立一个描述学生的类,自然需要实现这些属性。以下便是建立学生类Student的代码。class StudentString name,no;char gender;int age;扩充Student类为vclass StudentvvString name,no;vchar gender;vint age;vvoid se

3、tStu(String n,String o,char g,int a)/设置学生信息的成员方法vvname=n;no=o;gender=g;age=a;vvvoid selfIntro()/学生自我介绍的成员方法vv(我是+name);v(我的学号是+no);vif (gender=M)v(我是男孩);velsev(我是女孩);v(我今年+age+岁);vvvStudent类的结构如图3.1所示。 v (2)声明类的通用格式)声明类的通用格式声明一个类,首先需要确定两个问题“有什么”以及“做什么”,即定义类的成员变量和成员方法。尽管非常简单的类可能只包含成员方法或者只包含成员变量,但绝大多数

4、实际的类都包含上述两者。使用关键字class来声明类,通用格式如下class 类名类型 成员变量名;返回类型 成员方法名(参数)方法体v 2.创建学生类的对象创建学生类的对象v (1)创建类)创建类Student的对象的对象创建对象可以先声明对象Stu1为Student类,再通过new关键字创建这个对象。Student Stu1;Stu1=new Student();这两个步骤也可以一步完成。Student Stu2=new Student();对象的创建和变量的定义非常类似,使用int i; i=1;或者int i=1;v(2)创建对象的通用格式)创建对象的通用格式创建对象便是为对象分配内存

5、,对象便是类的实例。创建对象也经常被称为类的实例化。创建对象的通用格式如下:类名 对象名;对象名 = new 类名( );或者类名 对象名 = new 类名( );v(1)使用对象)使用对象创建一个主类来测试学生类。在刚才的输入Student类代码的文本文件中,继续输入以下代码。程序程序3.1 StuTest:v(2)编译和运行程序)编译和运行程序程序程序3.1 StuTest:class Studentpublic class StuTestpublic static void main(String args)Student Stu1=new Student();Student Stu2=

6、new Student();Stu1.setStu(李磊,2010050216,M,20);/为对象的成员变量赋值Stu2.setStu(张莉,2010050108,F,19); System.out.println(Stu1.name+同学的学号为+Stu1.no);/调用成员变量Stu2.selfIntro();/调用成员方法v4.使用构造方法使用构造方法(1)使用构造方法改进程序)使用构造方法改进程序程序3.1中,Student类的实例Stu1、Stu2在创建之时,就已经在内存中分配了空间,然而它们却没有被正确的赋值。需要等到调用了setStu()方法,才完成对象的赋值。使用构造方法可以

7、在创建对象的同时为其赋值,实现对象的初始化。以下为使用构造方法的Student类,粗体显示的部分为构造方法。程序程序3.2 StuTest:class StudentString name,no;char gender;int age; Student(String n,String o,char g,int a)/构造方法name=n;no=o;gender=g;age=a;void selfIntro()/成员方法同程序3.1public class StuTestpublic static void main(String args)Student Stu1=new Student(李磊

8、,2010050216,M,20);Student Stu2=new Student(张莉,2010050108,F,19);System.out.println(Stu1.name+同学的学号为+Stu1.no);Stu2.selfIntro(); v(2)默认构造方法)默认构造方法构造方法是类的一种特殊的方法,Java中的每个类都有构造方法,它的功能是为类的实例定义初始化状态。程序3.1中,类Student没有设计构造方法,但系统隐含提供了默认构造方法。因此,如果类中没有显式的定义任何构造方法,在使用new创建对象时,系统将调用默认构造方法初始化对象,而各成员变量也会被赋予默认的初值。v各

9、种简单数据类型的默认值如表2-1所示。但如果类中已经定义了构造方法,但没有定义没有参数的但如果类中已经定义了构造方法,但没有定义没有参数的构造方法。此时如采用没有参数的构造方法去初始化对象构造方法。此时如采用没有参数的构造方法去初始化对象会产生编译错误。因为只要类中定义了构造方法,系统就会产生编译错误。因为只要类中定义了构造方法,系统就不再提供默认构造方法。不再提供默认构造方法。v 三、相关知识v 1.面向对象编程面向对象编程面向对象编程或者面向对象程序设计(Object-Oriented Programming,简称为OOP)是目前最主流的一种程序设计模式,在某种程度上通过强调可重复性解决了

10、软件的维护问题。面相对象从现实世界中客观存在的事物出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。在面对一个问题之时,首先考虑的就是数据结构,然后才是对数据进行运算的算法,并且将数据结构和算法全都被封装在一个对象中。面向对象编程的最重要的特征在于其封装性、继承性以及多态性。通过封装能使对象类的定义和对象的实现分开;通过继承能体现类与类之间的关系,由此更引出其多态性。有关面向对象编程的三大特性,将在后面的内容中详细分析。 2.类与对象类与对象v类(Class):定义了一件事物的抽象特点。把众多的事物归纳、划分成一些类是人类在认识客观世界时经常采用的思维方法。通常来说,类定义了事

11、物的属性(有什么)和行为(做什么)。类就是一种类型,他封装了对象的属性和行为,是同一类对象的模板。v例如,“狗”这个类就应该包含狗的基本属性和行为,如图3.3所示。 v对象(Object)是类的实例(Instance)。对象是程序用来描述客观事物的一个实体,它是构成程序的一个基本单位。例如,“狗”是一个类,定义了世界上所有的狗。而“小白”则是一个对象,一条具体的狗,它的属性也是具体的,它也应该具备类的行为。 v对象小白如图3.4所示。 v例3.1class 狗String 名字;char 颜色;void 吠叫()(名字+汪汪汪吠叫);void 摇尾巴()(名字+摇尾巴);public clas

12、s DogTestpublic static void main(String args)狗 小白=new 狗();小白.名字=小白;小白.颜色=白;小白.吠叫();小白.摇尾巴(); v3.对象的内存存储对象的内存存储v(1)对象的内存模型)对象的内存模型使用new运算符创建对象便为对象动态的分配了内存空间。Java语言将数据类型分为简单型和复合型。在单元二中,我们学习了简单数据类型,它们在内存中采用直接访问的存储形式。v【例3.2】简单数据类型的内存模型。以下代码int i=1, j=2;i=j; j=1;定义了两个整型变量,并做了赋值的变换。它们在内存中的存储情况如图3.6所示。变量i和

13、j都有独立的内存空间,存储的也直接就是数据。任何类都是复合数据类型,通过new运算符为对象分配了内存空间,返回的就是空间的地址。这就是一种间接访问的存储形式。【例3.3】复合数据类型的内存模型。建立类Test如下:class Test int i, j;Test(int x, int y)i=x, j=y;仅声明对象t1为Test类型,即代码Test t1;并没有为其分配内存空间。只有使用new创建对象之后,即t1=new(1,2)内存中才划分了空间存储i和j,而对象t1中存放的只是实例的内存地址。图3.7 复合数据类型的内存模型v(2)对象的内存释放)对象的内存释放对象的清除是指释放对象占用

14、的内存。在Java语言中,定义对象时,通过new为其分配内存,但对象使用完后内存的释放工作则是由系统自动完成的,不需要程序员的关注。这就是Java所谓的“自动垃圾收集”机制。当一个对象的引用不存在时,则该对象被认为是不再需要的,它所占用的内存就被系统回收。自动垃圾回收机制,比起在C+中需要手工地释放动态分配的对象的内存,给编程带来了巨大的方便。因此对你编写的大多数程序,你不必须考虑垃圾回收问题。在一些特殊的情况下,也可以使用finialize()方法手动回收垃圾。v四、任务小结本任务是第一个真正体现Java面向对象特色的程序。在任务的实施中,我们学习了类的声明,对象的创建,对象成员的调用,构造

15、方法的使用。并且分析了类与对象的本质以及对象在内存中的存储模式。通过本任务的学习,我们应该初步的建立面向对象编程的概念,并在今后的学习中不断深入。 任务二 计算两点之间的距离v一、任务描述在面向过程的编程语言中,计算平面上两点之间的距离是一个简单的程序,我们只需用变量表达两点的坐标(x1,y1) 与(x2,y2),再通过距离公式计算即可。在本任务中,我们将转换我们的思维,用面向对象的方式来实现这个简单的计算,即首先建立描述点的类,将其属性和行为封装在类中,距离的计算正是点的行为,最后通过实例化点类的多个对象来进行距离的计算。 v二、任务实施1.建立点类建立点类用类描述一个点,首先思考点的属性和

16、行为。对于平面上的点而言,最基本的属性自然是x轴和y轴的坐标。而本任务要求的程序功能,两点间距离的计算,对于一个描述点的类而言,则是该点到另外一点的距离。编写类Point如下,保存为“Point.java”。 程序程序3.4 Point:class Point int x,y ;/成员变量,即坐标值Point(int a,int b)/构造方法x=a;y=b;double getDis(Point p)/计算到点p的距离的成员方法double dis;dis=Math.sqrt(x-p.x)*(x-p.x)+(y-p.y)*(y-p.y);return dis;v 2.改进构造方法改进构造方法

17、(1)重载方法)重载方法声明了类Point,在main()方法中,便可以使用Point p=new Point(10,20);这样的代码来创建一个Point类的实例p,并且初始值为(10,20)。但如果我们使用以下代码创建对象p,Point p=new Point();便不能正确的通过编译。任务一中已经提到,如果类中已经定义了有参数的构造方法,如采用没有参数的构造方法去初始化对象便会产生编译错误。只要类中定义了构造方法,系统就不再提供默认构造方法。方法重载技术(overload)可使以上两种创建对象的方法皆正确。 程序程序3.5 Point:class Point int x,y;Point(

18、)/不带参数的构造方法x=0; y=0;Point(int a,int b)/带参数的构造方法x=a; y=b;double getDis(Point p)同程序3.4 v(2)使用)使用this关键字关键字如果将类Point的带参数的构造方法改写为:int x,y;Point(int x,int y)x=x;y=y;显然,这是一个指代不清的错误示例。x、y在构造方法中并不能表示类Point的成员变量,只能指代传入的参数。 使用this关键字便能清楚的指代成员变量与参数。int x,y;Point(int x,int y)this.x=x;this.y=y; v3.编译和运行程序编译和运行程序

19、v(1)编写主类)编写主类v编写含有main()方法的主类,保存为“Distance.java”。v程序程序3.6 Distance:vpublic class Distancevvpublic static void main(String args)vvPoint p1,p2,p3;vp1=new Point();vp2=new Point(10,20);vp3=new Point(p2.y,p2.x);vSystem.out.println(p1与p2的距离为+p1.getDis(p2);vSystem.out.println(p2与p3的距离为+p2.getDis(p3);vvv在ma

20、in()方法中,创建了三个对象p1、p2、p3,分别输出了p1与p2的距离,p2与p3的距离。 v(2)编译运行)编译运行v编译源程序,并运行,结果如图3.8所示。 v在此任务中,我们将类Point与类Distance分别保存为两个源文件“Point.java”和“Distance.java”。只要这两个文件位于同一文件夹,即可通过javac Distance.java正确编译,通过java Distance正确运行。v需要注意的是,如果对“Point.java”进行编译,能够通过编译形成“Point.class”类文件,然而不能运行。因为Point类缺少main()方法。 v(1)增加类变量

21、)增加类变量v若要为程序3.6增加统计所创建点的数量的功能,直观的,可以在main()方法中增加一个计数的变量n,每当新建了一个Point类的实例,则n+。然而,在面向对象的编程思想中,同样应该将这个增加的功能封装到类Point中。一个简单的解决方案即是为Point类增加一个类变量。v改写类Point,即程序3.5如下: 程序程序3.7 Point:class Point int x,y;static int n=0;/声明类变量n并赋初值Point()x=0; y=0;n+;/每次构造方法的调用即对n加1Point(int x,int y)this.x=x; this.y=y;n+;/同无参

22、数的构造方法double getDis(Point p) double dis;dis=Math.sqrt(x-p.x)*(x-p.x)+(y-p.y)*(y-p.y);return dis; v (2)改写主类)改写主类v 改写主类,为程序3.6添加语句,输出统计点的个数。v 程序程序3.8 Distance:v public class Distancev vpublic static void main(String args)vvPoint p1,p2,p3;vp1=new Point();vp2=new Point(10,20);vp3=new Point(p2.y,p2.x);vS

23、ystem.out.println(p1与p2的距离为+p1.getDis(p2);vSystem.out.println(p2与p3的距离为+p2.getDis(p3);vSystem.out.println(共创建了共创建了+Point.n+个点个点);/引用类变量vv v三、相关知识v1.方法重载方法重载v在Java中,方法重载(overload)是指在一个类中定义多个有相同名字的方法,但这些方法的参数声明必须不同。这种不同,可以体现为参数的类型不同或者参数的个数不同。v在本任务中,我们对构造方法使用了重载,事实上,任何成员方法都能重载。 【例3.4】成员方法的重载。class Over

24、loadDemo int test() return 0;int test(int a) return a*a;double test(double a,int b) return a/b;double test(int a,double b) return a*b; v2.this关键字关键字在程序中如果因为变量重名而产生指代不明,可以使用的this关键字来指明当前对象,以使代码更清晰。this的用法有很多种,在类Point的声明中,我们使用this来指代被参数隐藏的成员变量。this还能用于构造方法的自我调用,即配合重载的构造方法,在一个构造方法内通过参数调用另一构造方法。我们改写Poin

25、t类的构造方法如下。 【例3.5】this的用法。class Point int x,y;Point()/不带参数的构造方法this(0,0);/用this表示构造方法的调用Point(int a,int b)/带参数的构造方法x=a; y=b; v3.static关键字关键字使用static修饰的成员变量和成员方法被称为类变量和类方法,而没有被声明为static属性的成员变量和成员方法被称为实例变量和实例方法。在程序3.7中,我们已经使用了类变量,类方法与类变量的原理非常类似。类变量是全局变量,由类的所有实例共享类变量。类方法是全局方法。在类方法中,除非创建了类的实例,否则仅可以访问类变量和

26、类方法,不能引用实例变量和实例方法。并且,在类方法中不能使用this或super关键字。相对的,实例方法则无此限制,实例方法既可以引用类变量,也可以引用实例变量;既可以调用类方法,也可以调用实例方法。 【例3.6】类方法的正确引用class StaticDemo int a;/实例变量static int b;/类变量int sum()/实例方法return a+b;/合法,实例方法可以调用类变量和实例变量static void plus(int x)/类方法a+=x;/非法,类方法不能调用实例变量b+=x;/合法,类方法可以调用类变量b=sum();/非法,类方法不能调用实例方法 v四、任务

27、小结本任务编写了一个计算两点间距离并统计创建点的个数的简单程序。这个程序如果用C语言实现也不复杂,但显然以面向对象的方式实现有它的独特之处,也更符合人认识客观世界的方式。本任务中运用了方法重载技术,这是Java灵活性的一个最好的体现,在以后的程序中还将大量的运用。static关键字修饰的类变量和类方法可以理解为全局的变量或方法,在与实例变量和实例方法相互调用时应避免错误。 任务三任务三 复数的加法运算复数的加法运算 v一、任务描述实数的运算是非常简单的程序,然而扩展到复数的领域,一个简单的加法运算也会变得相对复杂。因为,简单数据类型中并不包括复数类型。本任务要求设计一个复数类,并使其能够完成复

28、数的输出和复数的加法运算。 v1.设计复数类设计复数类v复数通常写为如下形式:v首先实现复数的加法运算,即:v为方便复数的输出,还增加复数的输出功能,即将复数转换为字符串以备输出。v编写如下代码,保存为“Complex.java”。 bia idbcadicbia程序程序3.9 Complex:class Complexdouble a,b;/实部与虚部Complex()a=0; b=0;Complex(double a,double b)this.a=a;this.b=b;String input()/将复数转换为字符串return(a+b+i);Complex add(double n)/

29、复数与实数相加Complex CT=new Complex(a+n,b);return(CT); Complex add(Complex n)/复数与复数相加Complex CT=new Complex(a+n.a,b+n.b);return(CT); v2.编译和运行程序编译和运行程序v(1)设计复数测试主类)设计复数测试主类v设计一个复数测试类,在main()方法中测试此复数类加法运算和输出的效果。要求既能输出复数,又能分别输出复数的实部和虚部,还能计算复数的加法,并输出运算结果。v编写如下代码,保存为“ComplexTest.java”。 程序程序3.10 ComplexTest:pub

30、lic class ComplexTestpublic static void main(String args) Complex c1,c2,c3;double k=7.84;c1=new Complex(12.5,3);c2=c1.add(k);c3=c1.add(c2);System.out.println(复数c1 = +c1.input()+,实部为+c1.a+,虚部为 +c1.b);System.out.println(复数c2 = +c1.input()+ + +k+ = +c2.input();System.out.println(复数c3 = +c1.input()+ + +

31、c2.input()+ = +c3.input(); v 3.使用访问控制修饰符使用访问控制修饰符v (1)使用)使用private和和public修饰符修饰符v 程序3.9在声明类Complex的时候,无论是成员变量还是成员方法,都没有使用任何的访问控制修饰符。因此,我们在另外的类,即复数测试类ComplexTest中才能自由的引用这些变量和方法。v 如果需要控制一些成员,使得只有本类中其他成员能够访问,可使用private修饰。v 修改程序3.9,类Complex的定义,用private修饰成员变量a、b,即v private double a,bv 此时,再次编译程序3.10“Compl

32、exTest.java”,会出现错误如图3.11所示 v 为了类ComplexTest能够访问类Complex中的私有变量,我们可以在类Complex中增加两个get方法,并使用public修饰。public修饰符保证了这些方法能被任何类访问。public double geta()return a;public double getb()return b; v 此时程序3.10中非法访问的代码则应改为v System.out.println(复数c1 = +c1.input()+,实部为+c1.geta()+,虚部为 +c1.getb(); v 编译运行修改后的程序编译运行修改后的程序 v三

33、、相关知识v1.封装 v封装性是面向对象编程思想最根本的特征。封装,也就是把对象的属性和行为结合成一个独立的相同单位,并尽可能隐蔽其内部细节。 v2.访问控制访问控制v访问权限实现访问控制。在类的成员中引入不同的访问权限,可以隐藏类的内部细节。Java提供了4种访问权限,public(公有)、private(私有)、protected(受保护)和无修饰符时的默认。 v四、任务小结 v本任务用面向对象的方式实现了一个复数加法运算的简单程序,我们使用了构造方法与方法重载技术,还首次使用了public以外的访问控制修饰符private。通过本任务,可以很容易的体会到面向对象编程在描述基本数据类型不能

34、表达的事物时的优越性。而面向对象最基本的特性封装,也在这个任务中得到了体现。 拓展任务拓展任务 v一、思考v1体会面向对象编程与面向过程编程的区别。v2类与对象有什么区别。v3方法重载技术有哪些优越性。v4体会封装的意义。v5查阅资料,了解面向对象编程的优越性。 v二、改进程序v1改写学生类Student,用出生年月来取代年龄,并在selfIntro方法中计算年龄。v2编写日期类Date,并在Student类使用Date类的对象来表示学生的出生日期。v3完善复数类,实现复数的四则运算功能。v复数的乘法:v复数的除法: iadbcbdacdicbia idcadbcdcbdacdicbia2222v三、编程v1创建矩形类,其属性为宽和高,其行为有面积的计算和周长的计算。程序测试矩形类的正确性。v2利用点类Point,创建矩形类,其余要求与第1题相同。v注:通过对角线上的两点可以确定一个矩形,宽和高可以由两点的坐标计算。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁