第三章类与对象.ppt

上传人:sccc 文档编号:5292896 上传时间:2023-06-23 格式:PPT 页数:49 大小:310.02KB
返回 下载 相关 举报
第三章类与对象.ppt_第1页
第1页 / 共49页
第三章类与对象.ppt_第2页
第2页 / 共49页
第三章类与对象.ppt_第3页
第3页 / 共49页
第三章类与对象.ppt_第4页
第4页 / 共49页
第三章类与对象.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第三章类与对象.ppt》由会员分享,可在线阅读,更多相关《第三章类与对象.ppt(49页珍藏版)》请在三一办公上搜索。

1、1,第三章 类与对象,2,主要内容,1、面向对象的概念2、面向对象的基本特征3、类,变量,数据成员与方法4、对象的创建,初始化5、static,final变量及方法6、方法重载7、This关键字8、对象的回收9、包10、Java基础类库11、类的访问控制参考thinking in java第一,四,五章郑莉版教材第二章,第四章4.6李发致版教材第三章,第四章4.2,4.4.1,4.4.2,3,1、面向对象的概念,面向对象的程序设计与结构化程序设计方法相比,更符合人类认识现实世界的思维方式 已成为程序设计的主流方向涉及的主要概念封装继承多态,4,现实世界中万物皆对象都具有各自的属性(名词),对外

2、界都呈现各自的行为(动词)程序中一切都是对象都具有标识(identity),属性和行为(方法)通过一个或多个变量来保存其状态通过方法(method)实现他的行为,1.1对象,5,例:钟表数据(属性)int Hour;int Minute;int Second;方法(行为)SetTime();ShowTime();,6,例:学生数据(属性)String name;int ID;int Eng;int Math;方法(行为)统计成绩getEng(),getMath()getTotal(),7,将属性及行为相同或相似的对象归为一类。类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为。,1.

3、2 类,8,可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)。对象是类的具体实例。,9,例如:类 Car 及 Car 的对象,Car 的对象们:Car redCar=new Car();Car greenCar=new Car()Car blackCar=new Car();redCar.brake();greenCar.speedUp();,10,2面向对象基本特征,封装:将对象的数据和基于数据的操作封装在一起,封装使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。,11,继承有助于软件的重用性

4、,使程序结构清晰,降低了编码和维护的工作量新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)在继承过程中派生类继承了基类的特性,包括方法和变量派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要,12,Vehicle,Bicycle,MotorVehicle,Airplane,13,多态一个程序中同名的不同方法共存不同类的对象可以响应同名的方法,具体的实现方法却不同使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题,14,3、类,变量,数据成员及方法3.1 类的声明,声明形式public abstract|fin

5、al class 类名称 extends 父类名称 implements 接口名称列表 数据成员声明及初始化;(field,constructor)方法声明及方法实现;(method declaration),class Car int color_number;int door_number;int speed;void brake()void speedUp()void slowDown(),15,关键字Class表明其后声明的是一个类。extends如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后implements如果所声明的类要实现某些接口,那么,接口的名

6、字应写在implements之后,16,修饰符可以有多个,用来限定类的使用方式public表明此类为公有类abstract指明此类为抽象类final指明此类为终结类 类声明体数据成员声明及初始化可以有多个方法声明及方法实现可以有多个,17,例:钟表类 Clock.javapublic class Clock/成员变量 int hour;int minute;int second;/成员方法 public void setTime(int newH,int newM,int newS)hour=newH;minute=newM;second=news;public void showTime()

7、System.out.println(hour+:+minute+:+second);,18,数据成员包括基本数据类型和引用类型的数据。也就是Java中任意的数据类型(基本数据类型,类,接口,数组)在一个类中数据成员(变量)名是唯一的,3.2数据成员,19,声明格式public|protected|private static final数据类型 变量名1=变量初值,变量名2=变量初值,;static int sum=7;private String gardenName;private Fruit banana;格式说明Public,protected,private 为访问控制符,stat

8、ic指明这是一个静态成员变量(类变量)final指明变量的值不能被修改,20,3.3方法,方法是在类中定义,用来实现对象操作的函数。声明格式public|protected|private static finalabstract synchronized返回类型 方法名(参数列表)throws exceptionList方法体返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void。,21,方法的参数传递,参数的类型可以是基本数据类型,也可以是引用类型。Java语言中,基本类型作为参数均采用传值(passing by-value)的方式完成,也就是,对形参的任何改动

9、都不会影响到实参。而引用类型变量作为参数传递时,采用的是引用传递(passing-by-reference)的方式,在方法体中对形参的改动将会影响到原来的变量。例MethodArgment.java,22,一个简单的类:类的定义放在Car.java里,测试代码放入CarDemo.java里,运行时,这两个文件放在同一目录下。或者两段代码放在同一文件CarDemo.java,class Car int car_number;void set_number(int car_num)car_number=car_num;void show_number()System.out.println(“My

10、 car No.is:”+car_number);,class CarDemo public static void main(String args)Car DemoCar=new Car();DemoCar.set_number(3456);DemoCar.show_number();,My car No.is:3456,23,或者把main()也放入Car类里,文件名为Car.java,适用于代码少的程序。,public class Car int car_number;void set_number(int car_num)car_number=car_num;void show_nu

