收藏 分享(赏)

第3章_Java面向对象.ppt

上传人:dreamzhangning 文档编号:3661888 上传时间:2018-11-15 格式:PPT 页数:71 大小:558.50KB
下载 相关 举报
第3章_Java面向对象.ppt_第1页
第1页 / 共71页
第3章_Java面向对象.ppt_第2页
第2页 / 共71页
第3章_Java面向对象.ppt_第3页
第3页 / 共71页
第3章_Java面向对象.ppt_第4页
第4页 / 共71页
第3章_Java面向对象.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

1、第三章 Java面向对象编程,3.1 面向对象基本概念 3.2 类 3.3 对象 3.4 继承 3.5 多态,面向过程与面向对象,公共数据,算法数据结构,面向过程程序设计,面向对象程序设计,对象消息,3.1 面向对象的基本概念,面向对象是一种新兴的程序设计方法, 其基本思想是使用对象、类、抽象、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。,1、对象的概念,客观世界的问题都是由客观世界的实体及实体间的相互关系构成的,我们把客观世界的实体称为问题空间的对象。显然,“对象”不是固定的。一本书是一个对象

2、,一家书店也可以是一个对象。世界上的各个事物都是由各种“对象”组成的,任何事物都是对象,是某一个对象类的一个元素。复杂的对象可以由相对比较简单的对象以某种方式组成。从这种意义上讲,整个客观世界可认为是一个最复杂的对象。 对象有自己的属性和动作。,在面向对象的程序设计中,一个对象由一组属性和对这组属性进行操作的一组服务组成。,变量,方法,2 类的基本概念,把众多的事物归纳、划分成一些类是人类在认识客观世界时经常采用的思维方法。分类的原则是抽象。类是具有相同属性和服务的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。 类实质上定义的是一种对象类型,它是

3、对具有相似行为的对象的一种抽象,描述了属于该类型的所有对象的性质。例如 :Integer是一个类,它描述了所有整数的性质,“1”、“2”等具体整数都是Iteger这个类的对象,都具备算术运算和大小比较的处理能力。 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。,可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)。,将对象进行抽象变成程序的“类”是编制程序的首要 任务,同时也是程序设计优劣的关键。,属性:描述 类是什么,方法:描述类做什么,3 消息,消息就是向对象发出的服务请

4、求,它应该包含下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。服务通常被称为方法或函数。,对象B,对象 A,消息,一个例子在程序中所操作的对象是类的一个实例。 创建一个对象: Hello obj=new Hello(); 调用方法: obj.showString();调用对象的方法相当于给对象发送消息,收到消息的对象通过改 变自身的状态或者向其它对象发送消息来响应消息。,变量,方法showString(),方法changeString(),4、面向对象的基本特点,封装、继承、多态 (1)封装性 封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两

5、个含义: 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界或者说形成一道屏障,只保留有限的对外接口使之与外部发生联系。 封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的“交叉感染“,使软件错误能够局部化,大大减少查错和排错的难度。,(2)继承性 特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如,轮船、客轮;人、大人。一个类可以是多个一般类的特殊类,它从多个一般类中继承了属性与服务,这称为多继承。例如,客轮是轮船和客运工具的

6、特殊类。在java语言中,通常我们称一般类为父类(super class,超类),特殊类为子类(subclass)。(3)多态性 所谓多态(polymorphic)即一个名字可具有多种语义。对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:“几何图形“的“绘图“方法,“椭圆“和“多边形“都是“几何图“的子类,其“绘图“方法功能不同。,3.2 类,类是组成Java程序的基本要素,是这一类对象的原型。类是用来创建对象的模板,要学习Java 编程就必须学会怎样去写类,即怎样用Jav

7、a 的语法去描述一类事物共有的属性和功能.属性通过变量来刻画,功能通过方法来体现,即方法操作属性形成一定的算法来实现一个具体的功能.类把数据和对数据的操作封装成一个整体.,publicabstract/final class 类名称 extends 父类名称 implements 接口名称列表throw 异常类型列表 变量定义及初始化;方法定义及方法体;,1、类的声明,类名命名习惯:首字母大写,每个单词的首字母也大写;见名知意;,一个最简单的类声明如下: class className 例如: class Point ,class 梯形 float 上底,下底,高,laderArea; /变量

