Java面向对象编程.pptx
会计学1Java面向对象编程面向对象编程第一页,共36页。n n对象由属性(数据对象由属性(数据(shj)(shj))和方法(函数)组)和方法(函数)组成;成;n n类是具有相同属性和方法的对象的集合;类是具有相同属性和方法的对象的集合;n n对象是引用数据对象是引用数据(shj)(shj)类型,使用类型,使用newnew运算符创运算符创建对象实例,使用成员运算符访问对象中的成员;建对象实例,使用成员运算符访问对象中的成员;n n访问修饰符用来控制访问权限,可以有效地保证访问修饰符用来控制访问权限,可以有效地保证数据数据(shj)(shj)安全;安全;n n构造方法一般用来初始化对象中的数据构造方法一般用来初始化对象中的数据(shj)(shj)成员。成员。回顾回顾(hug)第1页/共36页第二页,共36页。本章本章本章本章(bn zhn(bn zhn)相关词汇(蓝色为关键字)相关词汇(蓝色为关键字)相关词汇(蓝色为关键字)相关词汇(蓝色为关键字)单单 词词说说 明明this这,这个这,这个static静态的静态的package包裹,包包裹,包import引入,导入引入,导入overloaded重载,超载重载,超载overloaded method方法重载方法重载第2页/共36页第三页,共36页。本章本章(bn zhn)目标目标n n方法重载n n重载构造方法n n对象在内存中的存放(cnfng)形式n nthis关键字n n静态成员,static关键字n n打包,package关键字n n导入包,import关键字第3页/共36页第四页,共36页。回顾回顾(hug)函数函数n n在在JavaJava中,函数无需中,函数无需C C语言中的前向声明,只要直接定义语言中的前向声明,只要直接定义(dngy)(dngy)即可;即可;n nJavaJava中,函数被称为方法;中,函数被称为方法;n n定义定义(dngy)(dngy)一个方法的一般形式:一个方法的一般形式:n n 访问权限访问权限 返回值类型返回值类型 方法名称方法名称(形参列表形参列表)n n方法主体方法主体;n n n n我们更关注的是方法原型,对于方法原型的三个主要组成部分应当明确区分:我们更关注的是方法原型,对于方法原型的三个主要组成部分应当明确区分:n n返回值类型返回值类型n n方法名称方法名称n n形式参数形式参数方法(fngf)原型第4页/共36页第五页,共36页。在在Java中定义方法中定义方法/*Java中的方法示例(shl)代码片段*/*定义求平方值的方法*/public int square(int x)return(x*x);返回值类型(lixng)方法(fngf)名称形式参数第5页/共36页第六页,共36页。案例案例(n l)/*编写求绝对值的方法来求整数的绝对值*/*AbsoluteValue 类,其中包含求绝对值的方法Java中的任何方法都必须在类中定义(dngy)*/public class AbsoluteValue /*求绝对值的方法*/public int abs(int x)return(x=0)?x:-x);/*main方法,程序入口*/public static void main(String args)/必须先实例化类的对象,才可以调用到其中的成员方法 AbsoluteValue obj=new AbsoluteValue();int a=-8,b;b=obj.abs(a);/调用abs方法求a的绝对值 System.out.println(a+的绝对值是 +b);方法(fngf)的定义方法的调用第6页/共36页第七页,共36页。案例案例(n l)分析分析n n在上面的案例在上面的案例(n l)(n l)中,我们已经定义了求整数中,我们已经定义了求整数绝对值的方法;绝对值的方法;n n但有时候,我们可能还需要求浮点数的绝对值,但有时候,我们可能还需要求浮点数的绝对值,请问:可以继续使用这个方法吗?请问:可以继续使用这个方法吗?n n事实上是行不通的,这个方法只能求出整数的绝事实上是行不通的,这个方法只能求出整数的绝对值,对于浮点数,还需另外再定义求浮点数绝对值,对于浮点数,还需另外再定义求浮点数绝对值的方法。对值的方法。第7页/共36页第八页,共36页。修改修改(xigi)案例案例public class AbsoluteValue /*求整数(zhngsh)绝对值的方法*/public int absOfInt(int x)return(x=0)?x:-x);/*求浮点数绝对值的方法*/public float absOfFloat(float x)return(x=0)?x:-x);public static void main(String args)AbsoluteValue obj=new AbsoluteValue();int a=-8,b;b=obj.absOfInt(a);System.out.println(a+的绝对值是+b);float c=-3.14f,d;d=obj.absOfFloat(c);System.out.println(c+的绝对值是+d);如果还要求其它类型的绝对值,就需要定义更多的方法(fngf),这对于调用者来说,将会是非常麻烦的事情。第8页/共36页第九页,共36页。方法方法(fngf)重载重载n n用于定义一组方法,这些方法具有相同的名称,并执行类似的操作,用于定义一组方法,这些方法具有相同的名称,并执行类似的操作,但是却使用不同的参数列表;但是却使用不同的参数列表;n n编译器会根据调用时传递的实际编译器会根据调用时传递的实际(shj)(shj)参数自动判断具体调用的是参数自动判断具体调用的是哪个重载方法,如:哪个重载方法,如:/*abs方法(fngf)的重载*/int abs(int x)float abs(float x)double abs(double x)long abs(long x)第9页/共36页第十页,共36页。方法重载的三大方法重载的三大(sn d)原则原则n n方法名相同方法名相同n n参数不同(可以有三方面的不同)参数不同(可以有三方面的不同)n n数量数量(shling)(shling)不同不同n n类型不同类型不同n n顺序不同顺序不同n n同一个作用域同一个作用域n n温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,只有返回值不同的方法不能构温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,只有返回值不同的方法不能构成重载。成重载。/*错误的方法(fngf)重载*/void fun(int x);int fun(int x);第10页/共36页第十一页,共36页。方法方法(fngf)重载示例重载示例public class AbsoluteValue public int abs(int x)/重载方式(fngsh)1,求整数的绝对值 return(x=0)?x:-x);public float abs(float x)/重载方式(fngsh)2,求浮点数的绝对值 return(x=0)?x:-x);public double abs(double x)/重载方式(fngsh)3,求双精度数的绝对值 return(x=0)?x:-x);public long abs(long x)/重载方式(fngsh)4,求长整型数的绝对值 return(x=0)?x:-x);public static void main(String args)AbsoluteValue obj=new AbsoluteValue();int a=-8,b;b=obj.abs(a);System.out.println(a+的绝对值是+b);float c=-3.14f,d;d=obj.abs(c);System.out.println(c+的绝对值是+d);第11页/共36页第十二页,共36页。方法重载方法重载(zhn zi)的两种方式之一的两种方式之一n n利用不同数据类型的参数重载;利用不同数据类型的参数重载;n n对于带有相同数量参数但参数类型不同的重载方法,编译器可以区对于带有相同数量参数但参数类型不同的重载方法,编译器可以区分它们,如:分它们,如:n n只要所有参数式样都是唯一的,就可以使用多个重载;只要所有参数式样都是唯一的,就可以使用多个重载;n n很多编程语言已经重载了输出方法,以便您可以用相同的函数很多编程语言已经重载了输出方法,以便您可以用相同的函数(hnsh)(hnsh)名称输出任何类型的数据。名称输出任何类型的数据。int square(int x)float square(float x)double square(double x)第12页/共36页第十三页,共36页。方法重载方法重载(zhn zi)的两种方式的两种方式之二之二n n利用不同数量的参数重载,如:利用不同数量的参数重载,如:n n将调用与参数最匹配的方法,如果没有方法得出最佳匹配,那么编译器将报将调用与参数最匹配的方法,如果没有方法得出最佳匹配,那么编译器将报错;错;n n编译器解决编译器解决(jiju)(jiju)重载的方式与方法定义的顺序无关;重载的方式与方法定义的顺序无关;n n重载不考虑方法的返回值类型。重载不考虑方法的返回值类型。/*函数(hnsh)定义*/int fun(int n1)int fun(int n1,int n2,int n3)/*函数(hnsh)调用*/fun(a);fun(x,y,z);第13页/共36页第十四页,共36页。方法方法方法方法(fngf(fngf)重载的作用域规则重载的作用域规则重载的作用域规则重载的作用域规则n n只有属于同一个类的方法才能(cinng)构成重载。class First public void show()class Second public void show(int x)不构成(guchng)重载第14页/共36页第十五页,共36页。课堂练习课堂练习1在在JavaJava中,对于成员中,对于成员(chngyun)(chngyun)方法方法float add(float f1,float f2)float add(float f1,float f2)下面选项()是对该成员下面选项()是对该成员(chngyun)(chngyun)方法的重载。方法的重载。int add(int n1,int n2)int add(int n1,int n2)float add(float f)float add(float f)float add(float f2,float f1)float add(float f2,float f1)void add(float f1,float f2)void add(float f1,float f2)void add(float f1,float f2,float x)void add(float f1,float f2,float x)第15页/共36页第十六页,共36页。课堂练习课堂练习2在Java中,下列(xili)方法()不能与int fun(int x)构成方法重载。int fun(int x,int y)float fun(int x)int fun(float x)int fun(int x,int y,int z)第16页/共36页第十七页,共36页。关于方法重载的重要关于方法重载的重要(zhngyo)提示提示请勿(qn w)将功能完全不一样的方法进行重载!第17页/共36页第十八页,共36页。重载重载(zhn zi)构造方法构造方法n n方法重载的一个重要应用就是重载构造方法;n n可以定义一组构造方法,使其构成重载关系,从而方便使用者能够灵活机动地以各种不同(b tn)的方式来实例化对象。第18页/共36页第十九页,共36页。重载重载重载重载(zhn(zhn z z i)i)构造方法示例构造方法示例构造方法示例构造方法示例class MyTime /定义时间类定义时间类 private int mHour,mMinute,mSecond;/三个成员变量,时、分、秒三个成员变量,时、分、秒 public MyTime()/构造方法重载构造方法重载1 mHour=0;mMinute=0;mSecond=0;public MyTime(int hour)/构造方法重载构造方法重载2 mHour=hour;mMinute=0;mSecond=0;public MyTime(int hour,int minute)/构造方法重载构造方法重载3 mHour=hour;mMinute=minute;mSecond=0;public MyTime(int hour,int minute,int second)/构造方法重载构造方法重载4 mHour=hour;mMinute=minute;mSecond=second;public void display()/显示时间信息显示时间信息(xnx)的方法的方法 System.out.println(mHour+:+mMinute+:+mSecond);第19页/共36页第二十页,共36页。重载重载(zhn zi)构造方法示例构造方法示例(续)(续)/*测试时间类*/public class Test /*main方法,程序入口*/public static void main(String args)/分别调用不同(b tn)的构造方法来初始化时间对象 MyTime t1=new MyTime();/调用重载方式 1 t1.display();MyTime t2=new MyTime(8);/调用重载方式 2 t2.display();MyTime t3=new MyTime(8,30);/调用重载方式 3 t3.display();MyTime t4=new MyTime(8,30,30);/调用重载方式 4 t4.display();/*使用重载构造方法可以使初始化对象的方式灵活机动,大大方便类的使用者。*/第20页/共36页第二十一页,共36页。对象在内存对象在内存(ni cn)中的存放形式中的存放形式成员方法 1成员方法 2成员方法 n成员变量 1成员变量 2成员变量 n成员变量 1成员变量 2成员变量 n成员变量 1成员变量 2成员变量 n对象1对象3对象2每个对象都有自己独立的数据(shj)成员,但是所有的对象共享成员方法。第21页/共36页第二十二页,共36页。this关键字关键字n n假如类成员属性与类方法中定义的一个局部变量同名,类成员属性将被局部变量所覆盖(fgi),那么如果要使用类成员属性怎么办?n n每个成员方法都有一个隐含的this引用,它总是指向调用它的对象;n n关键字this给出当前对象的地址;n n可以像使用任何引用那样使用thisn n每当调用this时,编译器会向this分配当前对象的地址;第22页/共36页第二十三页,共36页。this引用引用(ynyng)示例示例/*this示例,代码(di m)片段*/public class Student /定义学生类 private String mName;/姓名 private int mAge;/年龄 public Student(String name,int age)/隐式调用,等同于this.mName=name;mName=name;/显式调用,等同于mAge=age;this.mAge=age;第23页/共36页第二十四页,共36页。回顾回顾(hug)C语言中的静态变量语言中的静态变量n nC C语言中的静态变量的特点:语言中的静态变量的特点:n n具有全局变量的生命周期(完成了某些具有全局变量的生命周期(完成了某些(m(m u xi)u xi)全局变全局变量才能完成的功能);量才能完成的功能);n n具有有局部变量的作用域(比全局变量更安全)。具有有局部变量的作用域(比全局变量更安全)。n n在在C C语言中声明静态变量的语法:语言中声明静态变量的语法:n nstatic int x;static int x;n n声明静态变量使用关键字声明静态变量使用关键字staticstatic。第24页/共36页第二十五页,共36页。静态成员静态成员(chngyun)变量变量n n在成员变量前加static关键字,可以将其声明为静态成员变量;n n如果类中成员变量被定义为静态,那么不论有多少个对象,静态成员变量只有一份内存拷贝,即所有对象共享该成员变量;n n静态成员变量的作用域只在类内部,但其生命周期却贯穿整个(zhngg)程序。第25页/共36页第二十六页,共36页。静态成员变量静态成员变量(binling)示例示例class Dog public static int count=0;/静态成员(chngyun)变量 public Dog()/构造方法 count+;public class Test public static void main(String args)System.out.println(当前狗的数量是:+Dog.count);Dog d1=new Dog();Dog d2=new Dog();System.out.println(当前狗的数量是:+Dog.count);第26页/共36页第二十七页,共36页。静态成员静态成员(chngyun)变量的注变量的注意事项意事项n n和程序同生命周期;n n在没有实例化对象时,可以通过类名访问静态成员变量;n n也可以通过对象访问静态成员变量,但不论使用的是哪个对象,访问到的都是同一个变量;n n静态成员变量在声明时最好初始化,如果(rgu)不进行初始化,系统会默认初始化为0。第27页/共36页第二十八页,共36页。静态成员静态成员(chngyun)方法方法n n在成员方法前加在成员方法前加staticstatic关键字,可以将其声明为静态成关键字,可以将其声明为静态成员方法;员方法;n n静态成员方法只能对类的静态成员变量静态成员方法只能对类的静态成员变量(binling)(binling)进进行操作;行操作;n n静态成员方法没有静态成员方法没有thisthis引用;引用;n n在没有实例化对象时,可以通过类名访问静态成员方在没有实例化对象时,可以通过类名访问静态成员方法。法。第28页/共36页第二十九页,共36页。静态成员方法静态成员方法(fngf)示例示例class Dog private static int count=0;/静态成员变量静态成员变量 public Dog()count+;/显示数量的方法,静态成员方法显示数量的方法,静态成员方法 public static void displayCount()System.out.println(当前当前(dngqin)狗的数量是:狗的数量是:+count);public class Test public static void main(String args)/没有实例化对象之前,直接通过类名调用静态成员方法没有实例化对象之前,直接通过类名调用静态成员方法 Dog.displayCount();Dog d1=new Dog();Dog d2=new Dog();Dog.displayCount();第29页/共36页第三十页,共36页。静态成员静态成员(chngyun)小结小结n n静态成员包括静态数据成员和静态成员方法;静态成员包括静态数据成员和静态成员方法;n n静态成员属于整个类而不是属于某个对象静态成员属于整个类而不是属于某个对象(duxing)(duxing),它被该类的所有,它被该类的所有对象对象(duxing)(duxing)共享;共享;n n访问静态成员时一般通过类名访问,也可以通过对象访问静态成员时一般通过类名访问,也可以通过对象(duxing)(duxing)访问;访问;n n静态成员也受访问权限的约束;静态成员也受访问权限的约束;n n静态数据成员在使用之前应尽量初始化;静态数据成员在使用之前应尽量初始化;n n静态成员方法不能操作非静态成员;静态成员方法不能操作非静态成员;n n静态成员方法没有静态成员方法没有thisthis引用。引用。第30页/共36页第三十一页,共36页。包包n n有时候,类和类的名称可能(knng)发生冲突;n nJava提供了把类名空间划分为更容易管理的块的机制,这就是包;n n包允许将类组合成较小的单元,类似于文件夹;n n有助于避免命名冲突,分属不同包的类即便名称相同也不会引起误会;n n能在包与包之间对于类的访问权限提供更有力的约束。第31页/共36页第三十二页,共36页。使用使用(shyng)package关键字打关键字打包包n n可以使用可以使用packagepackage关键字将源文件中的类打入某个包中,语法关键字将源文件中的类打入某个包中,语法(y(y f f)是:是:n npackage package 包名包名;n n该语句必须是整个源文件的第一条语句;该语句必须是整个源文件的第一条语句;n n包中还可以包含下一级子包,这与文件目录体系非常相似。包中还可以包含下一级子包,这与文件目录体系非常相似。/将本源文件中的所有类打到mypkg包中package mypkg;class Student /定义(dngy)学生类 第32页/共36页第三十三页,共36页。缺省包缺省包n n如果省略了package语句,类将保存在一个缺省的没有名称的包中;n n尽管缺省包很方便,但对于(duy)大型的程序,它是不恰当的;n n请尽量为自己编写的类定义具体的包。第33页/共36页第三十四页,共36页。使用使用(shyng)import关键字导关键字导入包入包n n如要使用如要使用(sh(sh yng)yng)到某个包中的类,就需要使用到某个包中的类,就需要使用(sh(sh yng)importyng)import关键字将包或类显式地包括到程关键字将包或类显式地包括到程序中,有如下两种情况:序中,有如下两种情况:n n一个程序中允许有多条一个程序中允许有多条importimport语句,导入多个包或语句,导入多个包或多个类。多个类。/*导入java包下的io子包中的所有(suyu)类*/import java.io.*;/*导入mypkg包下的Student类,但并不导入该包中的其它类*/import mypkg.Student;第34页/共36页第三十五页,共36页。总结总结(zngji)n n方法重载可以方便方法的调用者,但方法重载应遵循三大原则:方法重载可以方便方法的调用者,但方法重载应遵循三大原则:n n方法名相同方法名相同n n参数列表参数列表(li bi(li bi o)o)不同不同n n属于同一作用域属于同一作用域n n可以适当地重载构造方法,使初始化对象的方式更加灵活;可以适当地重载构造方法,使初始化对象的方式更加灵活;n nthisthis引用总是指向调用方法的对象本身;引用总是指向调用方法的对象本身;n n静态成员属于类而不是属于某个对象;静态成员属于类而不是属于某个对象;n n总是将自己定义的类打入到具体的包中是良好的编程习惯;总是将自己定义的类打入到具体的包中是良好的编程习惯;n n可以使用可以使用importimport语句导入需要的包或类。语句导入需要的包或类。第35页/共36页第三十六页,共36页。