面向对象的特性面向对象的基本特性1.封装性(女人的年龄封装起来)封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:◇把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。◇信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的交叉感染,使软件错误能够局部化,大大减少查错和排错的难度。面向对象的基本特性2.继承性特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如,轮船、客轮;人、大人。一个类可以是多个一般类的特殊类,它从多个一般类中继承了属性与服务,这称为多继承。例如,客轮是轮船和客运工具的特殊类。在java语言中,通常我们称一般类为父类(superclass,超类),特殊类为子类(subclass)。(后面会详细阐述)面向对象的基本特性3.多态性对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:“几何图形”的“绘图”方法,“椭圆”和“多边形”都是“几何图”的子类,其“绘图”方法功能不同。(后面会详细阐述)继承子类继承父类的:大部分成员变量大部分成员方法继承publicclassParent{publicStringname=安;publicvoideat(){System.out.println(嘿嘿,吃得真香!);}}publicclassChildextendsParent{publicstaticvoidmain(String[]args){Childchild=newChild();System.out.println(儿子也姓:+child.name);child.eat();}}继承可以看出,父类的name属性和eat方法子类都继承了,因为子类没有申明这两样东西,但却可以调用。继承的好处让开发者可以轻松定义和基本的类模板避免重复编码增强系统的可维护性this功能:访问当前类的成员变量或成员方法,或构造器thispublicclassTest{Stringname;publicTest(Stringname){this.name=name;}publicTest(){This(“Eric”);}publicStringgetName(){returnthis.name;}publicvoidsetName(Stringname){this.name=name;}}super功能:访问父类的成员变量或方法,或构造器superpublicclassParent{publicStringname=老安;publicParent(Stringname){this.name=name;}}publicclassChildextendsParent{publicChild(Stringname){super(name);}publicStringgetParentName(){returnsuper.name;}publicstaticvoidmain(String[]args){Childchild=newChild();StringparentName=child.getParentName();System.out.println(parentName);}}练习1编写一个“老干妈”(MotherInLaw)类,它的结构如下:一个int类型的属性laLevel保存辣的级别一个介绍自己的方法introduce,方法的实现专门返回自己辣的级别再写一个“干儿子”类(SonInLaw)继承于老干妈,它的结构如下:一个介绍自己的方法introduction,方法的实现专门返回自己辣的级别,干儿子辣的级别计算方式如下,是老干妈的3倍。再写一个main方法分别调用上面两个类的介绍自己的方法,并打印返回值检查实现效果练习1答案publicclassParent{publicStringname=安;publicvoideat(){System.out.println(吃得香);}}练习1答案publicclassMotherInLaw{intlaLevel=2;publicintintroduce(){returnthis.laLevel;}publicstaticvoidmain(String[]args){MotherInLawmotherInLaw=newMotherInLaw();intmotherLevel=motherInLaw.introduce();System.out.println(motherLevel);SonInLawsonInLaw=newSonInLaw();intsonLevel=sonInLaw.introduction();System.out.println(sonLevel);}}练习1答案publicclassSonInLawextendsMotherInLaw{publicintintroduction(){//得到老干妈的辣的级别intmotherLevel=super.introduce();returnmotherLevel*3;}}练习2编写一个“基本用户”(User)类,它的结构如下:一个int类型的属性ensure保存用户信用度一个充值的方法pay,方法的有一个参数为用户充值交的钱的数量,方法的实现为用户每交1元钱,用户的信用度就增加2再写一个“VIP用户”类(VipUser)继承于User,它的结构如下:一个充值的方法vipPay,方法的有一个参数为用户充值交的钱的数量,vip用户交同样费用,获得的信用度是普通用户的2倍再写一个main方法分别调用上面两个类的充值方法,并打分别印调用后各自的信用度来检查实现效果重载(做包子既有区别也有联系)何谓重载?在一个类中,有两个同名的方法重载publicclassEric{publicvoidgoHome(intI,intj){System.out.println(下班喽,回家罗!);}publicvoidgoHome(StringcarNumber,intj){System.out.println(下班喽,坐+carNumber+路车回家罗!);}}重载重载必须满足的条件方法名称完全相同方法的参数列表不同要么参数的数量不同要么相同位置的参数类型不同要么都不相同注意:重载与方法的返回值无关练习写一个User类,他的结构如下:一个sayHello方法,方法有一个参数,传入要呼唤的名字,方法的实现直接在控制台上打印“XXX,Hello”一个sayHello方法,方法没有参数,方法的实现直接在控制台上打印“Hello”写main方法,分别调用上面的两个sayHello方法,看打印效果重写重写又称为覆盖指在父类和子类之间,原本子类继承了父类的某个方法,但是子类却又在自己的肚子里重新申明了这个方法重写publicclassParent{publicStringname=安;publicvoideat(){System.out.println(嘿嘿,吃得真香!);}}publicclassChildextendsParent{publicvoideat(){System.out.println(嘿嘿,儿子也觉得香!);}publicstaticvoidmain(String[]args){Childchild=newChild();System.out.println(儿子也姓:+child.name);child.eat();}}原本Child已经自动继承了Parent的eat方法但是Child却自己声明了一个与继承下来的方法完全相同的方法跑一下程序,结果如何?事实上,由于Child重写了eat方法,所以,调用Child的eat方法时,以Child什么的eat方法内容为准,仿佛覆盖掉了从父类继承下来的eat方法,所以称之为重写或覆盖。练习为某监狱编写一个牢房管理系统,其中有一个“劳改犯”类Prisoner,他的结构如下:一个祈祷方法pray,其中打印“神啊,早点放出老子去啊……”再编写一个“抢劫犯”类Robber继承于Prisoner,他的pray方法打印“悔啊,早知道不抢油条吃了……”再编写一个main方法分别调用两个类的pray方法多态何谓多态?假如“土匪”是一个类,他有一个“打劫”方法,那么这个“土匪类”的所有子类都继承得有打劫方法,不论是“小日本土匪”还是“韩国土匪”,都有打劫方法但是他们打劫的方式不同“小日本土匪”用“手雷”“韩国土匪”用“AK”也就是说,同是土匪,就都有打劫方法,但是打劫时的状态却又各不相同,即同是土匪,打劫时却有多种状态,称为“多态”。多态代码上如何多态?将一个父类类型的变量指向一个子类类型的实例如:Parentparent=newChild();多态结果:能调用哪些方法以父类为准调用时执行什么代码以子类为准练习1为某操作系统编写一个驱动类Driver,结构如下:一个驱动安装方法install,方法的实现打印“装驱动啊……”编写一个联想驱动类LenovoDriver继承于Driver,其install方法打印“装联想驱动”编写一个戴尔驱动类DellDriver继承于Driver,其install方法打印“装戴尔驱动”编写一个main方法,分别用多态的方式,调用两个类的install方法,查看效果练习2多态的应用:设计模式之“工厂模式”编写两个“产品类”用多态方式编写“工厂类”测试抽象何谓抽象?(富翁与女儿,只是告诉方法,具体如何实现靠女儿去实现)一个方法,分为申明和实现如果一个方法只有申明,没有实现,那么,就没有人知道它执行的效果,看不清它的效果,则认为它太“抽象”了,这时,这个方法就称之为“抽象方法”而拥有抽象方法的类,称之为“抽象类”抽象publicabstractclassAbstractParent{publicvoideat(){System.out.println(嘿嘿,走地鸡......);}publicabstractvoidsleep();}抽象特点:抽象类中可以有非抽象方法抽象类中可以没有抽象方法抽象类不能被实例化抽象类的子类:如果实现了父类中的所有抽象方法,那么它可以是一个非抽象类如果没有完全实现父类中的所有抽象方法,那么它可以必须是一个抽象类抽象抽象的好处:由设计者定制类的结构由开发者完成类的实现分工合作,互不影响接口何谓接口:可以看成一个只拥有方法申明,没有方法实现的类与抽象类相似但是接口里的所有方法都不可以有实现而接口拥有“实现类”来实现其中的各个方法接口publicinterfaceParentInterface{publicvoideat();publicvoidsleep();}publicclassChildImplementsimplementsParentInterface{publicvoideat(){System.out.println(餐餐果子狸,顿顿穿山甲......);}publicvoidsleep(){System.out.println(失眠,多梦,快喝公公口服液!);}}接口接口的特性:一个类可以同时实现多个接口一个接口也可以同时拥有多个实现类一