8、定义部分.float 计算面积() /方法定义laderArea=(上底+下底)*高/2.0f;return laderArea;void 修改高(float h) /方法定义高=h; ,可以用汉 语命名,class Trapezoid float upBottom,downBottom,high,laderArea; float GetArea() /方法定义 laderArea=(upBottom+downBottom)*high/2.0f;return trapezoidArea;void SetHigh(float h) /方法定义 high=h; ,但习惯还 是用英语,public

9、class Circleprivate int x;private int y;private int Radius;public Circle()x=0; y=0; Radius=0;public Circle(int x1,int y1,int radius1)x=x1; y=y1; Radius=radius1;public void draw()System.out.println(“draw a circle at piont “ +x+“,“+y);public void erase()System.out.println(“delete a circle!“); ,public

10、class Person int age=40;/成员变量.int setAge(int iage)/方法setAge,返回值int,参数intint age=iage;/局部变量得到传过来iage的值30.System.out.println(age);/30return age;/返回age的值.void sayAge()/方法sayAge,无返回值(void),无参数.int age;/局部变量age=setAge(30);/调用方法setAge,age得到方法setAge的返回值30(static int).System.out.println(age); /30public stat

11、ic void main(String args)int age=20;/局部变量.System.out.println(age); /20sayAge(); /调用方法sayAge . ,2、类修饰符 一个Java源文件中最多只能有一个public类,而且文件名必须和public类的类名相同。 public 表示该类可以被继承,也可以被任何类访问; abstract表示该类是抽象类,也就是该类必须被继承,其本身并不实现任何实际操作; final表示该类是不能被继承的。 缺省:友好类Default。在另外一个类中使用友好类创建对象时,必须保证他们是在同一包中。即只能被同一包中的类访问。Java

12、规定,同一个程序文件中的所有类都在同一个包中。,注意事项 可以同时使用两个修饰符来修饰一个类,当使用两个修饰符修饰一个类时,这些修饰符之间用空格分开,写在关键字class之前,修饰符的顺序对类的性质没有任何影响 一个类可以被修饰为public abstract,也可以被修饰为public final,但不能被修饰为abstract final,这是因为abstract类自身没有对象,需要派生子类后再创建子类的对象,而final类不能派生子类,所以不存在用abstract final两个修饰符修饰的类。,3、变量:描述对象的属性局部变量:方法体中定义的变量成员变量:变量定义部分所定义的变量,成员

13、变量在整个类内都有效,局部变量只在定义它的方法内有效.,class Sun int distance;int find() int a=12;distance=a; /合法,distance在整个类内有效.return distance;void g() int y;y=a; /非法,因为a以失效,而方法g内又没有定义变量a ,成员变量和局部变量的类型可以是Java中的任意数据类型包括简单类型、数组、类和接口。 如:,class Workman double x; People zhiwei;. ,class People int boy;float a;void f() boolean co

14、ol; Workman zhangboy; . ,成员变量限定词: 访问权限:public:可被任何类访问。protected:被类自身,子类及同一包中的类访问。default:也称友好,被类自身和同一包中的类访问。private:只能被类自身访问。 其他:transient声明一个暂时性变量,对象存档时不必保存该变量;final声明一个常量,程序不能改变其值,通常用大写;voltatile用于声明一个共享变量,用于多个并发线程共享;static: 表示类成员。,成员变量与它在类体中书写的先后位置无关,但不提倡把成员变量的定义分散地写在方法之间或类体的最后,人们习惯先介绍属性再介绍功能. 如果

15、局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效.,class Tomint x=98,y;void f() int x=3;y=x;/ y=? ,如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏.这时如果想在该方法内使用成员变量,必须使用关键字this.,class Triangle float sideA,sideB,sideC,lengthSum;void setSide(float sideA,float sideB,float sideC) this.sideA=sideA; this.sideB=sideB;this.sideC=si

16、deC; ,this 可以出现在类的实例方法中,代表使用该方法的当前对象。 this一般可以省略。但当成员变量与局部变量名字相同时,若要访问成员变量,this不能省略。 this方法不能出现在类方法中,因为类方法可以通过类名直接调用,此时,可能还没有任何对象诞生。,4、方法 表示对象的动作。 当一个方法不需要返回值时,返回类型必须为void。(构造方法除外) 命名规则,首写字母小写,以后每个单词的首字母大写,返回类型 方法名称(参数列表) 方法体的内容 ,class Location int x,y;class Point int x,y; Point( ) x=20; y=30;void g

