面向对象编程(成员变量、成员方法、构造方法、重载方法)本章学习指引:成员变量(成员方法)构造方法方法重载Java中的成员变量实例变量(对象变量)类变量(静态变量)一、成员变量成员变量存放位置:在类的内部并位于方法体之外作用域:整个类classVariableOfFamily{inti;booleanflag;intaa(){floatj;return5;}}如何区分成员变量的两种形式-通过static关键字来区分[static]类型变量名classA{inti;staticfloatj;}注意:成员方法类似于成员变量的两种形式区分[static]返回值类型方法名([参数表]){语句体}返回值类型:有参返回(int、float、double等等)无参返回(void)实例变量与类变量的访问举例classVerifyConstant{inti;staticfloatj;publicstaticvoidmain(String[]args){//System.out.print(i);VerifyConstantvc=newVerifyConstant();System.out.println(vc.i+\n+vc.j);System.out.println(j=+j);System.out.println(j=+VerifyConstant.j);}}结论实例变量是属于对象的,在类方法中,必须通过对象访问。类变量是属于类的。在同一个类中可以直接访问,在其他类中,可以通过对象访问或通过类名访问。注意:成员方法的访问类似于成员变量在实例方法中可以直接访问实例变量classVerifyConstant{inti;staticfloatj;voidaa(){i=i+1;j=j+1;}staticvoidbb(){VerifyConstantvc=newVerifyConstant();vc.aa();vc.i=vc.i+1;j=j+1;System.out.print(vc.i);}publicstaticvoidmain(String[]args){bb();}}例:读出下列程序的运行结果classCompany{staticStringname,city;}publicclassOurCompany{publicstaticvoidmain(String[]args){Companyc1=newCompany();c1.name=交通公司;c1.city=上海;Companyc2=newCompany();c2.name=电力公司;c2.city=北京;System.out.println(c1.name+:+c1.city);}}注意:类变量是属于类的,属于类中所有对象,类变量被保存在该类内存区的公共存储单元中。类变量不会因为对象的存在而存在。实例变量是属于对象的,与具体对象相关联,只有对象被创建了,该对象访问的变量才会存在于存储单元中。类变量的值会随着最后一个对象的改变而改变,而对象变量的值的改变只与具体的对象有关问题:指出下列类中成员变量和成员方法的具体形式classJudge{inti;staticfloatj;finalstaticdoublek=26.7789;voidaa(){System.out.print(“Welcome!”);}staticintbb(intp){return6;}publicstaticvoidmain(String[]args){}}课堂练习编写一个JavaApplication程序,该程序能计算出清华大学出版社某本书自从发行以来的销售总额。要求输出的结果如下:出版社:清华大学出版社书名:Java程序设计单价:23.5元发行日期:2005年7月已售数量:3000本销售总额:元出版社:清华大学出版社书名:.NET程序设计单价:21.6元发行日期:2007年12月已售数量:3500本销售总额:元classBook{staticStringbookconcern=清华大学出版社;Stringbookname,publishtime;floatbookprice;longbooknumber;doublesaleAmount(){returnbooknumber*bookprice;}}classMyBook{publicstaticvoidmain(String[]args){Bookbook1=newBook();book1.bookname=Java程序设计;book1.publishtime=2005年7月;book1.bookprice=23.5f;book1.booknumber=3000L;System.out.println(出版社:+Book.bookconcern+\n书名:+book1.bookname+\n单价:+book1.bookprice+元\n发行日期:+book1.publishtime+\n已售数量:+book1.booknumber+本\n销售总额:+book1.saleAmount());}}//请试着从命令行输入bookprice、bookname等的值二、构造方法1.概念及特点又称构造函数、构造器构造函数是类的一种特殊方法,它的特殊性主要体现在如下的几个方面:(1)构造函数的方法名与类名相同。(2)构造函数没有返回类型。(3)构造函数的主要作用是完成对类的对象的初始化工作。(4)构造函数不能由编程人员显式地直接调用。(5)在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。例:为Book类创建构造函数(要求通过构造函数完成书名和书价的初始化)classBook{staticStringbookconcern=清华大学出版社;Stringbookname,publishtime;floatbookprice;longbooknumber;doublesaleAmount(){returnbooknumber*bookprice;}}Book(Stringbn,floatbp){bookname=bn;bookprice=bp;}如何调用构造函数?classMyBook{publicstaticvoidmain(String[]args){Bookbook1=newBook(Java程序设计,23.5f);book1.publishtime=2005年7月;book1.booknumber=3000L;System.out.println(出版社:+Book.bookconcern+\n书名:+book1.bookname+\n单价:+book1.bookprice+元\n发行日期:+book1.publishtime+\n已售数量:+book1.booknumber+本\n销售总额:+book1.saleAmount());}}这条语句自动调用Book类中带两个参数的构造函数2.构造函方法的特点(1)构造函数和类具有相同的名字。(2)一个类可以有多个构造函数。(3)构造函数可以有0个、1个或多个参数。(4)构造函数没有返回值。(5)构造函数总是和new运算符一起被调用。3.构造方法的作用(1)对象初始化(2)引入更多的灵活度(变量赋值或更复杂的操作)(3)Java中可以不定义构造函数-Java中可以不定义构造函数,此时系统会自动为该系统生成一个默认的构造函数。这个构造函数的名字与类名相同,它没有任何形式参数,也不完成任何操作。课堂练习一:请为Square类创建一个构造函数,该函数能够在对象创建时,自动完成边长的初始化工作。并设计一个JavaApplication程序,能输出边长为5.5的正方形的周长。classSquare{doublelength;doublearea(){returnlength*length;}doublecircum(){return4*length;}}程序如下:classSquare{doublelength;Square(doublelen){length=len;}doublearea(){returnlength*length;}doublecircum(){return4*length;}}或:Square(doublelength){this.length=length;}classComputeArea{publicstaticvoidmain(String[]args){Squares=newSquare(5.5);System.out.print(“周长为”+s.circum());}}课堂练习二:完成第二次实验报告三、方法重载1、概念类对自身已有的同名方法的重新定义,一般同名方法通过形参来区分重载方法必须满足以下条件:-方法名相同-方法的参数类型、个数、顺序至少有一项不同-方法的返回类型可以不相同-方法的修饰符可以不相同例:以下sum方法为重载的方法classCalculate{intsum(inti,intj){returni+j;}floatsum(floati,floatj,floatk){returni+j+k;}doublesum(doublei,doublej,doublek,doublet){returni+j+k+t;}}2、构造函数的重载重载条件(1)满足构造函数的定义(2)方法名相同(3)方法的参数类型、个数、顺序至少有一项不同例:以下Calculate方法为重载的构造方法classCalculate{Calculate(inti,intj){…}Calculate(floati,floatj,floatk){…}Calculate(doublei,doublej,doublek,doublet){…}}