11、mber()System.out.println(“My car No.is:”+car_number);public static void main(String args)Car DemoCar=new Car();DemoCar.set_number(3456);DemoCar.show_number();,24,4、对象的创建,初始化,对象的创建与C+类似,同样的Java也提供了构造方法(constructor)在对象创建时被自动调用,进行对象初始化。,25,4.1 对象的创建,对象的声明格式类名 变量名 例如Car是已经声明的类名,则下面语句声明了一个CarDemo对象(也叫做实例

12、)Car CarDemo;,26,对象的创建生成实例的格式:new()例如:CarDemo=new Car()或者声明与创建合为一步:Car CarDemo=new Car();其作用是:在内存中为此对象分配内存空间引用变量的初值为null,也可以被赋以空值例如:CarDemo=null;见例:CircumferenceTest.java,27,4.2对象的初始化(Object Initialization),与C+相似,新创建对象的初始化是通过构造方法(constructor)来完成一个带有构造方法的Cat类例:MyConstructor.java,28,4.2.1 构造方法定义,构造方法的

13、特点一种和类同名的特殊方法没有返回类型,修饰符void也不能有通常被声明为公有的(public)可以有任意多个参数主要作用是完成对象的初始化工作不能在程序中显式的调用在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化,29,String toString(),String toString()是一个经常用到的方法,当需要把一个对象输出到屏幕,就要用到此方法.实际上,Java的所有类都有一个默认的toString(),例如TimeStamp.java中System.out.println(newTime)就等价于System.out.println(newTime.toStrin

14、g);如果直接调用默认的toString(),返回结果形式为:对象类的名字对象的地址。,30,编译后运行结果如下:TimeStamp7d772e解释之后的数值为对象newTime所指的存储地址。,31,如果自己重写TimeStamp.java,将对象的内容转换为字符串,再输出到屏幕。见例:TimeStamp2.java可见,使用toString()简化了代码,不必再用多个println把对象的数据一一打印出来。另例:一个带有constructor的Student.java,32,声明toString时需要注意以下事项:toString()必须为public;返回类型为String;方法的名称必

15、须为toString,且没有参数;在方法体中不要使用输出方法System.out.println();,33,1)系统提供的默认构造方法如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法。默认的构造方法没有参数,其方法体为空。,4.2.2构造方法种类,34,声明一个银行帐号类BankAcount存于文件BankAccount.java,及测试代码BankTester,放于BankTester.java,这两个文件放在同一个路径下。public class BankAccount/BankAccount.javaString ownerName;int accountNu

16、mber;float balance;,35,public class BankTester/BankTester.java public static void main(String args)BankAccount myAccount=new BankAccount();System.out.println(ownerName=+myAccount.ownerName);System.out.println(accountNumber=+myAccount.accountNumber);System.out.println(balance=+myAccount.balance);,运行结

17、果ownerName=nullaccountNumber=0balance=0.0,36,2)以上的例子在设计上有不妥之处,容易创建一个无ID的银行账号,所以应当为它提供一个带参数的构造方法。为BankAccount声明一个有三个参数的构造方法public BankAccount(String initName,int initAccountNumber,float initBalance)ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;,37,而在main里就可以用来初始化对象:public cla

18、ss BankTester public static void main(String args)BankAccount myAccount=new BankAccount(“Wu”,01123,300);.思考:如果对象初始化值不是如上说示的硬设入程序,程序应该怎样接收从外界,如键盘的用户输入?,38,构建一个Bush类,有两个带参数的构造方法class Bush Bush(int i)Bush(int i,double d)如果写:new Bush();编译器将要告诉你找不到对应的构造方法,39,说明用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。

19、但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法在声明构造方法时,好的声明习惯是不声明构造方法如果声明,至少声明一个无参构造方法,40,5、Static,final 变量及方法,Static:(静态)类变量和(静态)类方法与C+一样,类中有一种特殊的成员或方法,它不属于某个对象,不能通过某个对象来引用,在声明前加上static,41,1、static变量可以被所有的对象共享,生命周期从创建开始到程序运行结束。相当于C语言中全局变量的作用。其它类可以不用通过创建该类的实例,直接通过类名访问它们。例:MelonEx.java,42,不正确的引用class Sta

20、ticError String mystring=“hello”;public static void main(String args)System.out.println(mystring);编译时错误信息:nonstatic variable mystring cannot be referenced from a static context“System.out.println(mystring);”。为什么不正确:只有对象可以访问对象的变量。,43,解决的办法(1)将变量改成static变量class NoStaticError static String mystring=“he

21、llo”;public static void main(String args)System.out.println(mystring);思考:如果NoStaticError类与 main()分别存在两个不同文件里,在main()里应该怎样调用mystring?,44,(2)先创建一个类的对象,然后用对象来调用。class NoStaticError String mystring=“hello”;public static void main(String args)NoStaticError noError;noError=new NoStaticError();System.out.p

22、rintln(noError.mystring);,45,2、static 方法则相当于C语言中的全局函数,其他的类也可以直接通过类名来访问类方法。(Java程序的入口方法main()就是一个static方法)static方法不属于类的某个对象,只能引用static变量或另外的static方法。,46,Java语言规范规定:“永远不要引用特定的对象调用static方法”,有的编译器会显示出错。最好使用类名调用static方法;如果在main()里,或者同类的其他方法里调用,则不必写类名。,47,public class Rectangle static int area(int a,int b

23、)return a*b;public static void main(String args)int rectArea;rectArea=area(4,5);System.out.println(area=+rectArea);与第一章例题Rectangle.java作比较,此例缺乏面向对象的特征。另例:CircleClass.java,static方法的应用,48,终态final,Final把相应的数据和方法设为常量,意味着一旦给定数值之后就不能再改变它们。final static int myChecksum=calculate();final Timestamp noon=new Timestamp(12,00,00);final int universalAnswer=42;,49,final在类之前表示该类是最终类,不能再被继承。final在方法之前表示该方法是最终方法,该方法不能被任何派生的子类覆盖。final在变量之前表示变量的值在初始化之后就不能再改变;相当于定义了一个常量。,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号