《Java面向对象基础.ppt》由会员分享,可在线阅读,更多相关《Java面向对象基础.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象概述目录理解对象和类理解抽象和封装对象与类掌握包的创建和导入2面向对象编程OOPOOP旨在在计算机程序中模拟现实世界中的概念在 OOP 中,现实世界的所有事物全都被视为对象能够在计算机程序中用类似的实体模拟现实世界中的实体设计和实现软件系统的方法n n面向对象的三大特征面向对象的三大特征 封装封装 (Encapsulation)(Encapsulation)继承继承 (Inheritance)(Inheritance)多态多态 (Polymorphism)(Polymorphism)3对象对对对对 象象象象面向对象编程的核心为计算机应用程序提供实用基础完成特定任务表示现实世界中的实体“
2、对象是存在的具体实体,具有明确定义的状态和行为。对象是存在的具体实体,具有明确定义的状态和行为。”4对象的示例收银员对象顾客对象顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品状态状态姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印帐单行为行为5类类以共同特性和操作定义实体类是用于组合各个对象所共有操作和属性的一种机制形状类形状类动物类动物类汽车类汽车类类的示例类的示例“类是具有相同属性和行为的一组对象的集合类是具有相同属性和行为的一组对象的集合”6类和对象的示例雇员雇员收银员系统管理员仓库管理员促销员采购经理7属性事物的特性在类中表示为变量每个对象的每个属性都拥有其特有的
3、值属性名称由类的所有实例共享住址住址姓名姓名属性属性年龄年龄“在类中表示对象或实体拥有的特性时称为属性在类中表示对象或实体拥有的特性时称为属性”促销员对象促销员对象8方法方法方法方法方法操作的实际实现如何执行所请求的操作的规范方法指定操作对象数据的方式在得到操作请求时指定如何做的算法“对象执行的操作称为方法。对象执行的操作称为方法。”9方法的示例缝衣服的步骤缝衣服的步骤量尺寸量尺寸得到工具得到工具缝衣服缝衣服方法方法缝制衣服裁缝裁缝10类和对象的区别 类是概念模型,定义对象的所 有特性和所需 的操作对象是真实的模型类和对象类和对象类定义实体对象是实际的实体类是对象的原型类是对象的原型类是对象的
4、原型类是对象的原型所有属于同一个类所有属于同一个类所有属于同一个类所有属于同一个类的对象都具有相同的对象都具有相同的对象都具有相同的对象都具有相同的特性和操作的特性和操作的特性和操作的特性和操作11封装信息隐藏,隐藏对象的实现细节,不让用户看到将东西包装在一起,然后以新的完整形式呈现出来例如,两种或多种化学药品组成一个胶囊将方法和属性一起包装到一个单元中,单元以类的形式实现“隐藏属性、方法或实现细节的过程称为封装。隐藏属性、方法或实现细节的过程称为封装。”12封装的示例 3-1接口 采购经理罗杰斯先生法拉力公司.迪斯尼汽车公司.市场经理雪莉女士 要求13 封装的示例 3-2有选择地提供数据法拉
5、力公司迪斯尼汽车公司公共电话号码电子邮箱产品种类私有备件的制造方法备件库存备件的制造成本公共电话号码电子邮箱汽车种类私有汽车的组装方法汽车库存汽车的组装成本14封装的示例 3-3 实体法拉力公司实体迪斯尼汽车公司 Auti Ltd.Buto Ltd.属性电话号码电子邮箱产品种类现有存货数量雇员详情所需物料详情属性电话号码电子邮箱汽车种类汽车规格雇员详情库存详情经销商详情方法接收订单备件的制造方法计算备件的制造成本计算利润率方法发出订单汽车的组装方法计算汽车的组装成本计算工资发出订单编制必要报告15抽象处理事物复杂性的方法处理事物复杂性的方法处理事物复杂性的方法处理事物复杂性的方法只关注事物的重
6、要细节,而忽略事物的次要细节。16抽象的示例属性NameStudentNOSeatNumber方法getName()getStudentNO()Student 类类getSeatNumber()17类的定义类的定义格式如下:修饰符 class 类名 extends 父类名 implements 接口名1,接口名2,类属性声明;类方法声明;其中以 括起的内容表示定义时可以没有。以大括号括起的内容称类体,之前部分称类头,修饰符 class 类名 extends 父类名 implements 接口名部分就是类头。181.类头说明类头中关键词class表示类定义的开始,后面紧跟的是类名。修饰符用来说明
7、类的特殊性质,如前面程序中的public等。private(私有):修饰的类只能被同一包名中的类访问,这是Java默认方式;public(公共):修饰的类能被所有的类访问;abstract(抽象):修饰的类不能被实例化不能被实例化,它包含有未实现的方法。final(最终):修饰的类不能被继承,即不能有不能有子类子类。关键词extends表示该类是个子类,它的父类名紧跟在extends后。关键词iplements表示该类实现了哪些接口,后面就是接口名。192.类体说明类体中定义了该类所有的成员变量和该类所支持的方法,其形式说明如下:类体类体 成员变量说明成员变量说明 构造方法说明构造方法说明 静
8、态初始化说明静态初始化说明 方法说明方法说明 类体由成员变量说明、构造方法说明、静态初始化说明和方法说明构成,它们都是可选的成员变量:修饰符 变量的数据类型 变量名=初始值;/类属性为简单变量时修饰符 类名 对象名=new 类名(参数列表);/类属性为对象时20成员变量说明成员变量说明Java中成员变量说明形式如下:修饰符 成员变量类型 成员变量名列表;成员变量的修饰符有以下几种:缺省访问修饰符、public、protected、private、final、static、transient和volatile。(1)缺省访问修饰符 缺省访问修饰符的成员变量可以被同一包(package)中的任何类
9、访问。(2)public(公共)public修饰的成员变量可以被项目文件中的任何方法所访问。由于public成员变量不受限制,这易使类的对象引起不希望的修改,建议成员变量尽量不要使用public修饰符。(3)protected(受保护)protected修饰的成员变量可以被有继承关系的类自由访问,即子类可以访问它。21成员变量说明成员变量说明(4)private(私有)private修饰的成员变量只能在同一个类中使用。这种方式通常是最为安全的。(5)static(静态):(类变量)static修饰的成员变量又称为类变量。不加static修饰的成员变量又叫对象变量。对象变量依附于具体的对象实例,
10、它的值因具体对象实例的不同而不同,而类变量为该类的所有对象共享,它的值不因类的对象不同而不同。(6)final(最终):(常量)final修饰的成员变量叫最终成员变量。一开始创建该变量时将其设定了一个值,在以后程序的运行过程当中,变量的值将一直保持这个值不变。最终变量又称为常量。22类的属性Public void setName(String na)name=na;Public void getName(String na)return na;上面代码所对应的属性为name,setName是name属性的写操作器getName是name属性的读操作器读写操作器和属性之间的关系:属性的首字母大写
11、,在前面加上get或者set前缀Eclipse中提供了非常方便的get/set功能23构造方法一个新对象的初始化的最终步骤是去调用一个叫做构造函数的方法。它具有以下两个规则:方法名称必须与类名称完全相匹配;对于构造函数方法,不要声明返回类型;创建一个类的新对象时,系统会自动调用该类的构造函数方法,为该对象初始化。构造方法分为缺省的构造方法(不带参数)和带参数的构造方法 缺省的构造方法 如果类的定义没有编制构造方法,Java语言会自动为用户提供。这个由Java自动提供的构造方法就是所谓的缺省构造方法。缺省的构造方法确保每个Java类都至少有一个构造方法,该方法应符合类的定义。带参数的构造方法 带
12、有参数的构造方法能够实现这样的功能:当构造一个新对象时,类构造方法可以按需要将一些指定的参数传递给构造方法。public Point(int x,int y)this.x=x;this.y=y;24方法方法的形式如下:方法修饰符方法修饰符 返回值类型返回值类型 方法名(方法名(形参列表形参列表)throws异常列表异常列表 方法修饰符方法修饰符包括以下几种:public 修饰的方法可以由其他类访问;protected 修饰的方法只能由继承关系的类访问;private 修饰的方法只能由说明该方法的类访问;static 修饰的方法为静态方法,又叫类方法;无static修饰的方法为对象方法。类方法是
13、该类的所有对象共享的方法。abstract 修饰的方法为抽象方法,无其方法体;final 修饰的方法为最终方法,不能由子类改变;synchronized(同步)修饰的方法执行之前给方法设置同步机制,实现线程同步;native 修饰的方法为本地方法,即方法实现与本机系统有关25方法的参数传递传值和传址传值:基本数据类型的参数传递Class PassValuePublic static void main(String args)Int x=5;Change(x);System.out.println(x);Public static int Change(int x)x=3;Return x26
14、方法的参数传递传址:引用数据类型的参数传递Class PassRefint x;public static void main(String args)PassRef obj=new PassRef();obj.x=5;change(obj);System.out.println(obj.x);Public static void change(PassRef obj)obj.x=3;27方法的重载Overload方法的重载指的是在同一个类中允许同时存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可public class Testpublic static void main(S
15、tring args)int isum;double fsum;isum=add(3,5);isum=add(3,5,6);fsum=add(3.2,6.5);public static int add(int x,int y)reutrn x+y;public static int add(int x,int y,int z)return x+y+z;public static double add(double x,double y)return x+y;28构造方法的重载 和一般的方法重载一样,重载的构造方法具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new 关键字产生对
16、象时,该调用哪个构造方法了。产生对象的格式是:new 类名(参数列表);重载构造方法可以完成不同初始化的操作,如:p3=new Person(“Tom”,18);语句,会做这样几件事:创建指定类的新实例对象,在堆内存中为实例对象分配内存空间,并调用指定类的构造方法,最后将实例对象的首地址赋值给引用变量p3。29类方法的调用类方法直接和类联系在一起,它不能通过类的实例来调用,类方法中不能有对类的对象变量的操作。类方法调用形式如下:类名类名.类静态方法名类静态方法名(实参列表实参列表)对象方法调用形式如下:类对象名类对象名.类非静态方法名类非静态方法名(实参列表实参列表)30static静态变量
17、当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。编写使用静态变量统计一个类产生的实例对象的个数的程序31例子1/*01*/public class static_demo/*02*/*03*/public static int i=0;/*04*
18、/public int j=0;/*05*/public void show()/*06*/*07*/System.out.println(i);/*08*/System.out.println(j);/*09*/*10*/*11*/*12*/class test/*13*/*14*/public static void main(String args)/*15*/*16*/static_demo obj1=new static_demo();/*17*/obj1.i=100;/*18*/obj1.j=200;/*19*/obj1.show();/*20*/static_demo obj2=
19、new static_demo();/*21*/obj2.show();/*22*/*23*/32/*01*/public class classNumberDemo/*02*/*03*/public static int objNum=0;/*04*/public classNumberDemo()/*05*/*06*/classNumberDemo.objNum+;/*07*/*08*/public void show()/*09*/*10*/System.out.println(the No.+classNumberDemo.objNum);/*11*/*12*/*13*/public
20、static void main(String args)/*14*/*15*/classNumberDemo p=null;/*16*/p=new classNumberDemo();/*17*/p.show();/*18*/p=new classNumberDemo();/*19*/p.show();/*20*/p=new classNumberDemo();/*21*/p.show();/*22*/*23*/例子233静态代码块 一个类中可以使用不包含在任何方法体中的静态代码块(static block),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。
21、类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。34例子/*01*/public class static_block/*02*/*03*/static/*04*/System.out.println(hello block);/*05*/*06*/public static void main(String args)/*07*/*08*/System.out.println(hello main);/*09*/*10*/35/*01*
22、/public class classNumberDemo1/*02*/*03*/public static int objNum=0;/*04*/static/*05*/*06*/以前已经创建了100个对象;/*07*/classNumberDemo1.objNum=100;/*08*/*09*/public classNumberDemo1()/*10*/*11*/classNumberDemo1.objNum+;/*12*/*13*/public void show()/*14*/*15*/System.out.println(the No.+classNumberDemo1.objNu
23、m);/*16*/*17*/*18*/public static void main(String args)/*19*/*20*/classNumberDemo1 p=null;/*21*/p=new classNumberDemo1();/*22*/p.show();/*23*/p=new classNumberDemo1();/*24*/p.show();/*25*/p=new classNumberDemo1();/*26*/p.show();/*27*/*28*/36static静态方法在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这
24、是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。静态方法不能以任何方式引用this和super关键字。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。main()方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。37静态构造方法38对象的创建对象的创建 要使用某一个类所定义
25、的属性或方法时,必须先定义并创建这个类的一个对象,并用对象调用属性或方法,而不能直接用类去调用属性和方法。定义对象的格式如下:类名 对象名,对象名,;例如:Car myCar1,myCar2,myCar3;Person p1=new Person();执行完后的内存状态39创建对象称为类的实例化,它的格式如下:对象名=new 类名();例如:myCar1=new Car();/创建对象myCar1定义和创建对象放在同一个语句,格式如下:类名 对象名=new 类名();例如:Car myCar4=new Car();/定义并创建对象myCar440对象的销毁Java中对象的创建由程序来实现,而对
26、象的删除和回收则不能通过程序来实现垃圾回收过程分析垃圾收集器是Java虚拟机中运行着的一个程序,该程序不停地检查堆Heap内存中对象的使用情况,并将无用的对象从中删除但什么时间回收,回收的过程及次序则独立于当前程序的,完全由Java系统决定,程序开发人员没法来干涉c+中的析构方法 java中的finalize()方法 System.gc的作用 Car myCar4=new Car();/定义并创建对象myCar4myCard4=null;/myCard4称为没有变量引用的对象,将被GC回收41包包允许将类组合成较小的单元(类似文件夹),使其易于找到和使用相应的类文件有助于避免命名冲突。在使用许
27、多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突包允许在更广的范围内保护类、数据和方法,可以在包内定义类,而在包外的代码不能访问该类“包将类名空间划分为更加容易管理的块,包既是命名机制也是可见度控制机制”42创建包package mypackage;public class Calculate public double volume(double height,double width,double depth)声明包43导入包import mypackage.Calculate;public class PackageDemo publi
28、c static void main(String args)Calculate calc=new Calculate();导入包44继 承在Java编程语言中,通过继承可利用已有的类,并扩展它的属性和方法。这个已有的类可以是语言本身提供的、其他程序员编写的或程序员原来编写的。继承性在Java中无所不在。如果我们在声明类A时,指明类A继承了类B(类B是一个已定义了的类),则类A通常就拥有了类B的成员变量和方法。此时,类B称为类A的超类(superclass),超类也称为基类;类A称为类B的子类(subclass),子类也称为派生类。Object类是Java中所有类的超类,也就是说Java中的类
29、直接或间接由Object类派生而来。45继 承继承是面向对象编程的一个主要优点之一,它对如何设计Java类有着直接的影响。继承有如下几点好处:(1)它可以利用已有的类来创建自己的类,只需要指出自己的类和已有的其他的类有什么不同即可,而且还可以动态访问其他有关的类中的信息。(2)通过继承,可以利用Java类库所提供的丰富而有用的类,这些类都已经被很好地实现。(3)当设计很大的程序时,继承可以使程序组织得更加层次清晰,有利于程序设计和减少错误的发生。类继承语法形式 类继承语法形式如下:classSubClassName extends SupperClassName46BasicCalculato
30、r/*01*/public class BasicCalculator/*02*/public int add(int a,int b)/*03*/*04*/return a+b;/*05*/*06*/public int minus(int a,int b)/*07*/*08*/return a-b;/*09*/*10*/47AdvancedCalculator/*01*/public class AdvancedCalculator extends BasicCalculator/*02*/public int multify(int a,int b)/*03*/*04*/return a
31、*b;/*05*/*06*/public int devided(int a,int b)/*07*/*08*/return a/b;/*09*/*10*/48/*01*/public class Test/*02*/*03*/public static void main(String args)/*04*/*05*/AdvancedCalculator st1=new AdvancedCalculator();/*06*/int iResult=st1.add(3,2);/*07*/System.out.println(3+2=+iResult);/*08*/iResult=st1.min
32、us(3,2);/*09*/System.out.println(3-2=+iResult);/*10*/iResult=st1.multify(3,2);/*11*/System.out.println(3*2=+iResult);/*12*/iResult=st1.devided(3,2);/*13*/System.out.println(3/2=+iResult);/*14*/*15*/49练习1编写一个类,提供Add方法(包含2个参数),当传入的参数都是整型时,返回相加后的结果当传入参数都是字符串时,返回两个字符串相连后的结果当传入的参数一个是整型,一个是字符串时,返回相连后的结果50
33、练习2编写程序,要求使用面向对象,实现以下结果:=父亲:=名字:张氏 年龄:51 身高:170cm 爱好:唱歌 地址:深圳 户籍:北京 =儿子:=名字:张山 年龄:21 身高:175cm 爱好:唱歌,跳舞 地址:北京 户籍:北京 学校:北京师大 =51练习3说出下面程序的运行结果说出下面程序的运行结果public class ClassPointpublic static int x;public int y;ClassPoint(int x,int y)this.x=x;this.y=y;public static void main(String args)ClassPoint p1;ClassPoint p2;ClassPoint p3;p1=new ClassPoint(1,10);p2=new ClassPoint(2,20);p3=new ClassPoint(3,30);System.out.println(p1.x+,+p1.y);System.out.println(p2.x+,+p2.y);System.out.println(p3.x+,+p3.y);52