您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java语言基础――面向对象编程(II)
Java语言基础—面向对象编程(II)主讲:董旭源Contents多态访问控制继承封装面向对象的三大特性概述三大特性封装继承多态封装什么是封装把对象的私有信息与内部实现细节进行隐藏该隐藏的要隐藏,能暴露的才暴露做成一个组件,便于各司其职,提高可复用性如何封装状态与行为隐藏访问控制•public和private的区别•protected信息隐藏•把属性声明为private、protected•通过公开(public)的getter/setter方法来控制访问方法私有•对于一些实现细节声明为private,实现对外不可视•私有的方法只能在类的内部调用封装的好处属性的读写控制,数据的安全检查隐藏实现细节减少修改、扩展类时对外界组件的影响,增强易维护性提高软件的可复用性引子提供一个动物园的仿真系统现在动物园里有的动物•狮子(Lion):10只•河马(Hippo):3只•华南虎(SCTiger):4只•狗(Dog):25只•猫(Cat):30只•狼(Wolf):7只需要记录每一只动物的基本信息•动物的编号、年龄、喂养的食物•每一种动物的其他特征需要描述动物的行为特征•基本行为特征:吃、睡、散步等•各种动物自身的行为特征设计一个动物仿真程序的继承树设计一个动物仿真程序的继承树设计一个动物仿真程序的继承树在狗群中,吠叫声是个很重要的事情,该声音必须有代表性和独一无二性我吃素,可脾气不太好……设计一个动物仿真程序的继承树对呀,Lion、Tiger和Cat之间有共同的部分狼和狗之间也可以共享某些东西设计一个动物仿真程序的继承树它们都是猫科动物它们都是犬齿动物继承的定义(What)基类(父类/超类)与子类(派生类)我们把一些类的共性再抽取出来,放到一个类中,那么此类就是这一些类的父类,我们就可以说这些子类继承自父类继承意味着子类继承了父类的成员,成员的意思就是实例变量和方法单继承vs.多继承多继承(Multipleinheritance)网状复杂•元素与元素之间(类与类/对象与对象)的关系复杂•遍历时算法很复杂单继承(Singleinheritance)单根树状简单Java的类是单继承使语言简单、灵活使垃圾回收提供方便的实现方法的覆盖形式方法名相同参数列表相同•参数的个数、类型、顺序返回类型一致•若J2SE1.4之前的版本都严格要求类型相同–编译的命令:javac–source1.4Inheritance.java•对于JavaSE1.5later版本,返回类型可以是父类含义子类的实现细节发生了变化体现子类的个性方法覆盖(续)方法的访问控制子类比父类不能更窄化抛出的异常不能更宽泛子类扩展父类增加方法根据子类型与父类型的差异提供更多的方法为什么继承?(Why)继承的目的、作用避免了重复的代码,提高了程序的可重用性定义出(父类与子类)共同的协议何时使用继承(When)从客观世界的角度事物与事物之间的关系•is-a:使用继承•has-a:组合、聚集什么时候不适宜使用继承?继承的缺点程序结构会比较复杂层次一旦多了,就会变得很复杂破坏封装方法访问的控制:子类父类代码复用手段除了继承还有组成、聚合等优先考虑后者继承vs.组合何时才会使用继承?组成vs.聚合类与类之间的关系依赖关联继承(泛化)实现略super构造方法不能被继承在构造方法中super()vs.this()但只能取其一编译器会提供默认的super(…)调用若一个类没有显式继承任何类compiler会自动添加对Object类的继承Object是JVM中唯一没有父类的类用法子类的构造器调用父类的构造方法调用父类的成员•super.创建对象的过程若当前类存在继承关系类加载递归地构建父类对象分配内存空间、赋默认值为每一个父类的实例变量初始化调用该类的构造方法练习某公司的雇员分为以下若干类:Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。方法:getSalary(intmonth)根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。SalariedEmployee:Employee的子类,拿固定工资的员工。属性:月薪HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。属性:每小时的工资、每月工作的小时数SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。属性:月销售额、提成率BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。属性:底薪。写一个程序,把若干各种类型的员工放在一个Employee数组里,写一个函数,打印出某月每个员工的工资数额。注意:要求把每个类都做成完全封装,不允许非私有化属性。访问权限控制ModifiersInsideclassThesamepackageSubclassotherpublicYesYesYesYesprotectedYesYesYesNoDefault(nomodifier)YesYesNoNoprivateYesNoNoNo多态(What)一个对象具有多种形态对象的多态子类对象可以当作父类对象看待或者说,父类的引用可以指向子类的对象•Animalbird=newBird();对象多态的核心体现若子类对象当父类对象看待•只能访问父类中定义的成员属性与方法,而不能访问子类的成员(扩展的部分)若子类对父类的方法进行覆盖,则在调用是会调用子类对象重写的方法多态(What)编译期类型在编译时,由编译器(compiler)所识别的类型其实是编译器对对象引用的主观认识运行期类型在运行时,JVM在访问具体对象时所识别的类型它是JVM堆上创建的实际对象所对应的具体类型多态(What)静态绑定在编译时,编译器编译java程序时对编译期类型的方法进行绑定或者说,在编译期就可以确定所调用的方法动态绑定在运行时,JVM在调用方法过程中对实际对象的方法进行绑定或者说运行时才能确定具体调用的方法多态的表现形式在参数中用多态拿老鼠去喂猫Mousem=newMouse();调用feed(m);方法定义为:voidfeed(Animala){…}返回值上用多态(返回值,能用父类类型的要尽量用)AnimalgetAnimal(inti){if(i==1)returnnewDog();elsereturnnewCat();}//多态性,是对可插入性的一个最基本保障。多态的表现形式对象数组(画图理解)classObjectArrayTest{Object[]array=newObject[];array[0]=newDog();array[1]=newCat();array[2]=newObject();//多态?Objecto1=array;//多态Objecto2=newint[100];//多态}继承与多态面向对象开发中,对于类的继承体系建议尽可能地使用抽象层次比较高的类抽象的功能比较强大,覆盖面比较宽广不容易出问题若子类从父类所继承的方法与子类中添加的方法同名,实现重载(overload)要注意类型提升问题•基本数据类型•引用数据类型运算符instanceof编译期,compiler把所有的强制类型转换的结果都推给开发者原因:强转类型基本上都是在运行时才检查出错误如何让运行时错误编译期检查出来呢?•运算符instanceof用法引用instanceof检查类型Casting问题使用instanceof可以判断引用是否某具体类型在转换前进行,目的是避免运行期的错误子类型可以(隐式地)宽化为父类型父类型向子类型窄化必须显式进行多态的其他问题多态中的变量遮盖(隐藏)子类的属性域与父类的属性域同名•出现变量遮盖构造器的多态加深对对象的创建过程的认识TheEndAimforperfection,butexpectittotakealongtimetobecomeverygood
本文标题:Java语言基础――面向对象编程(II)
链接地址:https://www.777doc.com/doc-6068098 .html