资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第四章 面向对象编程,本章主要内容,4.1 简介 4.2 面向对象的基本概念 4.3 面向对象的基本语法 4.4 类和包 4.5 类的方法 4.6 对象 4.7 继承和多态 4.8 接口和抽象类 4.9 面向对象开发概念,定义类的方法的步骤是什么? 类中的一个方法如何调用类的另一个方法? 类中的一个方法如何调用另一个类的方法? 分别说明成员变量和局部变量的作用域。 如何给类的方法添加JavaDoc注释?,课程回顾,本章目标,掌握继承 掌握super关键字 掌握多态,4.6 继承和多态,计算机语言设计犹如在 公园里漫步。我是说侏 罗纪公园 。 Larry Wall (Perl 语言之父),生活中的继承,生活中,继承的例子随处可见,动物,食草动物,食肉动物,谁是父类? 谁是子类? 能说出继承的特点吗?,继承需要符合的关系:is-a,父类更通用、子类更具体,生活中的继承,子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性,巴士是汽车吗? 卡车是汽车吗? 出租车是汽车吗?,汽车,请问:出租车包含哪些属性和行为呢?,4.6.1 类和类的继承,类的设计其实是对现有世界的模仿 在继承中,一般常见的有属性继承,属性隐藏,方法继承,方法覆盖,方法重载等技术。 在Java语言中,用extends关键字来表示一个类继承了另一个类 在父类中只定义一些通用的属性与方法 子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法 子类的构造方法中,通过super关键字调用父类的构造方法 方法重写后,通过super关键字调用父类的方法 在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类,如何实现继承 3-1,在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:,public class Woman extends Human /其余代码省略 ,在父类中只定义一些通用的属性与方法,例如:,public class Human private String name; private String school; public Human(String name, String sex, int age) /初始化属性值 public void canEat() public void breath() ,如何实现继承 3-2,子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法,public class Human private String name; / 教员姓名 private String sex;/ 所在中心 public Human (String myName, String mySex) /初始化属性值 public void sayHello() /方法的具体实现 ,public class Father extends Human public Father(String myName, String mySex) super(myName, mySex); public void sayHello() System.out.println(“你好,我是爸爸“); super.sayHello(); ,由于sayHello()方法与父类的实现有所不同,因此重写了该方法,方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型,父类中的属性和方法可以被子类继承,public class Father extends Human public Father(String myName, String mySex) super(myName, mySex); ,如何实现继承 3-3,子类的构造方法中,通过super关键字调用父类的构造方法,方法重写后,通过super关键字调用父类的方法,public class Father extends Human public void sayHello() System.out.println(“你好,我是爸爸“); super.sayHello(); ,通过调用父类的构造方法,完成对属性值的初始化,一切类的“祖先”Object,在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类,public class MyObject / ,public class MyObect extends Object / ,在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法,4.6.1 类和类的继承,函数的覆盖和重载的区别,4.6.1 类和类的继承,重载的情况下,子类的访问权限比父类要大。 参看课本例4.15 Man类: 用于测试Man类的程序:,为什么需要多态 5-1,在Woman/Man类的基础上,开发一个类用来判断,负责对Woman、Man中的方法进行判断: 1、打招呼,为什么需要多态 5-2,第一种解决方案,public class Judge public void judge(Man man) man.sayHello(); man.isFather(); public void judge(Woman woman) woman.sayHello(); woman.isMother(); public static void main(String args) Man lisi = new Man(“李四“,“男“); Woman lili = new Woman(“李丽“,“女“); Judge judge = new Judge(); judge.judge(lisi); judge.judge(lili); ,我继承于Human类,是个男性 大家好,我是李四,是个男人 我继承于Human类,是个女性 大家好,我是李丽,是个女人,控制台输出,为什么需要多态 5-3,现在,升级人类,增加一种新类型:Boy 同时,Judge也负责对这类进行评估,为什么需要多态 5-4,如果在第一种解决方案的基础上去解决,我们需要如下两个步骤: 建立Boy类 修改Judge类,增加方法:judge(Boy boy),每增加一种新的人类型,都要修Judge类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差,能找到这个解决方案的弊端吗?,为什么需要多态 5-5,第二种解决方案使用多态,public class JudgeAll public void judge(Human human) human.sayHello(); public static void main(String args) JudgeAll judgeall = new JudgeAll(); judgeall.judge(lisi); judgeall.judge(lili); judgeall.judge(xiaoming); ,可以接收子类类型,根据实际创建的对象类型调用相应方法,我继承于Human类,是个男性 大家好,我是李四,是个男人 我继承于Human类,是个女性 大家好,我是李丽,是个女人 我继承于Human类,是个男孩,还没有成年,控制台输出,使用多态之后,当需要增加新的子类类型时,无需更改Judge类,程序的可扩展性及可维护性增强,什么是多态,简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作,彩色打印机,打印机,黑白打印机,打印效果:彩色,打印效果:黑白,打印,打印,public class Human public void sayHello() System.out.println(“大家好,我是“ + name + “,是个“ + sex + “人“); ,如何实现多态,1、子类重写父类的方法 2、编写方法时,使用父类定义的方法 3、运行时,根据实际创建的对象类型动态决定使用哪个方法,总结 2-1,给定如下Java代码,编译运行后,输出结果是什么?,class Base public String name; public Base() name = “Base“; public Base(String pName) name = pName; public void method() System.out.println(name); ,class Child extends Base public Child() super(“Child1“); name=“Child2“; ,public class Sample public static void main(String args) Child c = new Child(); c.method(); ,Child2,控制台输出,1,2,3,总结 2-2,给定如下Java代码,编译运行后,输出结果是什么?,public class Human public void sayHello() System.out.println(“你好,我是人类“); ,public class Boy extends Human public void sayHello() System.out.println(“你好,我是男孩“); ,1,2,public class Test public static void main(String args) Human t = new Boy (); t.sayHello(); ,控制台输出,你好,我是男孩,4.6.2 类的运行时多态,当不同的对象接受到相同的消息名(或者说当不同的对象调用相同的名称的成员函数)时,可能引起不同的行为(执行不同的的代码)。这种现象称为多态性. 多态包括编译时多态和运行时多态两种。 编译时多态和运行时多态的区别 。 编译时的多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态。 运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号