由西安互仁信息技术有限公司™提供章理解封装的概念掌握private关键字掌握构造方法掌握方法重载本章目标面向对象的程序设计方法力求符合人脑的思维方式,通过符合人类思维的更抽象的客观世界模型,降低、分解问题的难度和复杂性,并以此来解决问题。面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现过程;面向对象是指,我们考虑问题时,把任何东西看做是对象,以对象为单位,考虑它的属性及方法。面向对象基础面向对象的基本原理面向对象方法学是面向对象程序设计技术的理论基础。该理论的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与人类的认知过程同步,通过对人类认识客观世界及事物发展过程的抽象,建立规范的分析设计方法,由此使程序具有良好的封装性、可读性、可维护性、可重用性等一系列优点。面向对象的基本概念1.对象对象就是现实世界中实体在计算机逻辑中的映射和体现。实体都具有一定的属性和行为。从面向对象的观点来看,所有的面向对象的程序都是由对象构成的。2.类类就是具有相同或相似属性和行为的对象的抽象。在面向对象的程序设计中,类与对象是抽象与具体的关系。3.属性对象的属性主要用来描述对象的状态。属性用变量来定义。4.行为对象的行为又称为对象的操作,主要描述对象内部的各种动态信息。行为用方法来刻画。面向对象编程的特点1抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。面向对象编程的特点2封装,就是将事物的内部实现细节隐藏起来,对外提供一致的公共的接口间接访问隐藏数据。public、private、protected、包可见性或友好的可见性是java里实现封装的一种手段优点:使得Java程序具有良好的可维护性使得代码的重用性大为提高面向对象编程的特点3继承是一种由已有类创建新类的机制,是面向对象程序设计的基石之一。继承是存在于面向对象程序的两个或多个类之间的一种关系。当一个类拥有另一个类的数据和操作时,就称这两个类具有继承关系。被继承的类称为父类或超类,继承父类的类称为子类。继承有单重继承和多重继承之分。(Java里不支持多重继承,只支持单一继承,或称为基于对象的继承,因为默认是从java.lang.Object继承)优点:使得面向对象的程序结构清晰,易于理解。面向对象编程的特点4多态多态指多种表现形式,就是对象响应外部激励而使其形式发生改变的现象。多态有两种情况:一种是通过类之间继承导致的同名方法覆盖体现的,另一种是通过同一个类中同名方法的重载体现的。优点:提高了程序的抽象程度和简洁性。什么是封装所谓封装,就好比用一个盒子把一些东西装起来。在Java中就好比在一个类里定义了一些成员变量和方法,通过限制其成员变量和方法的可见性,使得外界不能访问它们。因此封装展现了接口,隐藏了细节。1、在类的定义中设置对对象中的成员变量和方法进行访问的权限;2、提供一个统一供其他类引用的方法;3、其他对象不能直接修改本对象所拥有的属性和方法。类的封装1、公有的(public):公有成员允许Java系统中所有的类访问,即不仅允许类内部的成员访问,也允许同一个包或不同包中的类直接访问。2、被保护的(protected):类的被保护成员允许由此类派生的子类(相同包或不同包)以及同一个包中的其他类访问;但通过类的对象来访问时,只可以被相同包中的任何形式的类对象来访问,而不能被不同包中的任何形式类对象访问。3、私有的(private):仅能被本类的各个成员函数使用,不能被任何形式的类对象或子类成员使用。4、默认的:如果类成员前面没有任何关键字修饰,则称为默认的。默认的类成员除了允许被其归属的类访问外,还允许同一个包中的其他类访问。若两个类不在同一个包中,即使是这个类的子类,也不允许访问这个类的默认成员。类成员的访问权限同一个类同一个包不同包中的子类其他包public√√√√protected√√√默认的√√private√例1编写一个类,代表教员,要求:具有属性:姓名、年龄具有行为:自我介绍教员的最小年龄要求:22岁publicclassTeacher1{publicStringname;//教员姓名publicintage;//年龄/***返回自我介绍的内容*/publicStringintroduction(){return大家好!我是+name+,我今年+age+岁;}}编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍publicclassTeacher1Test{publicstaticvoidmain(String[]args){Teacher1teacher=newTeacher1();teacher.name=李芳;teacher.age=10;System.out.println(teacher.introduction());}}要满足教员的最小年龄要求,可以通过对属性的封装来实现大家好!我是李芳,我今年10岁publicclassTeacher2{privateStringname;//教员姓名//返回教员姓名publicStringgetName(){returnname;}//设定教员姓名publicvoidsetName(Stringname){this.name=name;}}封装,就是隐藏实现细节将属性私有化,提供公有方法访问私有属性通过这些公有方法访问私有属性Teacher2teacher=newTeacher2();teacher.setName(李芳);StringtName=teacher.getName();通过setter、getter方法访问name属性this代表当前类的实例如何实现封装1封装的实现:1、修改属性的可见性来限制对属性的访问2、为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的访问3、在setter和getter方法中,加入对属性的存取限制publicclassTeacher3{privateStringname;//教员姓名privateintage;//年龄publicintgetAge(){returnage;}publicvoidsetAge(intage){if(age22){System.out.println(错误!最小年龄应为22岁!);this.age=22;//如果不符合年龄要求,则赋予默认值}else{this.age=age;}}//此处省略对name属性的setter、getter方法}123如何实现封装2publicclassTeacher3Test{publicstaticvoidmain(String[]args){Teacher3teacher=newTeacher3();teacher.setName(李芳);teacher.setAge(10);System.out.println(teacher.introduction());}}使用封装,增加了数据访问限制,增强了程序的可维护性错误!最小年龄应为22岁!大家好!我是李芳,我今年22岁测试类通过调用setter方法,为对象的各个属性赋值例2请通过代码封装,实现如下需求:编写一个类Book,代表教材:•具有属性:名称(title)、页数(pageNum),其中页数不能少于200页,否则输出错误信息,并赋予默认值200•为各属性设置赋值和取值方法•具有方法:detail,用来在控制台输出每本教材的名称和页数编写测试类BookTest进行测试:为Book对象的属性赋予初始值,并调用Book对象的detail方法,看看输出是否正确通过构造方法初始化构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值构造方法必须满足以下语法规则:1、方法名与类名相同2、没有返回类型publicclassTeacher5{privateStringname;//教员姓名//构造方法publicTeacher5(){name=无名氏;}}publicclassTeacher5Test{publicstaticvoidmain(String[]args){Teacher5teacher=newTeacher5();}}使用new关键字调用构造方法带参数的构造方法通过此方法,显式地为实例变量赋予初始值publicclassTeacher6{privateStringname;//教员姓名privateintage;//年龄privateStringeducation;//学历privateStringposition;//职位//带参数的构造方法publicTeacher6(StringpName,intpAge,StringpEducation,StringpPosition){name=pName;age=pAge;//可以增加对age等属性的存取限制条件education=pEducation;position=pPosition;}publicStringintroduction(){return大家好!我是+name+,我今年+age+岁,学历+education+,目前职位是+position;}}通过调用带参数的构造方法,简化对象初始化的代码publicclassTeacher6Test{publicstaticvoidmain(String[]args){Teacher6teacher=newTeacher6(“赵飞燕,23,“本科”,“讲师);System.out.println(teacher.introduction());}}创建对象时,一并完成了对象成员的初始化工作大家好!我是赵飞燕,我今年23岁,学历本科,目前职位是讲师例3编写一个类Book2,代表教材:具有属性:名称(title)、页数(pageNum),其中页数不能少于200页,否则输出错误信息,并赋予默认值200具有方法:Sdetail,用来在控制台输出每本教材的名称和页数具有带参数的构造方法:用来完成对象的初始化工作,并在构造方法中完成对页数的最小值限制编写测试类Book2Test进行测试:初始化一个Book2对象,并调用该Book2对象的detail方法,看看输出是否正确例4编写一个类Book3,代表教材:具有属性:名称(title)、页数(pageNum)、类型(type)具有方法:detail,用来在控制台输出每本教材的名称、页数、类型具有两个带参构造方法:第一个构造方法中,设置教材类型为“计算机”(固定),其余属性的值由参数给定;第二个构造方法中,所有属性的值都由参数给定编写测试类Book3Test进行测试:分别以两种方式完成对两个Book3对象的初始化工作,并分别调用它们的detail方法,看看输出是否正确给定如下Java代码,请指出代码中的错误,并解释原因publicclassSample{privateintx;publicSample(){x=1;}publicSample(inti){x=i;}publicintSample(inti){x=i;returnx++;}privateSample(inti,Strings){}publicSample(Strings,inti){}privateSampla(inti){x=i++;}privatevoidSampla(inti){x=i++;}}总结无参构造方法带参构造方法不是构造方法带参构造方法带参构造方法名称与类名不相同不是构造方法由西安互仁信息技术有限公司™提供谢谢大家!