第3章类的封装、继承和多态.ppt_第1页
第3章类的封装、继承和多态.ppt_第2页
第3章类的封装、继承和多态.ppt_第3页
第3章类的封装、继承和多态.ppt_第4页
第3章类的封装、继承和多态.ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.1 类和对象 3.2 类的封装性 3.3 类的继承性 3.4 类的多态性 3.5 类的抽象性,第3章 类的封装、继承和多态,术语:对象是类的实例(instance),3.1 类和对象的概念,第1辆,第2辆,第3辆,类(class),对象(object),class Cylinder ,double radius ; /声明成员变量radius int height , color ; /声明成员变量height, color double pi=3.14; /为数据成员赋初值,void area( ) /成员方法area() System.out.println(“圆柱底面积=”+ pi*

2、radius* radius); void volume( ) /成员方法volume () System.out.println(“体积=”+(pi*radius* radius)*height); , /类 定义结束,Cylinder volu1 ; /声明指向对象的变量volu volu1=new Cylinder(); /利用new创建新的对象,并让变量,创建新的对象:,定义圆柱体类Cylinder,类修饰符 class 类名称 成员变量说明 成员方法说明 ,类的一般结构,2. 类体,1. 类声明,3.1.1 类的定义,详见以下说明 类修饰符 、 成员变量说明 、 成员方法说明 ,类修

3、饰符的含义,注:抽象类不能创建对象,但可以继承; 最终类不能承类,但可以创建对象。,格式: 修饰符 变量类型 变量名 =初值 ; 例如 : public int a = 5 ;,其中有关变量作用域的修饰参考理解,另外两个变量修饰符的解释: 静态变量 (static): 为 “类变量”,没有该修饰为“实例变量” 最终变量 (final): 定义名字常量,以后不可再赋值。,成员变量,修饰符 返回值的数据类型 方法名(参数1,参数2,) 语句序列; return 表达式; ,说明:1.成员方法修饰符与成员变量类似,修饰符可以重叠 例如: public static void main(.) 2. 没

4、有返回值的,用 void 3. 如果声明了返回类型 ,则方法体必须有return ; 如果声明了void , 则方法体不必有return,成员方法,声明方法的语法格式:,public class MyDate int year,month,day ; void set (int y, int m, int d) year = y; month = m; day = d; ,类的例子 - 一个日期的类,P69,成员变量,成员方法,3. 方法重载,在2.4.3 中(P59),方法重载的例: Math.abs()方法声明有4种: int abs(int a) long abs(long a) flo

5、at abs(float a) double abs(double a),什么是重载: 类内多个方法同名,但参数的个数或类型不完全相同,系统类System.in.println方法,用它来输出整型数据、实型数据、字符串等。下面是重载的println方法的类型:,public void println() public void println(boolean x) public void println(char x) public void println(int x)public void println(long x)public void println(float x)public

6、void println(double x)public void println(char x)public void println(String x)public void println(Object x),再看 P69的例 set(),void set ( int year, int month, int day) void set ( int month, int day) void set ( int day),调用的例子 d1.set(9,1,1) d1.(45,89) d1.(23),void set ( int y, int m, int d) void set ( int

7、 d, int m, int y),错误的例子 (P70),参数的个数和类型都相同, static int max(int a,int b) if(ab) return a; else return b; static double max(double a,double b) if(ab) return a; else return b; 调用: int a=2, b=3; double c=3.565 , d=6.34224; int x=max(a,b); double y=max(c,d),用下面的程序片段,说明重载的一种作用,3.1.2 对象(类的实例),例: Circle c1 ;

8、 /声明对象变量( c1是类Circle的实例) c1=new Circle(); /利用new创建新的对象 也可以写成: Circle c1 = new Circle();,一般格式: 类名 对象 ; 对象 = new 类名();,默认构造方法,或者:类名 对象 = new 类名();,可以将Circle理解为“类”类型,. . 例如: c1.radius=2.8; a=c1.area();,类 名 .类变量名 类 名 .类方法名,对于类成员,即静态变量和静态方法的访问:,对象的使用访问成员,对实例成员(非静态的),【例3.1c】日期类及日期对象的简单例,public class MyDat