17、etXY( int xValue, int yValue )xValue=x; yValue=y;void getLocation( Location lReference )lReference.x=x; lReference.y=y; public class ArgumentTestpublic static void main( String args ) Point p=new Point( ); /label 1 : pass by value System.out.println(“Pass by value:“); System.out.println(“xValue = “+

18、xValue+“ yValue = “+yValue); Location l=new Location( ); p.getLocation( l ); /label 2 : pass by reference System.out.println(“Pass by reference:“); System.out.println(“xValue = “+l.x+“ yValue = “+l.y); ,构造方法是一种特殊的方法,构造对象并对其初始化。 例:Data类的构造器叫Data new Data()-构造一个新对象,且初始化当前时间. 构造方法可以有0个,一个或多个参数 构造方法和类有相

19、同的名字 一个类可以有多个构造方法(重载) 构造方法没有返回值 构造方法总是和new运算符一起使用. 如果没有声明构造方法,则系统默认提供一个无参的构造方法;如果自己声明了构造方法,系统则不再默认提供。,public class Thingprivate int x;public Thing()x=47;public Thing(int x1)x=x1;public static void main(String args)Thing t = new Thing();Thing t1 = new Thing(3); ,3.3、对象,类实例化可生成对象,对象通过消息传递来进行交互。消息传递即激活

20、指定的某个对象的方法以改变其状态或让它产生一定的行为。一个对象的生命周期包括三个阶段:生成、使用和消除。,必须拥有一个合适的类才能创建一个合适的对象,有了合适的对象才能完成合适的工作。,1、对象的生成:包括声明、实例化。 声明: 声明并不为对象分配内存空间,而只是分配一个引用空间;对象的引用类似于指针,是32位的地址空间,它的值指向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址,而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。 如:Circle cle;,Circle,实例化: 运算符new为对象分配内存空间,它调用对象的构造方法,返回引用;一个类的不同对

21、象分别占据不同的内存空间。 如:cle=new Circle(); 或cle=new Circle(10,20,5);,0xAB12,cle,对象的引用,对象实体,Circle cle=new Circle(10,20,5);,Point p1=new Point(12,16); Point p2=new Point(6,18);,0xAB10,p1,0xDD12,p2,p1=p2;,0xDD12,p1,0xDD12,p2,2、对象的使用 通过运算符“.“可以实现对变量的访问和方法的调用。变量和方法可以通过设定访问权限来限制其它对象对它的访问。 调用对象的变量 格式:objectReferen

22、ce.variable objectReference是一个已生成的对象,也可以是能生成对象的表达式 例: p.x= 10; tx=new Point( ).x; 调用对象的方法 格式:objectReference.methodName(paramlist); 例如:p.move(30,20); new Point( ).move(30,20);,3、对象的清除 当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器周期性的自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。 也可以调用System.gc( );进行垃圾回收。,3.4 继承Inheritanc

23、e,面向对象语言允许从一个已有的类父类定义新的类子类,从而形成继承关系。,继承:现实世界中遗传关系的直接模拟, 它表示类之间的内在联系以及对属性和操作的共享。,子类继承了父类的属性,子类也可继承了父类的方法; 子类并不限于继承,还可以发扬光大;继承未必只有一层。,继承机制的意义 简化类或对象之间的接口 支持软件重用代码重用,Object类,创建子类 class SubClass extends SuperClass ,class Person int age;void study() void work() ,class Girl extends Person double moneyForD

24、ressingvoid shy() ,成员变量的隐藏和方法的重写 子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为。 例如: class SuperClass int x; void setX( ) x=0; class SubClass extends SuperClass int x; /隐藏了父类的变量x void setX( ) /重写了父类的方法 setX() x=5; . ,注意:子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体不同。,super java中通过super来实现对父类成员的访问,s

