Java语言4.

上传人:zh****71 文档编号:145250736 上传时间:2020-09-18 格式:PPT 页数:26 大小:1.04MB
返回 下载 相关 举报
Java语言4._第1页
第1页 / 共26页
Java语言4._第2页
第2页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java语言4.》由会员分享,可在线阅读,更多相关《Java语言4.(26页珍藏版)》请在金锄头文库上搜索。

1、Java语言程序设计,资源与环境科学学院,主讲教师: 陈玉敏,第四章 类与对象,面向对象的概念,面向过程 在一个结构体中定义窗口的大小,位置,颜色,背景等属性,对窗口进行操作的函数与窗口本身的定义没有任何关系,如HideWindow,MoveWindow,MinimizeWindow,这些函数都需要接受一个代表要被操作的窗口参数 。 面向对象 定义窗口时,除了要指定在面向过程中规定的那些属性,如大小,位置,颜色,背景等外,还要指定该窗口可能具有的动作 ,如隐藏,移动,最小化等。这些函数被调用时,都是以某个窗口要隐藏,某个窗口要移动的语法格式来使用的 ,这是一种主语与谓语的关系。 面向对象的三大

2、特征,封装 (Encapsulation) 继承 (Inheritance) 多态 (Polymorphism),类与对象,类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例 (instance)。 如果类是汽车的设计图纸,那么将对象比作一辆辆的汽车 。所以面向对象程序设计的重点是类的设计,而不是对象的设计。,Java类的声明,类声明语法: 类修饰符 class 类名 extends 父类名 implements 接口名 成员变量定义; 成员方法定义; ,实例:书P66,类与对象,class Person int age; void shout()

3、 System.out.println(“oh,my god! I am “ + age); age是类的属性 ,也叫类成员变量 。 shout是方法也叫类的成员函数。 shout方法可以直接访问同一个类中的age变量 ,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。,对象的创建,Person p1 = new Person(); 执行完后的内存状态,当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型。,对象的使用,创建新的对象之后,我们就可以使用“ 对象名.对象成员 ”的格式,来访问

4、对象的成员(包括属性和方法) class TestPerson public static void main(String args) Person p1 = new Person(); Person p2 =new Person(); p1.age = 30; p1.shout(); p2.shout(); ,对象的生命周期,对象的比较,“=”运算符与equals()方法的区别 “=”运算符用于比较两个变量的值是否相等 equals()方法比较两个对象中的内容是否一致 class test public static void main(String arg) String str1 =

5、new String(“abc”); String str2 = new String(“abc”); String str3 = str1; if (str1 = str2) System.out.println(“true”); else System.out.println(“false”); ,False,因为两个对象的首地址不一样,str1是第一个对象首地址,str2是第二个对象的首地址。 str1.equals(str2)?,类的封装性,如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属

6、性。 在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。,对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。,类的封装性,一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。 我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追

7、求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。 优点:,隐藏类的实现细节;让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;便于修改,增强代码的可维护性,实例:书P73,Java的构造函数,构造方法的特征 它具有与类相同的名称; 它不含返回值,它不能在方法中用return语句返回一个值 构造方法的作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。使用new来创建类的新实例时,Java完成三项工作(书P74)。 在java每个类里都至少有一个

8、构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,该方法什么也不做。一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。,构造函数重载,和一般的方法重载一样,重载的构造函数具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new 关键字产生对象时,该调用哪个构造方法了。 产生对象的格式: 类名 对象名new 类名(参数列表) ; 重载构造方法可以完成不同初始化的操作。 实例:矩形类的构造函数重载(实例:书p75)。,类的继承,通过继承可以简化类的定义 。 Java只支持单继承,不允许多重继承(不能同时继承多个类)。 可以有多层继承,

9、即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。 子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表) 调用父类的构造方法。 如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类实例对象时,系统默认调用父类无参数的构造方法。,类的继承,class Person public String name; public int age; public void getInfo() System.out.println(name=+name

10、+,age=+age); class Student extends Person public String school; public void study() class TestStudent public static void main(String arg) Student st = new Student(); st.name = zhangsan; st.age = 20; st.getInfo(); ,类的继承,class Person /增加一个构造函数 public Person(String name,int age) this.name = name; this.

11、age = age; class Student extends Person . class TestStudent public static void main(String arg) Student st = new Student(); st.name = zhangsan; st.age = 20; st.getInfo(); ,编译出错: 子类出现问题,找不到父类构造函数Person()。 系统中默认的Student()构造函数将先调用父类不带参数构造函数。此时父类有了新构造函数,则Person()找不到了,出错。,类的继承,class Person /增加一个构造函数 publ

12、ic Person(String name,int age) this.name = name; this.age = age; class Student extends Person . class TestStudent public static void main(String arg) Student st = new Student(); st.name = zhangsan; st.age = 20; st.getInfo(); ,public Student()super(Zhangsan,15); ,防止编译出错的两种方法: 1、在父类中增加无参数构造函数; 2、在子类增加

13、构造函数,用super调用父类的构造方法。,public Person() ,覆盖父类的方法,覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。实例p76 如果在子类中想调用父类中的那个被覆盖的方法,我们可以用super.方法的格式 。 覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限 。,类的多态性,多态,即一个名字可具有多种语义。在面向对象的语言中,多态引用表示可以引用多个类的实例。 应用程序不必为每一个派生类(子类)编写调用函数,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。 派生类的功能可以被基类的引用变量引用,这叫向后兼容

14、,可以提高程序的可扩充性和可维护性。,类的多态性,多态,即一个名字可具有多种语义。在面向对象的语言中,多态引用表示可以引用多个类的实例。 应用程序不必为每一个派生类(子类)编写调用函数,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。 派生类的功能可以被基类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。,类的多态性,class Polygon public Polygon() public void draw() System.out.println(Polygon); class Rectangle extends Polygon pub

15、lic Rectangle() public void draw() System.out.println(Rectangle); public class Graphics public static void main( String args ) Polygon poly = new Polygon(); Rectangle rect = new Rectangle(); poly.draw(); poly = rect; poly.draw(); ,输出: Polygon Rectangle,问与答:书 P79,一个类实例编程,编写一个线段类 MyLine,要求如下: 主要属性有: p

16、nt1,pnt2 端点,类型为Point (java.awt.Point) 编写构造方法,如 (int x1,int y1,int x2,int y2) 或 (Point p1 , Point p2) 编写成员方法。如: 检查线段是否位于第一象限check 求线段的长度 length() 求该线段中点的x坐标 其他方法。 编写测试程序,Graphics类与图形绘制, Component.getGraphics方法,将返回Graphics类对象。 Graphics.drawLine(int x1,int y1,int x2,int y2)方法。 Graphics.drawString(String str,int x,int y)方法。 注意:drawString方法的坐标参数中(x,y)为文本的左下角。 编程实例:在编写的MyLine类基础上,为MyLine添加一个DrawMe(Gr

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号