《Java程序设计电子课件》由会员分享,可在线阅读,更多相关《Java程序设计电子课件(124页珍藏版)》请在金锄头文库上搜索。
1、JavaJava程序设计程序设计电子课件电子课件宋波,李晋,李妙妍,张悦宋波,李晋,李妙妍,张悦2024/7/24宋波,李晋,李妙妍,张悦第第1篇篇 核心基础篇核心基础篇第第 3 3 章章 JavaJava面向对象特性面向对象特性2024/7/24宋波,李晋,李妙妍,张悦本章内容本章内容3.1 类与对象类与对象3.2 隐藏和封装隐藏和封装3.3 类的继承与多态类的继承与多态3.4 数组数组2024/7/24宋波,李晋,李妙妍,张悦学习目标学习目标1.掌握对象与类的基本概念掌握对象与类的基本概念2.了解对象的生命周期了解对象的生命周期3.熟练掌握类的定义及实例化熟练掌握类的定义及实例化4.理解隐
2、藏与封装理解隐藏与封装5.熟练掌握类的继承与多态熟练掌握类的继承与多态6.掌握数组的应用掌握数组的应用2024/7/24宋波,李晋,李妙妍,张悦本章概要本章概要1.Java中类和对象的定义;中类和对象的定义;2.Java对对OOP三个主要特性三个主要特性封装、封装、继承和多态的支持机制;继承和多态的支持机制;3.Java中的对象数组这种数据结构。中的对象数组这种数据结构。2024/7/24宋波,李晋,李妙妍,张悦3.1 类与对象类与对象1.类与对象的定义类与对象的定义2.成员变量与局部变量成员变量与局部变量3.成员方法成员方法4.对象的创建对象的创建5.对象的使用对象的使用6.对象的消除对象的
3、消除7.方法重载方法重载8.this9.构造方法构造方法2024/7/24宋波,李晋,李妙妍,张悦3.1.1 类和对象的定义类和对象的定义Java程序是由程序是由一个或若干个类一个或若干个类组成,组成,类是类是Java程序的程序的基本组成单位基本组成单位,包,包括:括:成员变量:描述对象的属性成员变量:描述对象的属性成员方法:描述对象的行为成员方法:描述对象的行为2024/7/24宋波,李晋,李妙妍,张悦类定义的结构类定义的结构2024/7/24宋波,李晋,李妙妍,张悦1. 类的声明格式类的声明格式publicabstract|finalclassextendssuperClassNameim
4、plementsinterfaceNameList类的访问权限及其属性类的访问权限及其属性类定义关键字类定义关键字类名类名继承某个父类的关键字继承某个父类的关键字 实现接口的关键字实现接口的关键字 2024/7/24宋波,李晋,李妙妍,张悦2. 类体类体构造和初始化新对象的构造方法;构造和初始化新对象的构造方法; 表示类及其对象状态的变量;表示类及其对象状态的变量; 实现类及其对象的方法;实现类及其对象的方法; 进行对象清除的进行对象清除的finalize()finalize()方法。方法。 2024/7/24宋波,李晋,李妙妍,张悦3.1.2 成员变量与局部变量成员变量与局部变量成员变量(类
5、):成员变量(类):在类体中声明的变量,且不属于任何在类体中声明的变量,且不属于任何一个方法时。一个方法时。 局部变量:局部变量:在方法体中声明的变量以及方法的参在方法体中声明的变量以及方法的参数则统称为方法的局部变量。数则统称为方法的局部变量。 2024/7/24宋波,李晋,李妙妍,张悦【例3-1】成员变量示例publicclassApplepublicStringcolor;/公共变量colorpublicstaticintnum;/静态变量numpublicfinalbooleanMATURE=true;/常量MATURE并赋值publicstaticvoidmain(Stringarg
6、s)System.out.println(苹果数量:+Apple.num);Appleapple=newApple();System.out.println(苹果颜色:+apple.color);System.out.println(苹果是否成熟:+apple.MATURE);num是类变量(即静态变量),可通过类名直接访问是类变量(即静态变量),可通过类名直接访问2024/7/24宋波,李晋,李妙妍,张悦2. 局部变量局部变量final;指定局部变量为常量指定局部变量为常量局部变量的参数类型局部变量的参数类型局部变量的名称局部变量的名称2024/7/24宋波,李晋,李妙妍,张悦【例例3-2】
7、局部变量的使用局部变量的使用1.publicclassApple2.Stringcolor=Red;3.floatprice;4.publicStringgetColor()5.returncolor;6.7.publicfloatcount()8.intnum;9.if(num0)10.return0;11.else12.returnprice*num;13.成员变量成员变量错误语句,因为局错误语句,因为局部变量部变量num还没有还没有被赋值就使用被赋值就使用2024/7/24宋波,李晋,李妙妍,张悦14.public static void main(String args) 15. Ap
8、ple apple=new Apple();16. System.out.println(苹果总价钱:苹果总价钱:+apple.count();17. 18.2024/7/24宋波,李晋,李妙妍,张悦概念:概念:指该变量在程序代码中的指该变量在程序代码中的作用区域作用区域,在,在该区域外该区域外不能直接访问不能直接访问变量。变量。生命周期:生命周期:指从声明一个变量并指从声明一个变量并分配内存空间分配内存空间、使使用变量开始用变量开始,然后,然后释放释放该变量并该变量并清除清除所所占用内存空间的一个占用内存空间的一个过程过程。3. 变量的有效范围变量的有效范围2024/7/24宋波,李晋,李妙
9、妍,张悦变量的种类:变量的种类:成员变量成员变量类体中声明的成员类体中声明的成员变量在整个类中有效。变量在整个类中有效。局部变量局部变量在方法内或方法内在方法内或方法内的复合代码块的复合代码块(方法内部,方法内部,“”与与“”之间的代码之间的代码)声明的变量。声明的变量。2024/7/24宋波,李晋,李妙妍,张悦【例例3-3】变量的有效范围变量的有效范围 1.publicclassOlympics12.privateintmedal_All=800;3.publicvoidChina()4.intmedal_CN=100;5.if(medal_CN1000)6.intgold=50;7.med
10、al_CN+=30;8.medal_All-=130;9.10.11.成员变量成员变量代码块外、方法代码块外、方法体内的局部变量体内的局部变量代码块的局部变量代码块的局部变量允许访问本方法的允许访问本方法的局部变量局部变量允许访问本类的成员变量允许访问本类的成员变量2024/7/24宋波,李晋,李妙妍,张悦3.1.3 成员方法成员方法2024/7/24宋波,李晋,李妙妍,张悦注意:注意:方法体中定义的方法体中定义的局部变量局部变量的作用域只的作用域只在方法内部;在方法内部;如果局部变量的名字和类的成员变量如果局部变量的名字和类的成员变量名字相同,则名字相同,则类的成员变量类的成员变量被屏蔽;被
11、屏蔽;如果要在方法中使类的成员变量有效,如果要在方法中使类的成员变量有效,则可以使用则可以使用this关键字。关键字。2024/7/24宋波,李晋,李妙妍,张悦publicclassOlympics2privateintgold=0;privateintsilver=0;privateintcopper=0;publicvoidchangeModel(inta,intb,intc)gold=a;/给类的成员变量赋值intsilver=b;/使同名类成员变量silver隐藏intcopper=50;/使同名类成员变量copper隐藏System.out.println(“InchangModel
12、:”+“金牌=”+gold+“银牌=”+silver+“铜牌+copper);this.copper=c;/给类成员变量z赋值2024/7/24宋波,李晋,李妙妍,张悦StringgetModel()return“金牌=”+gold+“银牌=”+silver+“铜牌=+copper;2024/7/24宋波,李晋,李妙妍,张悦publicstaticvoidmain(Stringargs)Olympics2o2=newOlympics2();System.out.println(BeforechangModel:+o2.getModel();o2.changeModel(100,100,100)
13、;System.out.println(AfterchangeModel:+o2.getModel();BeforchangModel:金牌=0银牌=0铜牌=0gold=100silver=100copper=50InchangModel:金牌=100银牌=100铜牌=50AfterchangModel:金牌=100银牌=0铜牌=100如果在方法中对成员变量的值进行了修改,则这种修改将是永久的。gold=0silver=0copper=02024/7/24宋波,李晋,李妙妍,张悦3.1.4 对象的创建对象的创建一个对象的生命周期包括三个一个对象的生命周期包括三个阶段:阶段:对象的创建对象的创建
14、对象的使用对象的使用对象的消除对象的消除 2024/7/24宋波,李晋,李妙妍,张悦创建对象创建对象public public classclass Point Point int x=1; int x=1; int y=1; int y=1; public Point(int x,int y) public Point(int x,int y) this.x=x; this.x=x; this.y=y; this.y=y; /实例化实例化Point类,创建对象类,创建对象ptPoint pt Point pt = = newnew Point( Point(2,32,3); ); 2024/
15、7/24宋波,李晋,李妙妍,张悦Point pt = new Point(2,3);2024/7/24宋波,李晋,李妙妍,张悦3.1.5 对象的使用对象的使用1.引用对象的变量引用对象的变量objectReference.variableName;2.调用对象的方法调用对象的方法objectReference.methodName(argumentList)2024/7/24宋波,李晋,李妙妍,张悦【例例3-6】对象使用的示例对象使用的示例 1.publicclassPoint2.intx=1;3.inty=1;4.publicvoidsetXY(intx,inty)5.publicintge
16、tXY()6.publicstaticvoidmain(Stringargs)7.Pointpt=newPoint();8.pt.x=2;9.System.out.println(x与y的乘积为:+pt.getXY();10.pt.setXY(3,2);11.System.out.println(x与y的乘积为:+pt.getXY();12.13.成员变量成员变量成员方法成员方法声明并创建声明并创建Point类的对象类的对象pt访问对象访问对象pt的成员变量的成员变量x调用成员方法调用成员方法2024/7/24宋波,李晋,李妙妍,张悦3.1.6 对象的消除对象的消除在在C+中中,程序员要显式地
17、删除不用的对,程序员要显式地删除不用的对象,即手动释放对象占用的存储空间。象,即手动释放对象占用的存储空间。 Java提供了垃圾回收提供了垃圾回收(garbage collection)机制机制:自动判断对象是否还在:自动判断对象是否还在使用,并自动销毁不再使用的对象,回收使用,并自动销毁不再使用的对象,回收对象所占用的资源。对象所占用的资源。 2024/7/24宋波,李晋,李妙妍,张悦Java垃圾回收器执行机制的生命周期垃圾回收器执行机制的生命周期2024/7/24宋波,李晋,李妙妍,张悦3.1.7 方法的重载方法的重载在同一个类中定义了多个在同一个类中定义了多个同名而内容同名而内容不同不同
18、的成员方法。的成员方法。 classScreen public void print( int i) public void print( float i) public void print( int i, String str ) 2024/7/24宋波,李晋,李妙妍,张悦方法重载方法重载原则:原则:参数表必须不同:参数表必须不同:方法参数的个数不同方法参数的个数不同参数类型不同参数类型不同返回类型、修饰符返回类型、修饰符返回类型返回类型2024/7/24宋波,李晋,李妙妍,张悦【例3-7】方法重载的示例1.publicclassCalculate2.finalfloatPI=3.1415
19、9f;3.publicfloatgetArea(floatr)4.returnPI*r*r;5.6.publicfloatgetArea(floatl,floatw)7.returnl*w;8.9.publicvoiddraw(intnum)10.System.out.println(画+num+个任意形状的图形);11.12.publicvoiddraw(Stringshape)13.System.out.println(画一个+shape);14.方法重载方法重载方法重载方法重载2024/7/24宋波,李晋,李妙妍,张悦15.publicstaticvoidmain(Stringargs)
20、16.Calculatec=newCalculate();/创建Calculate类的对象17.floatl=20;18.floatw=40;19.System.out.println(求长为+l+宽为+w+的矩形面积是:+c.getArea(l,w);20.floatr=6;21.System.out.println(求半径为+r+的圆形面积是:+c.getArea(r);22.intnum=8;23.c.draw(num);24.c.draw(“矩形”);25.26.通过传递的参数判通过传递的参数判断调用哪个方法断调用哪个方法通过传递的参数判通过传递的参数判断调用哪个方法断调用哪个方法20
21、24/7/24宋波,李晋,李妙妍,张悦3.1.8 关键词关键词this用来指向对象自身用来指向对象自身 用来访问当前对象的数据成员用来访问当前对象的数据成员;用来访问当前对象的成员方法用来访问当前对象的成员方法;重载构造方法时,用来引用同类的重载构造方法时,用来引用同类的其他构造方法。其他构造方法。2024/7/24宋波,李晋,李妙妍,张悦【例3-8】this关键字的使用1.publicclassFruit2.Stringcolor=绿色;3.doubleprice;4.intnum;5.14.publicdoublecount(doubleprice,intnum)15.this.price
22、=price;16.this.num=num;17.returnprice*num;18.19.23.成员变量成员变量将参数值赋值给成员变将参数值赋值给成员变量,即指向对象自身。量,即指向对象自身。2024/7/24宋波,李晋,李妙妍,张悦3.1.9 类的构造方法类的构造方法功能:功能:初始化类的成员变量初始化类的成员变量特点:特点:名称必须与类名相同名称必须与类名相同不能有返回值不能有返回值必须用必须用new自动调用自动调用2024/7/24宋波,李晋,李妙妍,张悦【例3-9】在类Apple中定义两个构造方法1.publicclassApple2.privateintnum;3.privat
23、edoubleprice;4.publicApple()5.num=10;6.price=2.34;7.8.publicApple(intnum,doubleprice)9.this.num=num;10.this.price=price;11.12.16.publicstaticvoidmain(Stringargs)17.Applea1=newApple();18.Applea2=newApple(50,3.15)19.21.22.参参数数化化构构造造方方法法2024/7/24宋波,李晋,李妙妍,张悦2. 缺省构造方法缺省构造方法如果在类定义中无构造函数,在编译如果在类定义中无构造函数,在
24、编译时可缺省加入构造方法。如:时可缺省加入构造方法。如: public Apple( ) ;一旦在类中有一个自己声明的构造函一旦在类中有一个自己声明的构造函数,则缺省的构造函数将不被加到源数,则缺省的构造函数将不被加到源程序中。程序中。2024/7/24宋波,李晋,李妙妍,张悦3. 构造方法的重载构造方法的重载功能:功能:使类对象具有不同的初始值,使类对象具有不同的初始值,为对象的初始化提供方便。为对象的初始化提供方便。可以使用可以使用this调用重载的构造调用重载的构造方法。方法。2024/7/24宋波,李晋,李妙妍,张悦【例例3-10】对类对类Apple的构造方法进行重载的构造方法进行重载
25、 class Apple private String color;private int num;public Apple(String c, int n) color = c ;num = n;public Apple( String c) this(c,0); 调用两个参数的构造方法2024/7/24宋波,李晋,李妙妍,张悦class Apple private String color;private int num;public Apple( String c) this(c,0); public Apple( ) this(Unknown); 调用一个参数的构造方法2024/7/2
26、4宋波,李晋,李妙妍,张悦class Apple private String color;private int num; public String getColor() return color;public int getNum() return num; 2024/7/24宋波,李晋,李妙妍,张悦public class AppleDemo public static void main(String args) Apple applee = new Apple();System.out.println(“苹果颜色苹果颜色: ”+e.getColor(); System.out.pr
27、intln(“苹果数量苹果数量: ”+e.getNum();调用无参数:this(“Unknown”);1个参数:this(c,0);2个参数的构造方法2024/7/24宋波,李晋,李妙妍,张悦3.2 隐藏与封装隐藏与封装1.封装封装2.访问控制访问控制3.package和和import2024/7/24宋波,李晋,李妙妍,张悦3.2.1 封装封装封装,是指将封装,是指将对象的数据对象的数据与操作数据的与操作数据的方方法法相结合,通过相结合,通过方法方法将对象的数据与实现将对象的数据与实现细节保护起来。细节保护起来。在类的定义中设置访问对象属性及方法的权在类的定义中设置访问对象属性及方法的权限
28、,来限制该类对象及其他类的对象的使用限,来限制该类对象及其他类的对象的使用范围。范围。提供一个接口来描述其他对象的使用方法。提供一个接口来描述其他对象的使用方法。2024/7/24宋波,李晋,李妙妍,张悦3.2.2 访问控制访问控制私有的私有的以以private修饰符指定;修饰符指定;保护的保护的以以protected修饰符指定;修饰符指定;公开的公开的以以public修饰符指定;修饰符指定;默认的默认的,也称为,也称为default或或package不使用任何修饰符不使用任何修饰符指定。指定。2024/7/24宋波,李晋,李妙妍,张悦表表3-1:4种访问权限及其含义种访问权限及其含义可否直接
29、访问可否直接访问 同一个同一个 同一个同一个 不同包中的不同包中的 任何任何 控制等级控制等级 类中类中 包中包中 子类中子类中 场合场合private Yesdefault Yes Yesprotected Yes Yes Yespublic Yes Yes Yes Yes2024/7/24宋波,李晋,李妙妍,张悦1. private修饰符修饰符其成员只能在所在类的其成员只能在所在类的内部使用内部使用,在,在其他的类中则不允许其他的类中则不允许直接访问直接访问。同一个类的同一个类的不同对象之间不同对象之间可以访问对可以访问对方的方的private成员变量和方法;成员变量和方法;访问控制是在类
30、的级别上,而不是在对访问控制是在类的级别上,而不是在对象的级别上。象的级别上。2024/7/24宋波,李晋,李妙妍,张悦class Parent private int privateVar; private void privateMethod() System.out.println(“I am privateMethod!); class Child void accessMethod() Parent p = new Parent(); p.privateVar=100; p.privateMethod(); 类中的私有成员类中的私有成员 非法:非法:无法通过无法通过类类ParentP
31、arent的对象的对象访问它的私有成员访问它的私有成员 2024/7/24宋波,李晋,李妙妍,张悦classParentprivateintprivateVar;publicParent(intp)privateVar=p;booleanisEqualTo(ParentanotherParent)if(this.privateVar=anotherParent.privateVar)returntrue;elsereturnfalse;当前对象实例的成员变量与方法的参数传递的另一个对象实例的成员变量是否相等?2024/7/24宋波,李晋,李妙妍,张悦publicclassPrivateDemo
32、publicstaticvoidmain(Stringargs)Parentp1=newParent(20);Parentp2=newParent(40);System.out.println(p1.isEqualTo(p2);执行结果:执行结果:false2024/7/24宋波,李晋,李妙妍,张悦2. default如果一个类没有显式地设置成员的访问控制级如果一个类没有显式地设置成员的访问控制级别,则说明它使用的是别,则说明它使用的是默认的默认的访问权限,称为访问权限,称为default或或package。 允许被这个允许被这个类本身类本身,或者,或者相同包相同包中的其它类中的其它类访问其访
33、问其default成员。成员。 构造方法设置为构造方法设置为default权限时,则除这个权限时,则除这个类类本身和同一个包中的类本身和同一个包中的类以外,其他类均不能以外,其他类均不能生成该类的对象实例。生成该类的对象实例。2024/7/24宋波,李晋,李妙妍,张悦package p1;class Parent int packageVar; void packageMethod() System.out.println(“I am packageMethod!); package p1;class Child void accessMethod() Parent p = new Paren
34、t(); p.packageVar=10; p.packageMethod(); 类中的默认成员类中的默认成员 合法:合法:因为因为ChildChild与与ParentParent在同一个包中,在同一个包中,因此有权通过因此有权通过ParentParent的对象访问它的默认的对象访问它的默认成员成员 2024/7/24宋波,李晋,李妙妍,张悦3. protected修饰符修饰符允许允许类本身类本身、它的、它的子类子类、以及、以及同一个包中其余的类同一个包中其余的类访问这些访问这些成员。成员。2024/7/24宋波,李晋,李妙妍,张悦packagep1;classParentprotectedi
35、ntprotectedVar;protectedvoidprotectedMethod()System.out.println(“IamprotectedMethod);2024/7/24宋波,李晋,李妙妍,张悦packagep1;classPersonvoidaccessMethod()Personp=newPerson();p.protectedVar=100;p.protectedMethod();由于由于Person类与类与Parent在同一个包中在同一个包中所以,可以创建它的对象,并实现访问。所以,可以创建它的对象,并实现访问。2024/7/24宋波,李晋,李妙妍,张悦package
36、 p2; import p1.*; class Child extends Parent void accessMethod(Parent p, Child c) p.iamprotected = 10; c.iamprotected = 10; / 子类 p.protectedMethod(); c.protectedMethod(); / 子类 X X由于由于Child与父类与父类Parent不在同一个包中,不在同一个包中,只能通过只能通过子类子类Child的对象的对象来实现访问来实现访问 X X 2024/7/24宋波,李晋,李妙妍,张悦4. public修饰符修饰符带有带有public
37、的成员可以被所有的成员可以被所有的类访问。的类访问。 一个成员只有在被外部对象使一个成员只有在被外部对象使用后不会产生不良后果时,才用后不会产生不良后果时,才被声明为被声明为public。 2024/7/24宋波,李晋,李妙妍,张悦3.2.3 package和和import程序员可以将一组相关的类与接口包程序员可以将一组相关的类与接口包裹在一起形成一个包裹在一起形成一个包(package)。易于确定包中的类是相关的,根据功能易于确定包中的类是相关的,根据功能可找到相应的类。可找到相应的类。防止类命名混乱。防止类命名混乱。控制包中的类、接口、成员变量和方法控制包中的类、接口、成员变量和方法的可见
38、性。的可见性。 2024/7/24宋波,李晋,李妙妍,张悦1. package语句语句指定程序中的指定程序中的类类属于一个属于一个哪个包哪个包:package pkg1.pkg2.pkg3; 包定义语句在每个源程序中只能有一包定义语句在每个源程序中只能有一条,即一个类只能属于一个包条,即一个类只能属于一个包;包定义语句必须在程序的第一行包定义语句必须在程序的第一行(之之前可有空格及注释前可有空格及注释);包名用包名用“.” 分隔。分隔。2024/7/24宋波,李晋,李妙妍,张悦【例例3-13】利用利用package关键词,将类关键词,将类Circle打包到打包到 com下的下的graphics
39、包中。包中。1.package com.graphics;2.public class Circle 3. final float PI=3.14159f; / 定义一个常量定义一个常量PI4. public static void main(String args) 5. System.out.println(画一个圆形!画一个圆形!); 6. 7.包的创建包的创建2024/7/24宋波,李晋,李妙妍,张悦comgraphicspackage com.graphics;该该Java程序所定义的类程序所定义的类保存的路径为:保存的路径为:C: mypkgcomgraphicsclasspath
40、=.;c:mypkg包分隔符相当于包分隔符相当于目录分隔符目录分隔符,包存储的路径由包根,包存储的路径由包根路径加上包名指明的路径加上包名指明的路径路径组成;组成;包的根路径由包的根路径由CLASSPATH环境变量指出。环境变量指出。2024/7/24宋波,李晋,李妙妍,张悦编译和生成包编译和生成包编译之后拷贝编译之后拷贝javac Circle.javaCircle.class将将Circle.class复制复制graphics子目录下子目录下简化的编译命令简化的编译命令javac -d C:mypkg Circle.java1、生成C:mypkgcomgraphics;2、将Circle.
41、class保存到该子目录下。2024/7/24宋波,李晋,李妙妍,张悦2024/7/24宋波,李晋,李妙妍,张悦2. import语句语句功能:功能:import语语句句告告诉诉编编译译器器要要使使用用的的Java类所在的位置;类所在的位置;注意注意,包名也是类名的一部分。包名也是类名的一部分。2024/7/24宋波,李晋,李妙妍,张悦将将package 引入源程序,格式:引入源程序,格式: import 包名包名.*; import 包名包名. 类名;类名;import 语句必须在源程序之前,在语句必须在源程序之前,在package 声明之后,声明之后,Java程序的结构:程序的结构: pa
42、ckage . / package .; import . / import java.lang.*; 类声明类声明2024/7/24宋波,李晋,李妙妍,张悦3.3 类的继承与多态类的继承与多态1.类的继承类的继承2.方法的重写方法的重写3.运行时多态运行时多态4.对象类型的强制转换对象类型的强制转换5.Object类类2024/7/24宋波,李晋,李妙妍,张悦3.3.1 类的继承类的继承2024/7/24宋波,李晋,李妙妍,张悦1.1.继承其他类的类叫继承其他类的类叫子类子类,被继承的,被继承的类叫做类叫做超类超类(父类)。(父类)。2024/7/24宋波,李晋,李妙妍,张悦例例3-15:2
43、024/7/24宋波,李晋,李妙妍,张悦class Animal boolean live = true; public void eat() System.out.println( 动物需要吃食物动物需要吃食物 ); public void move() System.out.println(“动物会运动动物会运动 ); 实现步骤:实现步骤:步骤:编写父类步骤:编写父类步骤:编写子类,使用关键字步骤:编写子类,使用关键字extendsextends继继承父类承父类class Bird extends Animal String skin= “羽毛羽毛 public void move() S
44、ystem.out.println(“鸟会飞翔鸟会飞翔 ); 父类名称父类名称 子类名称子类名称2024/7/24宋波,李晋,李妙妍,张悦public classpublic class Zoo Zoo public static voidpublic static void main( main(StringString args) args) Bird bird= Bird bird=new new Bird();Bird(); bird.eat(); bird.eat(); bird.move(); bird.move(); System.out.println( System.out.
45、println(鸟有:鸟有:+bird.skin);+bird.skin); 访问父类的成员方法访问父类的成员方法 访问子类的成员方法访问子类的成员方法 【执行结果执行结果】动物需要吃食物动物需要吃食物鸟会飞翔鸟会飞翔鸟有:羽毛鸟有:羽毛2024/7/24宋波,李晋,李妙妍,张悦2. 单继承单继承Java是是单继承单继承的,即只能从一个类的,即只能从一个类继承,继承,extends后类名只能有一个。后类名只能有一个。单继承的单继承的优点优点:代码更可靠;代码更可靠;可以用接口弥补,用一个类实现多个接可以用接口弥补,用一个类实现多个接口,达到多继承效果。口,达到多继承效果。2024/7/24宋波
46、,李晋,李妙妍,张悦3. super关键字关键字super可用于访问父类中定义的属性可用于访问父类中定义的属性和成员方法;和成员方法;super可用于在子类构造方法中调用可用于在子类构造方法中调用父类的构造方法;父类的构造方法;super的追溯不仅限于直接父类。的追溯不仅限于直接父类。2024/7/24宋波,李晋,李妙妍,张悦【例例3-16】使用使用super调用父类构造方法调用父类构造方法1.classAnimal2.booleanlive=true;3.Stringskin=;4.publicAnimal(booleanl,Strings)5.live=l;6.skin=s;7.8.202
47、4/7/24宋波,李晋,李妙妍,张悦9.classBirdextendsAnimal10.publicBird(booleanl,Strings)11.super(l,s);12.13.14.publicclassZoo15.publicstaticvoidmain(Stringargs)16.Birdbird=newBird(true,羽毛);17.System.out.println(鸟有:+bird.skin);18.19.通过super调用父类的构造方法2024/7/24宋波,李晋,李妙妍,张悦注意:子类子类构造方法体的构造方法体的第一句第一句通常要调用通常要调用父父类类的一个构造方法
48、。的一个构造方法。此时,如果不使用此时,如果不使用super指定,则将调用指定,则将调用默认的父类构造方法默认的父类构造方法(即不带参数的构造即不带参数的构造方法方法)。如果在父类中没有无参构造方法,则将如果在父类中没有无参构造方法,则将产生产生编译错误编译错误。2024/7/24宋波,李晋,李妙妍,张悦子类中父类成员的隐藏子类中父类成员的隐藏子类子类隐藏隐藏父类的成员父类的成员当子类的当子类的成员变量成员变量与父类的与父类的成员变量成员变量同名时;同名时;当子类的成员方法与父类的成员方法当子类的成员方法与父类的成员方法具有相同的具有相同的名字名字、参数列表参数列表、返回值返回值类型类型;20
49、24/7/24宋波,李晋,李妙妍,张悦“隐藏隐藏”的含义的含义通过通过子类对象子类对象调用子类中与父类同名的变调用子类中与父类同名的变量和方法时,量和方法时,有效的有效的(操作操作)是是子类子类中定义中定义的变量和方法。的变量和方法。如果要在子类中访问父类中被隐藏的成员如果要在子类中访问父类中被隐藏的成员变量或方法,要使用关键词变量或方法,要使用关键词super。 2024/7/24宋波,李晋,李妙妍,张悦3.3.2 方法的重写方法的重写在子类中对从父类继承的方法进行改造,在子类中对从父类继承的方法进行改造,称为称为方法的重写方法的重写。子类中重写方法必须和父类中被重写方法具子类中重写方法必须
50、和父类中被重写方法具有相同的有相同的方法名方法名、参数列表参数列表和和返回值类型返回值类型子类中重写方法的子类中重写方法的访问权限访问权限不能缩小不能缩小子类中重写得方法子类中重写得方法不能抛出新的异常不能抛出新的异常 2024/7/24宋波,李晋,李妙妍,张悦class Animal public void cry() System.out.println(动物发出叫声!动物发出叫声!); class Dog extends Animal public void cry() System.out.println(狗发出狗发出“汪汪汪汪”声!声!); class Cat extends Ani
51、mal public void cry() System.out.println(猫发出猫发出“喵喵喵喵”声!声!); 重重写写重重写写【例例3-18】重写的示例重写的示例2024/7/24宋波,李晋,李妙妍,张悦public classpublic class Zoo Zoo public static voidpublic static void main( main(StringString args) args) Dog dog= Dog dog=newnew Dog();Dog(); System.out.println( System.out.println(“执行执行dog.cr
52、y()dog.cry()语句时的语句时的执行结果是:执行结果是:);); dog.cry(); dog.cry(); Cat cat=Cat cat=newnew Cat();Cat(); System.out.println( System.out.println(“执行执行cat.cry()cat.cry()语句时的语句时的 执行结果是:执行结果是:);); cat.cry(); cat.cry(); 访问子类访问子类DogDog的重写后的成员方法的重写后的成员方法 访问子类访问子类CatCat的重写后的成员方法的重写后的成员方法【执行结果执行结果】执行执行dog.cry(); dog.c
53、ry(); 语句时地执行结果是:语句时地执行结果是:狗发出汪汪声!狗发出汪汪声!执行执行cat.cry(); cat.cry(); 语句时地执行结果是:语句时地执行结果是:猫发出喵喵声!猫发出喵喵声!2024/7/24宋波,李晋,李妙妍,张悦3.3.3 运行时多态运行时多态多态性多态性(Polymorphism)指在一个程序中指在一个程序中相同相同名字的成员变量和方法可以表示名字的成员变量和方法可以表示不同不同的实现。的实现。 方法重载:静态多态性,或称编译时多态;方法重载:静态多态性,或称编译时多态;方法重写方法重写(覆盖覆盖):动态多态性;:动态多态性;变量覆盖:子类可以隐藏与父类中的同名
54、成变量覆盖:子类可以隐藏与父类中的同名成员变量。员变量。2024/7/24宋波,李晋,李妙妍,张悦1. 上溯造型上溯造型通过引用通过引用子类的实例子类的实例来调用父类的来调用父类的方法,从而将方法,从而将一种类型一种类型(子类子类)对象的对象的引用转换成引用转换成另一种类型另一种类型(父类父类)对象的对象的引用。引用。Animal a1=new Parrot();Animal a1=new Parrot();Animal a2=new Dog();Animal a2=new Dog();Animal a3=new Cat();Animal a3=new Cat();2024/7/24宋波,李晋
55、,李妙妍,张悦2. 运行时多态运行时多态通过一个父类变量发出的方法调用:通过一个父类变量发出的方法调用:该方法在父类中的实现该方法在父类中的实现该方法在某个子类中的实现该方法在某个子类中的实现只能在运行时,根据该变量指只能在运行时,根据该变量指向的对象类型确定向的对象类型确定2024/7/24宋波,李晋,李妙妍,张悦/*定义父类定义父类Animal*/import java.util.*;class Animal void cry( ) void move( ) /*定定Animal的子类的子类Parrot*/class Parrot extends Animal void cry() Sys
56、tem.out.println(狗发出汪汪声!狗发出汪汪声!); void move() System.out.println(小狗正在奔跑!小狗正在奔跑!); /*动物类动物类Animal的子类的子类Dog*/class Dog extends Animal void cry() System.out.println(狗发出汪汪声!狗发出汪汪声!); void move() System.out.println(小狗正在奔跑!小狗正在奔跑!); class Cat extends Animal /*定义定义Animal的子类的子类Cat*/ void cry() System.out.pri
57、ntln(猫发出喵喵声!猫发出喵喵声!); void move() System.out.println(小猫正在爬行!小猫正在爬行!); 子类重写子类重写父类父类AnimalAnimal的成员方法的成员方法 子类重写子类重写父类父类AnimalAnimal的成员方法的成员方法 子类重写子类重写父类父类AnimalAnimal的成员方法的成员方法 public class Zoo static void animalsCry(Animal aa) for(int i=0;iaa.length;i+) aai.cry(); public static void main(String args)
58、 Random rand=new Random();Animal a=new Animal8;for(int i=0;ia.length;i+) switch(rand.nextInt(3) case 0:ai=new Parrot();break; case 1:ai=new Dog();break; case 2:ai=new Cat();break; animalsCry(a); 父类变量父类变量aiai指向指向子类对象子类对象DogDog或或CatCat。aai.cryaai.cry调用的为调用的为DogDog或或CatCat类类的的cry()cry()方法方法2024/7/24宋波,
59、李晋,李妙妍,张悦3.3.4 对象类型的强制转换对象类型的强制转换下溯造型下溯造型 将父类类型的引用转换为子类将父类类型的引用转换为子类类型,称为下溯造型;类型,称为下溯造型;下溯造型不一定是安全的,需下溯造型不一定是安全的,需要进行类型检查。要进行类型检查。2024/7/24宋波,李晋,李妙妍,张悦1.instanceof运算符 instanceof boolean表达式左侧是右侧给出的类型或子左侧是右侧给出的类型或子类型时,表达式为类型时,表达式为true2024/7/24宋波,李晋,李妙妍,张悦classCatextendsAnimalclassDogextendsAnimalpubli
60、cclassTestInstanceofpublicvoiddoSomething(Animala)if(ainstanceofCat)System.out.println(ThisisaCat);使用instanceof方法测试接收的对象是否是Cat类或其子类2024/7/24宋波,李晋,李妙妍,张悦2. 强制类型转换强制类型转换(SomeClass) aObjectVariable父类弱、子类强,指向父类的引用不能直接父类弱、子类强,指向父类的引用不能直接按子类引用,必须要强制类型转换后才能作按子类引用,必须要强制类型转换后才能作为子类的引用使用。为子类的引用使用。强制转换之前,一般先用强
61、制转换之前,一般先用instanceof对对象对对象的类型进行测试。的类型进行测试。2024/7/24宋波,李晋,李妙妍,张悦1.classAnimal2.Stringskin;3.4.classBirdextendsAnimal5.Stringskin=羽毛;6.publicStringgetSkin()7.returnskin;8.9.10.publicclassCasting11.publicvoidsomeMethod(Animala)12.System.out.println(a.getSkin();13.if(ainstanceofBird)14.Birdb=(Bird)a;15.
62、System.out.println(b.getSkin();16.17.非法:使用父类变量非法:使用父类变量a a调用子类成员方法调用子类成员方法强制类型转换强制类型转换合法合法2024/7/24宋波,李晋,李妙妍,张悦3.3.5 Object类类Object定义了所有对象都需要的状态定义了所有对象都需要的状态和行为。例如:和行为。例如:对象之间的比较对象之间的比较将对象转换为字符串将对象转换为字符串等待某个条件变量等待某个条件变量当某条件变量改变时通知相关对象当某条件变量改变时通知相关对象返回对象的类返回对象的类2024/7/24宋波,李晋,李妙妍,张悦1.equals方法equals方法
63、方法用于判别某个指定对象与当前对象(调用于判别某个指定对象与当前对象(调用用equals方法的对象)是否等价;方法的对象)是否等价;“数据等价数据等价”:两个数据的值相等:两个数据的值相等引用类型数据比较的是引用引用类型数据比较的是引用基本数据类型比较值基本数据类型比较值2024/7/24宋波,李晋,李妙妍,张悦equals与“=”运算符equals( )方法只能比较引用类型;方法只能比较引用类型;“=”可以比较引用和基本类型;可以比较引用和基本类型;equals( )方法对方法对File、String、Date及封装类及封装类(Wrapper Class),是比较类,是比较类型内容,而不考虑
64、引用的是否是同一型内容,而不考虑引用的是否是同一个实例;个实例;2024/7/24宋波,李晋,李妙妍,张悦publicclassTestEqualspublicstaticvoidmain(Stringargs)Strings1=newString(Hello);Strings2=newString(Hello);if(s1=s2)System.out.println(s1=s2);elseSystem.out.println(s1!=s2);/输出:s1!=s22024/7/24宋波,李晋,李妙妍,张悦if(s1.equals(s2)System.out.println(“s1isequal
65、tos2);elseSystem.out.println(“s1isnotequaltos2); /输出:s1isequaltos2s2=s1;if(s1=s2)System.out.println(“s1=s2);elseSystem.out.println(“s1!=s2);/输出:s1=s22024/7/24宋波,李晋,李妙妍,张悦2.toString方法Object类类中中实实现现的的toString( )方方法法是是返返回回当前对象的类型和内存地址信息。当前对象的类型和内存地址信息。但但在在一一些些子子类类(如如String、Date等等)中中进进行行了了重重写写。在在用用户户自自定
66、定义义类类中中通通常常都都将将该该方方法重写,以返回更适用的信息。法重写,以返回更适用的信息。2024/7/24宋波,李晋,李妙妍,张悦3.4 数组数组1.一维数组一维数组2.多维数组多维数组3.数组的复制数组的复制2024/7/24宋波,李晋,李妙妍,张悦Java中数组的分类中数组的分类JavaJava中的数组中的数组一维数组一维数组多维数组多维数组一维数组的定义一维数组的定义一维数组的初始化一维数组的初始化一维数组的引用一维数组的引用二维数组的定义二维数组的定义二维数组的初始化二维数组的初始化二维数组的引用二维数组的引用2024/7/24宋波,李晋,李妙妍,张悦3.4.1 一维数组一维数组
67、1.定义:定义:type arrayName 或或type arrayName类型类型(type)可以为可以为Java中任意的数据类中任意的数据类型,包括型,包括简单类型简单类型和和复合类复合类如:如:int intArray ; Date dateArray;2024/7/24宋波,李晋,李妙妍,张悦注意:注意:在声明数组时不能指定其长度:在声明数组时不能指定其长度:int a5; / 不合法不合法原因:原因:声明数组,只是在内存中为该类型声明数组,只是在内存中为该类型数组变量分配数组变量分配引用空间引用空间,并没有为并没有为数组中每个元素分配数组中每个元素分配数据空间数据空间。2024/7
68、/24宋波,李晋,李妙妍,张悦2. 数组的创建数组的创建arrayName=dataTypearraySize3. 数组的长度数组的长度arrayName.length;2024/7/24宋波,李晋,李妙妍,张悦4. 静态初始化静态初始化声明并创建了一个长度声明并创建了一个长度为为 3 的的double型的数组型的数组double d = 3.14, 2.718, 10.0 ;String s =“Hello, “my, “Java;声明并创建了一个长度声明并创建了一个长度为为 3 的的 String 型的数组型的数组d0=3.14;d1=2.718;d2=10.0s0= Hello s1=
69、my s2= Java静态初始化:在声明一个数组的同时,静态初始化:在声明一个数组的同时,对该数组中每个元素进行赋值对该数组中每个元素进行赋值2024/7/24宋波,李晋,李妙妍,张悦5. 动态初始化动态初始化在声明在声明( (创建创建) )一个数组类型对象一个数组类型对象时,只为其分配空间,而不同时时,只为其分配空间,而不同时对其中的各元素赋值。对其中的各元素赋值。new dataTypearraySize;new dataTypearraySize;2024/7/24宋波,李晋,李妙妍,张悦简单类型:简单类型:int a ;a=new int3;a0=1;a1=2;a2=3;声明数组变量a
70、,为其分配定长的引用空间(值为null)1. 创建一个含有创建一个含有3个元素的个元素的int型数型数组对象;组对象;2. 为为a分配分配3个个int型数据空间型数据空间3. 将将3个元素值初始化为个元素值初始化为0 nulla0x2a567ba0000x2a567b3212024/7/24宋波,李晋,李妙妍,张悦引用类型:引用类型:nulls0x2473c4snullnullnull0x2473c4String s ;s=new String3;S0S1S2地址值地址值2024/7/24宋波,李晋,李妙妍,张悦引用类型:引用类型:0x2473c4s0x478b520x2473c4s0=new
71、 String(“Hello);s1=new String(“my);s2=new String(“Java);S0S1S20x478b680x478b3c“my“Java0x4d78c9He.2024/7/24宋波,李晋,李妙妍,张悦6. 数组元素的引用数组元素的引用数组元素的引用方式为:数组元素的引用方式为: arrayNameindexindex为数组下标,它可以为整型常数为数组下标,它可以为整型常数或表达式,下标从或表达式,下标从0开始。开始。每个数组都有一个属性每个数组都有一个属性length指明它的指明它的长度。长度。2024/7/24宋波,李晋,李妙妍,张悦【例例3-24】3.i
72、ntanArray; 4.anArray=newint10; 5.for(inti=0;ianArray.length;i+)6.anArrayi=i;7.System.out.print(anArrayi+);8.声明数组声明数组创建长度为创建长度为10的的数组数组数组的长度数组的长度为每个数组元素赋值为每个数组元素赋值2024/7/24宋波,李晋,李妙妍,张悦3.4.2 二维数组二维数组1.定义:定义: type arrayName ; 或或 type arrayName;类型类型(type)可以为可以为Java中任意的数据类型,中任意的数据类型,包括简单类型和复合类包括简单类型和复合类
73、例如:例如: int intArray ; Date dateArray;2024/7/24宋波,李晋,李妙妍,张悦示例:示例:inta=newint45;将创建一个有将创建一个有 4 个数组的数组,每个数组的数组,每个数组中又有个数组中又有 5 个整数,即个整数,即 4 行行 5 列的整数矩阵。列的整数矩阵。2024/7/24宋波,李晋,李妙妍,张悦静态初始化静态初始化int a = 2,3, 1,5, 3,4;a00=2 a01=3a10=1 a11=5a20=3 a21=42 31 53 42024/7/24宋波,李晋,李妙妍,张悦静态初始化静态初始化int a = 1,2, 3,4,0
74、,9, 5,6,7;a00=1 a01=2a10=3 a11=4a12=0 a13=9a20=5 a21=6a22=71 23 4 0 95 6 72024/7/24宋波,李晋,李妙妍,张悦二维数组的动态初始化二维数组的动态初始化inta;a=newint3;a0=newint2;a1=newint4;a2=newint3;1 23 4 0 95 6 72024/7/24宋波,李晋,李妙妍,张悦正确的说明示例:正确的说明示例:inta1=newint23;inta2=newint2;inta3=newint46;将创建一个有将创建一个有 2 个数组的数组,个数组的数组,每个数组中又有每个数组中
75、又有 3 个整数,即个整数,即 2 行行 3 列的整数矩阵列的整数矩阵2024/7/24宋波,李晋,李妙妍,张悦错误的说明示例错误的说明示例int errarr123;不允许静态不允许静态说明数组说明数组数组维数说明顺序应数组维数说明顺序应从高维到低维从高维到低维数组维数的指定只能在数组维数的指定只能在new运算符之后运算符之后int errarr2 = new int 4;int errarr3 4 = new int 34;2024/7/24宋波,李晋,李妙妍,张悦0x2473c4a0x478b520x2473c4int a ;a=new int33;a0a1a20x478b680x478
76、b3c0x4d78c90a00a01a02000a20 a21a22002024/7/24宋波,李晋,李妙妍,张悦【例例3-25】intaMatrix=newint3;将创建一个有将创建一个有 3 个数组的数组,每个数个数组的数组,每个数组中又有组中又有 0ai.lengh-1个整数,即个整数,即 3 行行0ai.lengh-1列的整数矩阵列的整数矩阵2024/7/24宋波,李晋,李妙妍,张悦for(inti=0;iaMatrix.length;i+)for(intj=0;jaMatrixi.length;j+)aMatrixij=i+j;控制矩阵的行数控制矩阵的行数给每个数组元素赋值给每个数
77、组元素赋值aMatrixi=newint4;创建每个列数组,每创建每个列数组,每个数组有个数组有4个元素个元素2024/7/24宋波,李晋,李妙妍,张悦for(inti=0;iaMatrix.length;i+)for(intj=0;jaMatrixi.length;j+)System.out.print(aMatrixij+);System.out.println();/换行2024/7/24宋波,李晋,李妙妍,张悦3.4.3 数组的复制数组的复制数组变量之间的赋值是引用赋值,不能数组变量之间的赋值是引用赋值,不能实现数组数据的复制:实现数组数据的复制:int a =new int3;int
78、 b ;b=a;0x4a678ba00x4a678ba0a1a2000x4a678bb2024/7/24宋波,李晋,李妙妍,张悦数组的复制数组的复制publicstaticvoidarraycopy(Objectsrc,intsrc_position,Objectdst,intdst_position,intlength)2024/7/24宋波,李晋,李妙妍,张悦本章小结本章小结本章围绕本章围绕OOP三个基本特征:三个基本特征:封装、继承、多态封装、继承、多态全面介绍了全面介绍了Java中:中:类的结构与定义类的结构与定义对象的创建、使用与清除对象的创建、使用与清除类的继承与多态类的继承与多态理解并掌握数组的定义理解并掌握数组的定义2024/7/24宋波,李晋,李妙妍,张悦