25、uper用来引用当前对象的父类。super 的使用有三种情况: 1)访问父类被隐藏的、继承自父类的成员变量,如: super.variable; 2)调用父类中被重写的方法,以实现功能扩充,如: super.Method(paramlist); 3)调用父类的构造函数,如: super(paramlist); 如果在子类的构造函数中调用super()或this(),则该语句必须是第一句,否则会出错。,import java.io.*;class SuperClassint x;SuperClass( ) x=3; System.out.println(“in SuperClass : x=“

26、+x); void doSomething( ) System.out.println(“in SuperClass.doSomething()“);class SubClass extends SuperClass int x;SubClass( ) super( ); /调用父类的构造方法super( ) 要放在方法中的第一句x=5; System.out.println(“in SubClass :x=“+x);void doSomething( ) super.doSomething( ); /调用父类的方法System.out.println(“in SubClass.doSomet

27、hing()“);System.out.println(“super.x=“+super.x+“ sub.x=“+x);public class Inheritancepublic static void main(String args) SubClass subC=new SubClass();subC.doSomething();,继承举例,public class Person String name = “no name”;public Person() name = “a person”; /如上为Person类 public class Student extends Perso

28、n public Student(int tmp) String name = “a student”;public Sting getName() return name; 代码:Student s = new Student(66); System.out.println(“name:”+s.getName();,程序输出结果是什么?,3.5 多态性Polymorphism 多态用来模拟物件的对环境的适应能力的!就相当于人的多面性,对不同的人就呈现出不同的一面。 同名方法的重写(override)和重载(overload)是多态两种完全不同的机制。 替代原则(substitution pr

29、inciple):父类可以用其子类代换。替代过程也是子类向上转型的过程,向上转型是一种常用的安全的类型转换。通过向上转型可实现多态性。,多态性体现在两个方面: 重载Overloading:一个类中多态性的一种表现.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。 重写Overriding:也叫覆盖。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽“了。,方法覆盖(override),覆盖的方法的

30、标志必须要和被覆盖的方法的完全匹配,才能达到覆盖的效果; 覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类; 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。,class A void gg() void mm(int num) ,class B extends A void gg() void mm(int num) , 方法重写时应遵循的原则: 1)改写后的方法不能比被重写的方法有更严格的访问权限(可以相同)。 2)改写后的方法不能比重写的方法产生更多的例外。,方法重载(overload),方法的重载:即多个方法用相同的名称,

31、但参数行不同(不同的参数类型,不同的参数个数,不同的参数顺序)。根据不同的参数样式,来选择合适的方法执行,不能通过访问权限、返回类型、抛出的异常进行重载,class Area float getArea(float r) return 3.14f*r*r; double getArea(float x,int y) return x*y float getArea(int x,float y); return x*y; double getArea(float x,float y,float z) return (x*x+y*y+z*z)*2.0; ,对象的上转型(upcasting)对象替代

32、原则:父类可以用其子类代换。替代过程也是子类向上转型的过程,向上转型是一种常用的安全的类型转换。通过向上转型可实现多态性。假设A类是B类的父类,A a;B b=new B();a=b; 称父类对象a是子类对象b的上转型对象。上转型对象的实体是由子类负责创建的,因此会丢失父类应具有的某些功能。,父类有的子类肯定有,向上转换,子类可以自动转换成父类,上转型对象会失去原对象的一些属性和功能, 因为子类有的父类不一定有,import java.io.*; class A void callme( ) System.out.println(“Inside As callme()method”); cla

33、ss B extends A void callme( ) System.out.println(“Inside Bs callme() Method”); public class Dispatch public static void main(String args) A a=new B(); a.callme( );/调用父类还是子类的callme? ,多态,注: 上转型对象不能操作子类新增的成员变量和方法; 上转型对象可以操作子类继承或重写的成员变量和方法,而且一定是重写后的。 上转型对象可以被强制转换为子类对象,此时与用子类创建的对象操作相同 不能将用父类创建的对象赋值给子类创建的

34、对象。,对象的下转型(downcasting)对象替代原则:父类对象强制转换成子类对象。 这是一种由少到多的转换,必须显示地由编译器转换。 通过向下转型可实现多态性。假设A类是B类的父类,A a =new B();if( a instanceof B)B b = (B) a;下转型之前要用instanceof判断该对象是否属于该类,课堂练习,1、判断下面程序是否有错误? public class Takecare int a=90;static float b=10.98f;public static void main(String args) float c=a+b;System.out.