9、e0 /类声明 int year, month, day; /成员变量 void set(int y, int m, int d) /成员方法 year = y; month = m; day = d; public String toString() /成员方法返回中文日期 return year+年+month+月+day+日; public static void main(String args) MyDate d1 = new MyDate(); /创建实例 System.out.println(新创建的对象默认日期为:+d1.toString(); d1.set(2009,7,16

10、); /调用类的成员方法 System.out.println(经设置后日期为:+d1.toString(); ,【例3.1】声明日期类及使用日期对象 P71,public class MyDate /类声明 int year, month, day; /成员变量 void set(int y, int m, int d) /成员方法 void set(MyDate d) /重载 public String toString() /成员方法 public boolean equals(MyDate d) /比较相等 public static void main(String args) My

11、Date d1 = new MyDate(); /创建对象d1 d1.set(2009,7,16); /调用对象的成员方法 MyDate d2 = d1; /对象引用赋值 System.out.println(); d2.year = 2008; /修改成员变量值 . / end main / end class,【例3.1】,4. 对象的引用模型 (对象的赋值),MyDate d1 = new MyDate();,d1.set(2009,7,16);,MyDate d2 = d1;,d2.year = 2008;,1. 对象封装成员变量和成员方法, 而对象名就是指向对象的地址。 2.对象赋值

12、是“指针复制” 3.创建对象的另一种方法:对象赋值。,MyDate d2 = new MyDate(); d2.set(d1);,d2.set(2008,8,8);,5. 对象的关系运算与比较相等,MyDate d2 = d1;,d1=d2为true,d2. equals(d2)为true,如果不用上述方法创建d2,如果上文,赋值创建d2,d1=d2为false,d2. equals(d2)为true,改变d2不影响d1,对象的比较运算 “ = = ” 是比较地址,而不是比较内容 用equals方法,可比较两对象的内容(对象成员)是否相同,【思考题 3-1】为 MyDate 类增加显示星期几的

13、方法,在【例3.1c】简单例中,修改为【例3.1c_week】,public class MyDate0week /类声明 int week1(int y, int m, int d) if (m=1 | m=2) y=y-1;m=12+m; return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7+1); ,System.out.println(,星期+d1.week1(2009,7,16);,主方法中:,3.2 类的封装性,3.2.1 构造方法与析构方法 3.2.2 this引用和instanceof对象运算符 3.2.3 访问控制 3.2.4 静态成员

14、 3.2.5 析构方法 3.2.6 浅拷贝与深拷贝,回顾 - 类和对象,【例3.1c】日期类及日期对象的简单例 public class MyDate0 /类声明 int year, month, day; /成员变量 void set(int y, int m, int d) /成员方法 year = y; month = m; day = d; public static void main(String args) MyDate d1 = new MyDate(); /创建实例 ,默认构造方法,3.2.1 构造方法,构造方法是与类同名的方法,用于创建对象。 并在时初始化对象的成员,说明:

15、1.构造方法是 public 修饰的 2.类内的成员次序是任意的。并推荐下列顺序,class Student 成员变量 构造方法 其它方法 ,1. 声明及调用构造方法 public class MyDate public MyDate(int y, int m, int d) /声明构造方法 year = y; month = m; day = d; MyDate d = new MyDate(2009,7,18); 2. 默认构造方法 public MyDate() 默认的成员值见P73(0,0.0, 0等) 【例3.1】是用默认的构造方法,创建对象:,叶书的例 P73,MyDate d1

16、= new MyDate();,注:对象默认初始值,类名称 () 为成员变量初始化 ,无参数,但有方法体的构造方法。,格式:,public class MyDate public MyDate( ) /声明无形参构造方法 year = 1980; month = 1; day = 1; MyDate d = new MyDate(); /对象d 有默认成员1980、1、1 ,小结三种构造方法的定义和使用:,类名称 () 为成员变量默认初始化 ,类名称 () ,类名称 (参数列表) 为成员变量初始化 ,默认,(1)构造方法的方法名与类名相同; (2)构造方法没有返回值,也不能写 void; (3

17、)构造方法的主要作用是创建对象和初始化; (4)构造方法一般不能由编程人员显式地直接调用, 而是用new来调用; (5)在创建一个类的对象的同时,系统会自动执行一次 构造方法的方法体。(例如 print 将显示),构造方法的特殊性,public class MyDatec / int year, month, day; / MyDatec(int y, int m, int d) / /void MyDatec(int y, int m, int d) / year = y; month = m; day = d; System.out.println(创建MyDatec对象:+year+年+

18、month+ 月+day+日); public static void main(String args) MyDatec d1 = new MyDatec(2008,1,2); MyDatec d2 = new MyDatec(2010,3,24); ,【例3.1cc】 系统会自动执行构造方法的方法体,3. 拷贝构造方法,public MyDate(MyDate d) year = d.year; month = d.month; day = d.day; 调用语句如下: MyDate d1 = new MyDate(2009,7,16); MyDate d2 = new MyDate(d1

19、); 第2句功能相当于以下两句: MyDate d2 = new MyDate(); d2.set(d1);,构造方法的形参可以是该类对象,称为拷贝构造方法,4. 构造方法重载,public MyDate(int y, int m, int d) 。 public MyDate() 。 public MyDate(MyDate d) 。,3.2.2 this引用和instanceof对象运算符,1. this引用 (1)指代对象本身 this (2)访问本类的成员变量和成员方法 this.成员变量 this.成员方法(参数列表) (3)调用本类重载的构造方法 this(参数列表) 2. ins

20、tanceof 对象运算符 d instanceof MyDate (结果为boolean型),public class MyDate int year, month, day; void MyDatet(int y, int m, int d) year = y; month = m; day = d; . ,public class MyDate int year, month, day; void MyDatet(int year, int month, int day) year = year; month = month; day = day; . ,this.year = year

21、; this.month = month; this.day = day;,构造方法使用this,定义学生类Student(包含属性有学号、姓名;方法有设置、显示这些属性) 定义主类app3_2显示学生信息,练习、作业,3.2.3 访问控制,类的访问权限:只有public和缺省两种 。 public class MyDate class MyDate_ex 类中成员的访问权限 声明set()和get()方法存取对象的属性,一般地:对私有变量,建立一个公有方法,供外部访问,class Person private String name; public Person(String name) t

22、his.set(name); public void set(String name) = name; public String getName() return ; public class ex3_2 public static void main(String args) Person p1 = new Person(李小明); Person p2 = p1; p2.set(王小伟); System.out.println((); /类外访问私有变量,不可以 ,公有方法访问私有变量,有四种名词: 实例变量、类变量(静态变量) 实例方法

23、、类方法(静态方法),3.2.4 静态成员,static称为静态修饰符,它可以修饰类中的成员。被static修饰的成员被称为静态成员,也称为类成员,否则不用static修饰的成员称为实例成员。,我们学习的重点是静态方法,,public class MyDate private int year,month,day; /实例成员变量 private static int thisYear; /静态成员变量 static /静态成员变量初始化 thisYear=2009; public static int getThisYear() /静态成员方法 return thisYear; /访问静态成

24、员变量 ,叶书P77 中的例,类Cylinder,对象volu1,对象volu2,pi R ,h color print(.),r = 2 h =5 color = “红色” print(.),r = 6 h =11 color = “蓝色” print(.),类成员存储在类空间(共享);实例成员存储在对象空间,静态成员的理解,静态成员属于类,是多个实例(对象)公用的。引用时只要加类名前缀。 例如数学类中定义了静态变量 Math.PI,静态成员的引用: 类名 . 静态变量 类名 . 静态方法,实例成员的引用: 对象名 . 静态变量 对象名 . 静态方法,/add.java public cla

25、ss add int sumab(int a, int b) return a+b; public static void main(String args) int c,m=4,n=3; c=sumab(m,n); System.out.println(sum=+c); ,一个错误的例子,D:java2010javaexadd.java:7: 无法从静态上下文中引用非静态 方法 sumab(int,int) c=sumab(m,n); 1 错误,修改为正确的:添加 siaitc,/Circle 实例方法编程 class Circle double r; public double area(

26、double r) return 3.14*r*r; public class ex2_6sl public static void main(String args) double r=10; Circle c = new Circle(); double a=c.area(r); System.out.println(园面积=+a); ,比较静态方法和实例方法编程,/Circle 静态方法编程 class Circle double r; public static double area(double r) return 3.14*r*r; public class ex2_6jt pu

27、blic static void main(String args) double r=10; double a=Circle.area(r); System.out.println(园面积=+a); ,public class MyDate private int year,month,day; /私有成员变量 private static int thisYear=2009; /当前年,私有静态 static thisYear=2009; /静态变量初始化 public int getYear() return this.year; public int getMonth() return

28、 this.month; public int getDay() return this.day; class MyData_ex public static void main(String args) ,【例3.2】封装的日期类(原题),运行: Java MyData_ex,【例3.2】封装的日期类 (该为 MyData_ex.java ),class MyDate private int year,month,day; /私有成员变量 private static int thisYear=2009; /当前年,私有静态 static thisYear=2009; /静态变量初始化 pu

29、blic int getYear() return this.year; public int getMonth() return this.month; public int getDay() return this.day; public class MyData_ex public static void main(String args) ,3.2.5 析构方法,public void finalize() /析构方法 语句序列; ,Java自动清除垃圾,除非对象被破坏,才有程序用finalize() 方法清除。,对象的清除的说明,P81,3.2.6 的引言调用方法的两种参数传递方式,当参数为基本数据类型时,是传值方式调用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论