《java程序设计教学教案课件042.ppt》由会员分享,可在线阅读,更多相关《java程序设计教学教案课件042.ppt(73页珍藏版)》请在三一办公上搜索。
1、第四章 类、对象和接口,4.2 对象,类是创建对象的模板创建对象:对象的声明为对象分配内存,4.2 对象,1、对象的声明:格式:类的名字 对象名字;如:People zhangPing;,4.2 对象,2、为声明的对象分配内存:使用new运算符和类的构造方法为声明的对象分配内存,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的)。如:zhangPing=new People();,4.2 对象,class XiyoujiRenwufloat height,weight;String head,ear,hand,foot,mouth;void speak(String s
2、)System.out.println(s);class Apublic static void main(String args)XiyoujiRenwu zhubajie;/声明对象zhubajie=new XiyoujiRenwu();/为对象分配内存,使用new运算符和默认的构造方法,例:1,4.2 对象,class Point int x,y;Point(int a,int b)x=a;y=b;public class A public static void main(String args)Point p1,p2;/声明对象p1和p2。p1=new Point(10,10);/为
3、对象分配内存,使用 new 和类中的构造方法。p2=new Point(23,35);/为对象分配内存,使用 new 和类中的构造方法。,例:2,练习,用课本P45 类梯形创建一个名为“tx”的对象,4.2 对象,3、对象的内存模型:声明对象时的内存模型声明对象变量后,变量内存无数据,是空对象,不能使用如:XiyoujiRenwu zhubajie;,zhubajie,4.2 对象,3、对象的内存模型:对象分配内存后的内存模型为成员变量分配内存返回一个应用给对象变量如 zhubajie=new XiyoujiRenwu();,0.0,0.0,null,null,null,null,null,0
4、 xAB12,zhubajie,weight,height,head,ear,mouth,hand,foot,4.2.2 使用对象,使用运算符“.”,对象实现对自己的变量访问和方法的调用对象操作自己的变量(对象的属性)对象创建后,就有自己的变量。通过使用运算符“.”对象实现对自己变量的访问。对象调用类中的方法(对象的功能)采用“.”调用创建它的类中的方法。当对象调用类中的一个方法时,方法中的局部变量被分配到内存空间,4.2.2 使用对象,class XiyoujiRenwu float height,weight;String head,ear,hand,foot,mouth;void spe
5、ak(String s)head=歪着头;System.out.println(s);public class Example public static void main(String args)XiyoujiRenwu zhubajie,sunwukong;/声明对象。zhubajie=new XiyoujiRenwu();/为对象分配内存,使用new 运算符和默认构造方法。sunwukong=new XiyoujiRenwu();zhubajie.height=1.80f;/对象给自己的变量赋值。,zhubajie.weight=160f;zhubajie.hand=两只黑手;zhub
6、ajie.foot=两只大脚;zhubajie.head=大头;zhubajie.ear=一双大耳朵;zhubajie.mouth=一只大嘴;sunwukong.height=1.62f;/对象给自己的变量赋值。sunwukong.weight=1000f;sunwukong.hand=白嫩小手;sunwukong.foot=两只绣脚;sunwukong.head=绣发飘飘;sunwukong.ear=一对小耳;sunwukong.mouth=樱桃小嘴;System.out.println(zhubajie的身高:+zhubajie.height);System.out.println(zhu
7、bajie的头:+zhubajie.head);System.out.println(sunwukong的重量:+sunwukong.weight);System.out.println(sunwukong的头:+sunwukong.head);zhubajie.speak(俺老猪我想娶媳妇);/对象调用方法。System.out.println(zhubajie现在的头:+zhubajie.head);sunwukong.speak(老孙我重1000斤,我想骗八戒背我);/对象调用方法。System.out.println(sunwukong现在的头:+sunwukong.head);,4.
8、2.2 使用对象,类中的方法可以操作成员变量,当对象调用该方法时,方法中出现的成员变量就是指该对象的成员变量。,练习,打印梯形的面积:(上底为2.0,下底为5.0,高为3.0)用课本P45 梯形类,4.2.3 对象的应用和实体,当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间被称作该对象的实体。对象中存放着应用,确保实体由该对象操作使用。,4.2.3 对象的应用和实体,如:Point p1=new Point(12,16);Point p2=new Point(6,18);p1=p2;,12,16,6,18,0 xAB28,0 xDD,6,18,X,y,X,y,X,y,0 xD
9、D,0 xDD,p1,p2,p2,p1,4.2.3 对象的应用和实体,例4:class 圆 double 半径;圆(double r)半径=r;double 计算面积()return 3.14*半径*半径;void 修改半径(double 新半径)半径=新半径;double 获取半径()return 半径;,4.2.3 对象的应用和实体,class 圆锥 圆 底圆;double 高;圆锥(圆 circle,double h)this.底圆=circle;this.高=h;double 计算体积()double volume;volume=底圆.计算面积()*高/3.0;return volum
10、e;void 修改底圆半径(double r)底圆.修改半径(r);double 获取底圆半径()return 底圆.获取半径();,4.2.3 对象的应用和实体,class Example public static void main(String args)圆 circle=new 圆(10);圆锥 circular=new 圆锥(circle,20);System.out.println(圆锥底圆半径:+circular.获取底圆半径();System.out.println(圆锥的体积:+circular.计算体积();circular.修改底圆半径(100);System.out.
11、println(圆锥底圆半径:+circular.获取底圆半径();System.out.println(圆锥的体积:+circular.计算体积();,4.3 static关键字,1、实例变量和类变量的区别不同对象的实例变量将被分配不同的内存空间,如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其它对象的这个类变量。也就是说对象共享类变量,4.3 static关键字,例子5class 梯形 float 上底,高;static float 下底;/类变量。梯形(float 上底,float 高)this.上底=上底;this.高=高
12、;float 获取上底()return 上底;float 获取下底()return 下底;,4.3 static关键字,class Example4_5 public static void main(String args)梯形 laderOne,laderTwo;/梯形的字节码被加载到内存。梯形.下底=60;/通过类名操作类变量。laderOne=new 梯形(18.0f,20);laderTwo=new 梯形(9.0f,10);System.out.println(laderOne的上底:+laderOne.获取上底();System.out.println(laderOne的下底:+l
13、aderOne.获取下底();System.out.println(laderTwo的上底:+laderTwo.获取上底();System.out.println(laderTwo的下底:+laderTwo.获取下底();,4.3 static关键字,2、实例方法和类方法的区别当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。,4.4 this关键字,1、this关键字可以出现在类的实例方法中,代表使用该方法的当前对象。2、thi
14、s关键字出现在类的构造方法中,代表使用该构造方法所创建的对象。实例方法可以操作类的成员变量。格式:this.成员变量,4.4 this关键字,如:class Aint x;void f()this.x=100;/此例子没有同名的成员变量和局部变量,this可以省略,4.4 this关键字,如:class Bvoid f()this.g();void g()System.out.println(“OK”);/此例子中this代表使用方法f的当前对象,方法发f的方法体中this.g()就是当前对象调用方法g.一个方法调用另一个方法时可以省略方法名字前面的this,4.5 包,1、包语句通过关键字p
15、ackage声明包语句。package作为Java源文件的第一条语句。package语句的一般格式:package 包名;如:package sunrise;package;,4.5 包,如果源程序中省略了package语句,源文件所定义命名的类被隐含地认为是无名包的一部分即源文件中定义命名的类在同一个包中,但该包没有名字。,4.5 包,程序如果使用了包语句,就必须有相应的目录结构。如:package tom.jafei;则目录结构必须包含如下结构:tomjiafei,4.5 包,例6:,package tom.jiafei;public class Example4_6 public sta
16、tic void main(String args)System.out.println(我有包名);,4.5 包,2、import语句使用import语句可以引入包中的类。在一个java源程序中可以有多个import语句,他们必须写在package语句和源文件中的类的定义之间,4.5 包,2、import语句Java提供的包有很多,约130多个如:java.applet 包含所有实现java applet的类 java.awt 包含抽象窗口工具集中的图形、文本、窗口GUI类java.awt.image 包含抽象窗口工具集中的图像处理类java.lang 包含所有基本语言类java.io 包含
17、所有的输入/输出类 包含所有实现网络功能的类java.until包含有用的数据类型类,4.5 包,引入类:如果要引入一个包中的全部类,则可以用星号来代替如:import java.awt.*;只引入一个确定的类,则直接写明引用如:import java.until.Date,4.5 包,例7:,import java.applet.Applet;import java.awt.*;public class Example extends Applet Button redbutton;public void init()redbutton=new Button(我是一个红色的按钮);redbu
18、tton.setBackground(Color.red);add(redbutton);public void paint(Graphics g)g.drawString(it is a button,30,50);,例8,import tom.jiafei.*;class Example4_8 public static void main(String args)Trangle trangle=new Trangle(12,3,1);trangle.计算面积();trangle.修改三边(3,4,5);trangle.计算面积();,4.6 访问权限,1.私有变量和私有方法2.共有变量和
19、共有方法3.友好变量和友好方法4.受保护成员变量和方法5.public类与友好类,4.6 访问权限,1.私有变量和私有方法用关键字private修饰的成员变量和方法被称为私有变量和私有方法如:,class Tomprivate float weight;/weight私有的float变量private float f(float a,float b)/方法f是私有方法,4.6 访问权限,对于私有成员变量或方法,在另外一个类中,不能操作这个私有变量或方法,只有在本类中创建该类的对象的时候,才能访问自己的私有变量和类中的私有方法。,class Jerryvoid g()Tom cat=new To
20、m();cat.weight=23f;/非法cat.f(3f,4f);/非法,4.6 访问权限,class Example4_9 private int money;Example4_9()money=2000;private int getMoney()return money;public static void main(String args)Example4_9 exa=new Example4_9();exa.money=3000;int m=exa.getMoney();System.out.println(money=+m);,类中访问自己的私有成员变量和私有方法,4.6 访问
21、权限,2.共有变量和共有方法用关键字public修饰的成员变量和方法被称为共有变量和共有方法如:,class Tompublic float weight;/weight共有的float变量public float f(float a,float b)/方法f是共有方法,4.6 访问权限,对于共有成员变量或方法,在另外一个类中,能操作这个变量或方法。,class Jerryvoid g()Tom cat=new Tom();cat.weight=23f;/合法cat.f(3f,4f);/合法,4.6 访问权限,3.友好变量和方法不用private、public、protected修饰的成员变量
22、和方法被称为友好变量和友好方法。如:,class Tomfloat weight;/weight友好的float变量float f(float a,float b)/方法f是友好方法,4.6 访问权限,在同一个包中,那么能访问自己的友好变量和友好方法。,class Jerryvoid g()Tom cat=new Tom();cat.weight=23f;/合法cat.f(3f,4f);/合法,4.6 访问权限,4.受保护的成员变量和方法用关键字protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法如:,class Tomprotected float weight;/we
23、ight受保护的float变量protected float f(float a,float b)/方法f是受保护的方法,4.6 访问权限,当在另外一个类中用类Tom创建一个对象后,如果这个类与类Tom在同一个包中,那么该对象能访问自己的protected变量和方法.也可以通过类名访问,class Jerryvoid g()Tom cat=new Tom();cat.weight=23f;/合法cat.f(3f,4f);/合法,4.6 访问权限,5.public类与友好类 类声明时,如果在关键字class前面加上public关键字,就称这样类是一个public类如:public class A
24、如果一个类不加public修饰,则为友好类如:class A,4.6 访问权限,5.public类与友好类 不能用protected和private修饰类访问权限的排列:public、protected、友好的、private,4.7 类的继承,继承是一种用已有类创建新类的机制。新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。由继承而得到的类成为子类,被继承的类称为父类(超类)。Java不支持多重继承(子类只能有一个父类),4.7 类的继承,1.创建子类在声明中,使用关键字extends来创建一个类的子类,格式:,class 子类名 extends 父类名,4.7 类的继承,
25、1.创建子类例:把Student声明为People的子类,People是Students的父类.,class Student extends People,4.7 类的继承,2.子类的继承性子类继承父类的成员变量继承父类的方法.,4.7 类的继承,2.子类的继承性子类和父类在同一包种的继承性如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法.继承的成员或方法的访问权限保持不变.,class Father private int money;int weight=100;Strin
26、g speak(String s)return s;class Son extends Father String hand;void f()weight=200;System.out.println(weight);class Suizi extends Son String foot;,public class Example4_10 public static void main(String args)Son son=new Son();Suizi sunzi=new Suizi();son.hand=两只手;sunzi.hand=两小只手;sunzi.foot=两只脚;System.
27、out.println(son.hand);son.f();System.out.println(sunzi.weight+:+sunzi.hand+:+sunzi.foot);System.out.println(sunzi.speak(我是孙子);,4.7 类的继承,2.子类的继承性子类和父类不在同一包种的继承性如果子类和父类不在同一个包中,那么子类继承了父类的protected、public成员变量作为子类的成员变量,并且继承了父类的protected、public方法为子类的方法。继承的成员或方法的访问权限保持不变.如果子类和父类不在同一个包里,子类不能继承父类的友好变量和友好方法。,
28、Father.java:,package tom.jiafei;public class Father int height;protected int money=120;public int weight;protected int getMoney()return money;void setMoney(int newMoney)money=newMoney;,Jerry.java,package;import tom.jiafei.Father;public class Jerry extends Father/Jerry和Father在不同的包中.void f()money=1000
29、;/合法,/height=1.89f;/非法,因为Jerry没有继承友好的height System.out.println(money);/输出结果是1000。/setMoney(300);/非法,因为Jerry没有继承友好的方法setMoney。int number=getMoney();/合法.System.out.println(number);/输出结果是1000。public static void main(String args)Jerry jerry=new Jerry();jerry.f();,4.7 类的继承,2.子类的继承性protected的进一步说明一个类A中的pr
30、otected成员变量和方法可以被它的直接子类和间接子类继承,如:B是A的子类,C是B的子类,D又是C的子类,那么B、C和D类都继承了A的protected成员变量和方法。如果用D类在D本身中创建了一个对象,那么该对象总是可以通过“.”运算符访问继承的或自己定义的protected变量和protected方法。如果在另外一个类中,比如Other类,用D类创建了一个对象object,该对象通过“.”运算符访问protected变量和protected方法的权限如下:,4.7 类的继承,如果在另外一个类中,比如Other类,用D类创建了一个对象object,该对象通过“.”运算符访问protect
31、ed变量和protected方法的权限如下:子类D中亲自声明的protected成员变量和方法,不可能是从别的类继承来的,object访问这些非继承的protected成员变量和方法时,只要Other类和D类在同一个包中就可以如果子类D的对象的protected成员变量或protected方法是从父类继承的,那么就要一直追溯到该protected成员变量或方法的“祖先”类,即A类。如果Other类和A类在同一个包,object对象能访问继承的protected变量和protected方法。,A.java:,package tom.jiafei;public class A protected
32、int x=120;protected void fA()System.out.println(我是A类中的protected方法);System.out.println(x=+x);,B.java:,package;import tom.jiafei.A;public class B extends A protected void fB()System.out.println(我是B类中自己定义的方法);public static void main(String args)B b=new B();/对象b在B类中.b.x=1000;/合法.b.fA();/合法.b.fB();/合法.,D
33、L.java,package;import.B;public class DL public static void main(String args)B b=new B();/对象b在DL类中.b.x=1000;/非法,因为对象b的成员变量x是从A类继承的,但DL和A不在同一包中.b.fA();/非法.因为方法fA是B类从A类继承的protected方法,但DL和A不在同一包中.b.fB();/合法,因为方法fB是B类中自己定义的protected方法,DL类和B类在同一包中.,Example.java,package tom.jiafei;import.B;public class Exa
34、mple public static void main(String args)B b=new B();/对象b在Example类中.b.x=1000;/合法,因为对象b的成员变量x是从A类继承的,而Example和A在 同一包中.b.fA();/合法.因为方法fA是B类从A类继承的protected方法,而Example和A在同一包中.b.fB();/非法,因为方法fB是B类中自己定义的protected方法,但 Example类和B类不在同一包中.a,4.7 类的继承,3.成员变量的隐藏和方法的重写成员变量隐藏:如果在子类中定义的成员变量和父类的成员变量同名时,则父类中的成员变量不能被继
35、承,此时称为子类的成员变量隐藏了父类的成员变量。方法重写:如果子类中定义了一个方法,并且这个方法的名字、返回类型以及参数个数和类型同父类的某个方法完全相同,父类的这个方法将被隐藏,则称重写父类的方法。,4.7 类的继承,3.成员变量的隐藏和方法的重写子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变成为自身的状态和行为。,例子12,import java.applet.*;import java.awt.*;class A private int number=100;float f(int x,int y)return x+y;float g(float x,float y)ret
36、urn x+y+number;,class B extends A float f(int x,int y)return x*y;public class Example public static void main(String args)B b=new B();System.out.println(b.f(2,5);/调用重写的方法。System.out.println(b.g(2,5);/b调用继承的父类的方法。,4.7 类的继承,3.成员变量的隐藏和方法的重写重写父类的方法时,不能降低方法的访问权限。,import java.applet.*;import java.awt.*;cl
37、ass A private int number=100;protected float f(int x,int y)return x+y;float g(float x,float y)return x+y+number;,class B extends A float f(int x,int y)return x*y;,class C extends A public float f(int x,int y)/合法,没有降低访问级别 return x-y;,4.7 类的继承,4.final类final方法Final类不能被继承,即不能有子类Final class AA就是一个final类。出于安全的考虑,将一些类修饰为final类。如果一个方法被修饰为final方法,则这个方法不能被重写。如果一个成员变量被修饰为final,就是常量。,作业,包语句的格式是什么?包语句在Java源文件什么位置?如何引入包中的类?用public、protected、友好的、private修饰的方法访问权限的级别排列顺序是怎样的?什么是类的继承?Java是否支持多重继承?,