《对象类方法》PPT课件.ppt
,软件学院,Chapter 3面向对象的编程技术,长沙民政职业技术学院,回顾,循环语句while、do-while、for的区别是什么?,int i=0,j=0;while(i4)System.out.println(*);i+;continue;System.out.println(*);j+;i+;,*,写出运行结果,输出,3,回顾,public class Test public static void main(String args)for(int i=0;i10;i+)System.out.println(i);System.out.println(i=10);,请举例说明类与对象的区别与联系。,超出了变量i的访问范围,请指出下列Java代码中存在的错误,并改正。,回顾,阅读下面代码,哪个有错误?说明理由填代码:逆序输出数组中的元素,double a=new double;,double a=new double51,2,3,4,5,;,double a=1,2,3,4,5;,int a=new int 1,2,3,4,5;for(_;_;_)System.out.println(ai);,int i=a.length-1,i=0,i-,万物皆对象,世界是由什么组成的?,身边的对象,布兰尼,朱丽叶,顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品,姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印账单,对象的特征属性,属性对象具有的各种特征每个对象的每个属性都拥有特定值例如:布兰尼和朱丽叶的体重不一样,60kg,布兰尼,属性,35岁,对象的特征方法,方法对象执行的操作,打单,收银,方法,刷卡,对象的属性和方法,列出尼古拉斯凯奇驾驶的这辆法拉利F360 Spider的属性和方法列出小狗对象的属性和方法,属性:品牌:法拉利 型号:F360 Spider 颜色:黄色 价格:380万元方法:发动 停止 加速,属性:颜色:白色方法:叫 跑 吃,思考,说一说教室里的对象描述他们的属性和方法,颜色:黑色品牌:BENQ投影,姓名:张三年龄:20学习,类型:白炽灯开关变亮变暗,材制:木质支撑物品,封装,对象同时具有属性和方法两项特性对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相承,不能分割,谁看见过只有“完好的零件和颜色”而不能开动的汽车?,从对象抽象出“类”,抽取出下列对象的属性和方法的共同特征,轿车,顾客,类,顾客类轿车类,类是模子,确定对象将会拥有的特征(属性)和行为(方法),类是对象的类型不同于int类型:具有方法,各种口味的球状冰淇淋,球状冰淇淋模子,思考,类和对象有什么区别呢?类是抽象的概念,仅仅是模板,比如说:“人”对象是一个你能够看得到、摸得着的具体实体,比如:“小布什”,小布什,普京,克林顿,Java 是面向对象的语言,所有Java程序都以类class为组织单元关键字class定义自定义的数据类型,public class Hello public static void main(String args)System.out.println(使用Java语言理解程序逻辑);,Java类模板,类将现实世界中的概念模拟到计算机程序中,public class 类名/定义属性部分 属性1的类型 属性1;属性2的类型 属性2;属性n的类型 属性n;/定义方法部分 方法1;方法2;方法m;,定义类,定义一个类的步骤1、定义类名2、编写类的属性3、编写类的方法,类示例2-1,长沙民政职业技术学院设有民政系、社会工作系、经济贸易系、软件学院等多个院系,用类的思想输出各个院系的信息,类示例2-2,public class School/定义学院的属性 String schoolName;/院系名称 int techNum;/老师人数 int stuNum;/学生人数/定义展示院系的方法 public String toString()return“民政学院的+schoolName+“n”+“拥有:”+techNum+“名教师”+stuNum+“名学生;,定义类的toString()方法,用于输出类相关的信息,public String toString()return 字符串;/方法体,成员变量,常见错误,public class.Book String bookName;String authorName;int pageNum;boolean isAvailable;,类命名规则:1、不能使用Java关键字2、首字母可以为字母,也可以是“_”或“$”(建议不要这样)3、不能包含空格或“.”号,代码错误,如何创建和使用对象,使用对象的步骤:使用new创建类的一个对象使用对象:使用“.”进行以下操作给类的属性赋值:对象名.属性调用类的方法:对象名.方法名(),School sc=new School();,sc.schoolName=“软件学院;/给属性赋值sc.toString();/调用类的方法,该方法中的操作将被执行,public class InitialSchool public static void main(String args)School sc=new School();System.out.println(sc);sc.schoolName=“软件学院;sc.stuNum=3000;sc.techNum=100;System.out.println(sc);,创建和使用对象示例,创建“软件学院”对象,演示示例2:创建和使用对象,说一说看到什么效果?,调用类的toString()方法是特例:这里使用center.toString()和center作用相同更简便,综合案例,编写学生类,输出学生相关信息编写教员类,输出教员相关信息,学生类参考代码,教员类参考代码,测试类参考代码,演示示例3:创建和使用类和对象,练习,编写一个音乐类,并编写测试类显示音乐信息编写一个手机类,并编写测试类显示手机信息,音乐类参考代码,手机类参考代码,测试类参考代码,测试类参考代码,面向对象(OO)的优点,便于程序模拟现实世界中的实体用“类”表示实体的特征和行为隐藏细节对象的行为和属性被封装在类中,外界通过调用类的方法来获得,不需关注内部细节如何实现可重用可以通过类的模板,创建多个类的对象,数据类型总结,intdoublechar,String使用class定义的类型StudentTeacherSchool,基本数据类型,引用数据类型,数据类型使用区别,小结,类和对象的区别是什么?数据类型有哪两类?如何使用?,public class,Student,toString,stu.name,stu.sex,stu.age,实现输出学生信息,下面代码有哪些错误?,类的方法,写出狮子对象的“跑”方法写出狮子对象的“叫”方法,电动玩具狮子属性:颜色:黄色行为:跑叫,按此按钮,狮子开始跑,类的方法示例,public class AutoLion String color=黄色;public void run()System.out.println(正在以0.1米/秒的速度向前奔跑);public String bark()String sound=吼;return sound;,AutoLion类代码实现,方法名称,方法体,返回类型,如何定义类的方法,类的方法定义类的某种行为(或功能),方法的名称,方法的主体,方法返回的数据类型,定义类的方法,public 返回值类型 方法名()/这里编写方法的主体,步骤一:定义方法名以及返回值,步骤二:编写方法体,方法的命名,如何给方法起名字?必须以字母、_或开头可以包括数字,但不能以它开头遵循的命名规范通常方法名是一个动词,如果有两个以上单词组成,第一个单词的首字母小写,其后单词首字母大写,方法的返回值,两种情况如果方法具有返回值,方法中必须使用关键字return返回该值,返回类型为该返回值的类型如果方法没有返回值,返回类型为void,public class Student String name=张三;public void getName()return name;,返回类型要匹配,return 表达式;,编译错误,常见错误2-1,public class School public static void main(String args)return“软件学院欢迎您!;,返回类型是void方法中不能有返回值,常见错误2-2,public class Student public double getInfo()double weight=95.5;double height=1.69;return weight,height;,方法至多可以返回一个值,不能返回多个值,方法调用,方法是个“黑匣子”,完成某个特定的应用程序功能,并返回结果方法调用:执行方法中包含的语句,对象名.方法名();,小明过生日,爸爸送他一个电动狮子玩具,编程测试这个狮子能否正常工作,演示示例1:演示运行效果,方法调用,public class AutoLion String color=黄色;public void run()/方法1:跑 System.out.println(正在以0.1米/秒的速度向前奔跑。);public String bark()/方法2:叫 String sound=吼;return sound;public String getColor()/方法3:获得颜色属性 return color;public String showLion()/方法4:描述狮子特性 return 这是一个+getColor()+的玩具狮子!;,public class TestLion public static void main(String args)AutoLion lion=new AutoLion();System.out.println(lion.showLion();lion.run();System.out.println(lion.bark();,在类的方法中调用该类另一个方法,在main()方法中调用类的方法,演示示例2:设置断点演示方法调用执行过程,方法调用小结,方法之间允许相互调用,不需要知道方法的具体实现,提高了效率,变量作用域3-1,public class AutoLion String color=黄色;public void run()/方法1:跑 System.out.println(正在以0.1米/秒的速度向前奔跑。);public String bark()/方法2:叫 String sound=吼;return sound;public String getColor()/方法3:获得颜色属性 return color;public String showLion()/方法4:输出类的描述信息 return 这是一个+getColor()+的玩具狮子!叫声是+sound;,可以调用吗?,演示示例3:变量作用域,变量作用域3-2,变量声明的位置决定变量作用域变量作用域确定可在程序中按变量名访问该变量的区域,for(int i=0,a=0;i 4;i+)a+;System.out.println(a);,a的作用域仅在for循环中,代码错误,变量作用域3-3,变量1类型 变量1;变量2类型 变量2;变量3类型 变量3;,public 返回类型 方法1()变量4类型 变量4;public 返回类型 方法2()变量5类型 变量5;,public class AutoLion,AutoLion类的方法别的类的方法,谁能使用这些变量?,方法1,方法2,成员变量,局部变量,局部变量,练习,编写手机类(Phone):它可以下载音乐,可以播放这些音乐,可以进行充电编写电池类(Cell):自动续电编写测试类(Test),手机类,电池类,测试类,演示示例5:演示效果,带参数的方法就在身边,public String concat(String str)public int indexOf(String value)public String substring(int index)方法实施时需要接收某个值进行处理,返回值类型,方法名,参数,为什么要用带参数的方法,工作原理,新鲜桃汁,新鲜苹果汁,新鲜梨汁,输出三种果汁,如何使用带参数的方法,定义带参数的方法调用带参数的方法,public class Zhazhi/定义带参数的zhazhi方法 public String zhazhi(String fruit)String juice=fruit+汁;return juice;,/*调用zhazhi方法*/Zhazhi myZhazhi=new Zhazhi();String myFruit=苹果;String myJuice=myZhazhi.zhazhi(myFruit);System.out.println(myJuice);,参数列表:(数据类型 参数1,数据类型 参数2),调用方法,传递的参数要与参数列表一一对应,完整代码演示,完整代码演示,演示示例6:演示运行效果,带参数的方法应用2-1,输入学期代码,输出该学期的课程信息,if(courseCode.equalsIgnoreCase(s1)System.out.println(第一学期的课程是:);for(int i=0;i s1Course.length;i+)System.out.println(s1Coursei);else if(courseCode.equalsIgnoreCase(s2)System.out.println(第二学期的课程是:);for(int i=0;i s2Course.length;i+)System.out.println(s2Coursei);else if(courseCode.equalsIgnoreCase(y2)System.out.println(第三学期的课程是:);for(int i=0;i y2Course.length;i+)System.out.println(y2Coursei);,重复代码:实现相同的功能“根据不同的课程代号输出相应课程信息”,使用方法可以增加代码重用,完整代码演示,带参数的方法应用2-2,更高效的代码,public class School public void courseInfo(int courseCode,String course)System.out.println(courseCode+的课程是:);for(int i=0;i course.length;i+)System.out.println(coursei);,定义School类的带参方法:输出课程信息,Shool school=new School();school.courseInfo(courseCode,s1);,调用courseInfo方法,并传入相应的课程代号和课程信息数组,完整代码演示,演示示例7:使用断点跟踪演示带参数的方法调用过程,练习,实现MP3播放器:1)播放录入的音乐名称 2)外放正在播放的歌曲,完整代码,计算3、6和9的阶乘并输出结果,public class TestFunction1 public static void main(String args)long z=1L;int x=1;for(x=3;x 0;x-)z*=x;/该循环求3的阶乘System.out.println(3!=+z);/输出3的阶乘for(x=6,z=1;x 0;x-)/该循环求6的阶乘z*=x;System.out.println(6!=+z);/输出6的阶乘for(x=9,z=1;x 0;x-)/该循环求9的阶乘z*=x;System.out.println(9!=+z);/输出9的阶乘,使用方法计算3、6和9的阶乘并输出结果,public class TestFunction2/第一个方法是main方法,它3次调用了第二个方法public static void main(String args)factorial(3);factorial(6);factorial(9);/第二个方法是factorial方法,它求出参数n的阶乘并输出static void factorial(int n)long z=1L;int x=n;for(;x0;x-)/该循环求n的阶乘z*=x;System.out.println(n+!=+z);/输出n的阶乘,static void aMathod()/无参数的方法static void bMathod(int n)/有一个参数的方法static void cMathod(int n,int m,long k)/有多个参数的方法,方法类型:方法名后小括号内的参数指明了方法接收的外部输入。如果一个方法不需要接收外部的输入,则参数为空,但方法名后的小括号必须有,它是方法的标志。如果一个方法需要接收多个外部的输入,则构成参数列表,各个参数之间使用逗号分割。例如:,static void Mathod1()/无返回值的方法static boolean Mathod2()/返回布尔值的方法static int Mathod3()/返回整型值的方法,方法类型:方法的返回值类型可以是基本数据类型也可以是对象,如果没有返回值,就用void来描述。例如,main方法就没有返回值,而且必须没有返回值。又如,如果一个方法被定义成void类型,在方法中不需要return语句;否则,由return语句所返回的值或表达式,必须与方法的返回值同属于一个类型。,使用方法返回值实现的阶乘,public class TestFunctionRetupublic static void main(String args)long result=0;result=factorial(3);/调用方法并获得返回值System.out.println(3!=+result);result=factorial(6);/调用方法并获得返回值System.out.println(6!=+result);result=factorial(9);/调用方法并获得返回值System.out.println(9!=+result);static long factorial(int n)long z=1L;int x=n;for(;x 0;x-)/计算阶乘z*=x;return z;/返回阶乘值,与前面的实现对比看有什么差异,方法调用案例,编写成绩计算类(ScoreCalc)编写测试类,成绩计算类,测试类,演示示例:方法调用,面向对象的编程思维,ScoreCalc类 和 Test类,public static void main(String args)Scanner input=new Scanner(System.in);System.out.print(请输入Java成绩:);int java=input.nextInt();/*计算并显示输出*/int total=java+c+db;double avg=total/3;System.out.print(总成绩:+total);System.out.print(n平均分:+avg);,一次还可以接受,如果还要再执行这个功能,难道还要重复再写?,方法中的参数,参数传递在Java语言中,向方法传递参数的方式之一是“按值传递”。按值传递意味着当将一个参数传递给一个方法时,首先创建了源参数的一个副本并将这个副本传入了方法,这样方法接收的是原始值的一个副本。,演示示例:变量赋值,public class TestPara static void test(boolean paratest)paratest=!paratest;System.out.println(In test(boolean):test=+paratest);public static void main(String args)boolean test=true;System.out.println(Before test(boolean):test=+test);test(test);System.out.println(After test(boolean):test=+test);,程序运行结果:Before test(boolean):test=trueIn test(boolean):test=falseAfter test(boolean):test=true,因为方法接收的是一个副本,所以即使在方法中修改了该参数,那仅仅是改变副本,而源参数值保持不变。,参数传递,对象作为方法的参数 当使用对象实例作为参数传递给方法时,参数的值是对对象的引用。也就是说,传递给到方法内部的是对象的引用值而不是对象的内容。在方法内这个引用值不会被改变。但如果通过该引用值修改了所指向的对象的内容,则方法结束后,所修改的对象内容可以保留下来。,对象传参示例,class DemoTeacherpublic void print(Teacher1 t)System.out.println(姓名:+t.name+年龄:+t.age);public class Teacher1public String name;/教师姓名public int age;/年龄 public Teacher1(String name,int age)this.name=name;this.age=age;public static void main(String args)Teacher1 t1=new Teacher1(凤姐,25);DemoTeacher dt=new DemoTeacher();dt.print(t1);,程序运行结果:姓名:凤姐 年龄:25,示例,class TestObject private String name;public void setName(String pname)name=pname;public String getName()return name;,若以对象做入参,其值会不会发生变化呢?,public class Testit private void modify(TestObject a,TestObject b)a.setName(xyz);b.setName(uvw);System.out.println(in test.);System.out.println(a.getName()=+a.getName();System.out.println(b.getName()=+b.getName();public static void main(String args)TestObject ta=new TestObject();TestObject tb=new TestObject();Testit tc=new Testit();ta.setName(abc);tb.setName(def);System.out.println(before test.);System.out.println(ta.getName()=+ta.getName();System.out.println(tb.getName()=+tb.getName();tc.modify(ta,tb);System.out.println(after test.);System.out.println(ta.getName()=+ta.getName();System.out.println(tb.getName()=+tb.getName();,运行结果:before test.ta.getName()=abctb.getName()=defin test.ta.getName()=xyztb.getName()=uvwafter test.ta.getName()=xyztb.getName()=uvw,向modify传递了ta、tb两个对象的引用,使方法内的两个对象与传入方法的对象引用一样都分别指向源参数ta、tb两个对象,即我们可以通过这两个对象来操作源参数。,示例,class Integerint i;Integer(int i)this.i=i;public String toString()return+i;,结论:只要修改了入参对象,其源对象都会相应变化?,示例,public class Swap public static void main(String args)Integer a,b;a=new Integer(10);b=new Integer(50);System.out.println(before swap.);System.out.println(a is+a);System.out.println(b is+b);swap(a,b);System.out.println(after swap.);System.out.println(a is+a);System.out.println(b is+b);public static void swap(Integer pa,Integer pb)Integer temp=pa;pa=pb;pb=temp;System.out.println(in swap.);System.out.println(a is+pa);System.out.println(b is+pb);,运行结果:before swap.a is 10b is 50in swap.a is 50b is 10after swap.a is 10b is 50,对象a、b传入方法swap的是 对象的引用,但是,swap方法并没有直接使用传入的引用而是为这两个引用生成了两个副本pa、pb,并且在swap方法中操作的就是这两个副本,使其交换了所指向的对象,而没有直接操作传入的引用。,思考,当以对象为参数时,会不会调用构造方法?请说明理由,类的实例化,使用对象的步骤:第一步:声明一个对象第二步:分配空间第三步:指向首地址,类名 对象名=new();,定义对象标识符,将对象初始化,对象标识符指向首地址,类名 对象名;对象名=new();,Circle mycircle=new Circle();,Circle mycircle;mycircle=new Circle();,public class Circle private double radius;private double area;final double pi=3.14;public void setRadius(double r)radius=r;public double calculateArea()return pi*radius*radius;,定义一个求圆面积的类,对象的创建,创建Circle类的一个对象可以写成:,public class test public static void main(String args)int Circle mycircle;/声明mycircle对象 mycircle=new Circle();/对mycircle初始化,Java是引用,不能直接操作对象的地址,对象赋值,同类的对象之间也可以进行赋值,这种情况称为对象赋值:,public class test public static void main(String args)Circle anothercircle;anothercircle=mycircle;,和变量赋值不一样,对象赋值并不是真正把一个对象赋给另一个对象,而是让一个对象名存储的对象首地址和另一个对象名存储的对象首地址相同。换句话说,对象间的赋值实际上是对象首地址的赋值,示例演示,设计类Number,测试对象间的赋值,public class Number int i;public static void main(String a)Number n1=new Number();Number n2=new Number();n1.i=9;n2.i=47;System.out.println(n1.i=+n1.i+tt+n2.i=+n2.i);n1=n2;System.out.println(n1.i=+n1.i+tt+n2.i=+n2.i);n1.i=27;System.out.println(n1.i=+n1.i+tt+n2.i=+n2.i);,程序运行结果:n1.i=9 n2.i=47n1.i=47 n2.i=47n1.i=27 n2.i=27,