35、println(“=“+c); ,2、下面两句话是一个java源程序的开始,他们有错误吗?import java.awt.*;package Trans.car;,3、有关类Demo,哪句描述是正确的?public class Demo extends Base private int count; public Demo() System.out.println(“A Demo object has beencreated”); protected void addOne() count+; A.当创建一个Demo类的实例对象时,count的值为0。 B.当创建一个Demo类的实例对象时,c

36、ount的值是不确定的。 C.超类对象中可以包含改变count 值的方法。 D.Demo的子类对象可以访问count。,A,4、当编译和运行下列程序段时,会发生什么?class Base class Sub extends Base class Sub2 extends Base public class CEx public static void main(String argv) Base b = new Base(); Sub s = (Sub) b; A.通过编译和并正常运行。 B.编译时出现例外。 C.编译通过,运行时出现例外。,5、如果任何包中的子类都能访问超类中的成员,那么应使

37、用哪个限定词? A.public B.private C.protected D.transient,C,6、下面的哪个选项是正确的?class ExSuper String name; String nick_name; public ExSuper(String s,String t)name = s; nick_name = t; public String toString() return name; 。 ,public class Example extends ExSuper public Example(String s,String t) super(s,t); public

38、 String toString() return name +“a.k.a”+nick_name; public static void main(String args)ExSuper a = new ExSuper(“First”,“1st”);ExSuper b = new Example(“Second”,“2nd”);System.out.println(“a is”+a.toString();System.out.println(“b is”+b.toString();,A.编译时会出现例外。 B.运行结果为:a is Firstb is second C.运行结果为:a is

39、Firstb is Secong a.k.a 2nd D.运行结果为:a is First a.k.a 1ndb is Second a.k.a 2nd,C,7、运行下列程序的结果是哪个?abstract class MineBase abstract void amethod(); static int i; public class Mine extends MineBasepublic static void main(String argv)int ar = new int5;for(i = 0;i ar.length;i+)System.out.println(ari);A.打印5个

40、0。 B.编译出错,数组ar必须初始化。 C.编译出错, Mine应声明为abstract。 D.出现IndexOutOfBoundes的例外。,C,8、指出下列程序的所有错误?(多选)final class First private int a = 1;int b = 2; class Second extends First public void method() System.out.println(a + b);A.println()参数应为字符串,因此此处不能调用该方法。 B.因为变量a是private,所以在其他类中不能访问a。 C.Second 不能继承First。 D.关键

41、字final不能修饰类。,BC,9、接口A的定义如下,指出下列哪些类实现了该接口?interface A int method1(int i); int method2(int j); ,A.class B implements A int method1() int method2() B.class B int method1(int i) int method2(int j) ,C.class B implements A int method1(int i) int method2(int j) D.class B implements A int method2(int j) int

42、 method1(int i) ,class B implements A public int method1(int i) return 0; public int method2(int j) return 1; ,正确答案,实现接口的注意事项: 不能降低权限; 如果有返回值,必须有return语句,10、编程题: 为某研究所编写一个通用程序,用来计算每一种交通工具运行1000公里所需的时间,已知每种交通工具的参数都是3个整数A、B、C的表达式。现有两种工具:Car007和Plane,其中Car007的速度运算公式为:A*B/C,Plane的速度运算公式为:A+B+C。需要编写三类:Co

43、mputeTime.java,Plane.java,Car007.java和接口Common.java,要求在未来如果增加第3种交通工具的时候,不必修改以前的任何程序,只需要编写新的交通工具的程序。其运行过程如下,从命令行输入ComputeTime的四个参数,第一个是交通工具的类型,第二、三、四个参数分别是整数A、B、C,举例如下: 计算Plane的时间: java ComputeTime Plane 20 30 40 计算Car007的时间: java ComputeTime Car007 23 34 45 如果第3种交通工具为Ship,则只需要编写Ship.java,运行时输入: java ComputeTime Ship 22 33 44提示:充分利用接口的概念,接口对象充当参数。 实例化一个对象的另外一种办法:Class.forName(str).newInstance();例如需要实例化一个Plane对象的话,则只要调用Class.forName(“Plane”).newInstance()便可。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报