
Java程序设计电子课件.ppt
124页《《JavaJava程序设计程序设计》》电子课件电子课件宋波,李晋,李妙妍,张悦宋波,李晋,李妙妍,张悦2024/8/30宋波,李晋,李妙妍,张悦第第1篇篇 核心基础核心基础篇篇第第 3 3 章章 JavaJava面向对象特性面向对象特性2024/8/30宋波,李晋,李妙妍,张悦本章内容本章内容3.1 类与与对象象3.2 隐藏和封装藏和封装3.3 类的的继承与多承与多态3.4 数数组2024/8/30宋波,李晋,李妙妍,张悦学习目标学习目标1.掌握掌握对象与象与类的基本概念的基本概念2.了解了解对象的生命周期象的生命周期3.熟熟练掌握掌握类的定的定义及及实例化例化4.理解理解隐藏与封装藏与封装5.熟熟练掌握掌握类的的继承与多承与多态6.掌握数掌握数组的的应用用2024/8/30宋波,李晋,李妙妍,张悦本章概要本章概要1.Java中中类类和和对对象的定象的定义义;;2.Java对对OOP三个主要特性三个主要特性——封装、封装、继继承和多承和多态态的支持机制;的支持机制;3.Java中的中的对对象数象数组这组这种数据种数据结结构2024/8/30宋波,李晋,李妙妍,张悦3.1 类与对象类与对象1.类与与对象的定象的定义2.成成员变量与局部量与局部变量量3.成成员方法方法4.对象的象的创建建5.对象的使用象的使用6.对象的消除象的消除7.方法重方法重载8.this9.构造方法构造方法2024/8/30宋波,李晋,李妙妍,张悦3.1.1 类和对象的定义类和对象的定义•Java程序是由程序是由一个或若干个一个或若干个类组成,成,类是是Java程序的程序的基本基本组成成单位位,包,包括:括:Ø成员变量:描述对象的属性成员变量:描述对象的属性Ø成员方法:描述对象的行为成员方法:描述对象的行为2024/8/30宋波,李晋,李妙妍,张悦类定义的结构类定义的结构2024/8/30宋波,李晋,李妙妍,张悦1. 类的声明格式类的声明格式 [public] [abstract | final] class
方法 2024/8/30宋波,李晋,李妙妍,张悦3.1.2 成员变量与局部变量成员变量与局部变量•成成员变量(量(类):):Ø在类体中声明的变量,且不属于任何在类体中声明的变量,且不属于任何一个方法时一个方法时 •局部局部变量:量:Ø在方法体中声明的变量以及方法的参在方法体中声明的变量以及方法的参数则统称为方法的局部变量数则统称为方法的局部变量 2024/8/30宋波,李晋,李妙妍,张悦【例3-1】成员变量示例public class Apple { public String color; // 公共变量color public static int num; // 静态变量num public final boolean MATURE=true; // 常量MATURE并赋值 public static void main(String[ ] args) { System.out.println("苹果数量:"+Apple.num); Apple apple=new Apple(); System.out.println("苹果颜色:"+apple.color); System.out.println("苹果是否成熟:"+apple.MATURE); }}num是类变量(即静态变量),可通过类名直接访问是类变量(即静态变量),可通过类名直接访问2024/8/30宋波,李晋,李妙妍,张悦2. 局部变量局部变量[final]
变量•生命周期:生命周期:Ø指从声明一个变量并指从声明一个变量并分配内存空间分配内存空间、、使使用变量开始用变量开始,然后,然后释放释放该变量并该变量并清除清除所所占用内存空间的一个占用内存空间的一个过程过程3. 变量的有效范围变量的有效范围2024/8/30宋波,李晋,李妙妍,张悦•变量的种量的种类::①①成员变量成员变量——类体中声明的成员类体中声明的成员变量在整个类中有效变量在整个类中有效②②局部变量局部变量——在方法内或方法内在方法内或方法内的复合代码块的复合代码块(方法内部,方法内部,“{”与与“}”之间的代码之间的代码)声明的变量声明的变量2024/8/30宋波,李晋,李妙妍,张悦【【例例3-3】】变量的有效范围变量的有效范围 1.public class Olympics1 {2. private int medal_All=800;3. public void China() {4. int medal_CN=100;5. if(medal_CN<1000) {6. int gold=50;7. medal_CN+=30;8. medal_All-=130;9. }10. }11.}成员变量成员变量代码块外、方法代码块外、方法体内的局部变量体内的局部变量代码块的局部变量代码块的局部变量允许访问本方法的允许访问本方法的局部变量局部变量 允许访问本类的成员变量允许访问本类的成员变量 2024/8/30宋波,李晋,李妙妍,张悦3.1.3 成员方法成员方法2024/8/30宋波,李晋,李妙妍,张悦注意:注意:①①方法体中定方法体中定义的的局部局部变量量的作用域只的作用域只在方法内部;在方法内部;②②如果局部如果局部变量的名字和量的名字和类的成的成员变量量名字相同,名字相同,则类的成的成员变量量被屏蔽;被屏蔽;③③如果要在方法中使如果要在方法中使类的成的成员变量有效,量有效,则可以使用可以使用this关关键字。
字2024/8/30宋波,李晋,李妙妍,张悦public class Olympics2 { private int gold=0; private int silver=0;private int copper=0;public void changeModel(int a,int b,int c) { gold=a; // 给类的成员变量赋值 int silver= b; // 使同名类成员变量silver隐藏 int copper= 50; // 使同名类成员变量copper隐藏 System.out.println(“In changModel:”+“金牌 =”+gold+“ 银牌=”+silver+“ 铜牌"+copper); this.copper=c; // 给类成员变量z赋值}2024/8/30宋波,李晋,李妙妍,张悦String getModel( ) {return “金牌 = ”+gold+“ 银牌 =”+silver+“ 铜牌="+copper;}2024/8/30宋波,李晋,李妙妍,张悦public static void main( String args[ ]) { Olympics2 o2=new Olympics2( ); System.out.println("Before changModel:"+o2.getModel()); o2.changeModel(100,100,100);System.out.println("After changeModel:"+o2.getModel());}}Befor changModel: 金牌=0 银牌=0 铜牌=0gold=100 silver=100 copper=50In changModel: 金牌=100 银牌=100 铜牌=50After changModel: 金牌=100 银牌=0 铜牌=100如果在方法中对成员变量的值进行了修改,则这种修改将是永久的。
gold=0 silver=0 copper=02024/8/30宋波,李晋,李妙妍,张悦3.1.4 对象的创建对象的创建•一个一个对象的生命周期包括三个象的生命周期包括三个阶段:段:①①对象的创建对象的创建②②对象的使用对象的使用③③对象的消除对象的消除 2024/8/30宋波,李晋,李妙妍,张悦创建对象创建对象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/8/30宋波,李晋,李妙妍,张悦Point pt = new Point(2,3);2024/8/30宋波,李晋,李妙妍,张悦3.1.5 对象的使用对象的使用1.引用对象的变量引用对象的变量•objectReference.variableName;2.调用对象的方法调用对象的方法•objectReference.methodName(argumentList)2024/8/30宋波,李晋,李妙妍,张悦【【例例3-6】】对象使用的示例对象使用的示例 1.public class Point {2. int x=1;3. int y=1;4. public void setXY(int x,int y) { … … }5. public int getXY() { … … }6. public static void main(String[ ] args) {7.Point pt=new Point(); 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/8/30宋波,李晋,李妙妍,张悦3.1.6 对象的消除对象的消除•在在C++中中,程序员要显式地删除不用的对,程序员要显式地删除不用的对象,即手动释放对象占用的存储空间。
象,即手动释放对象占用的存储空间 •Java提供了垃圾回收提供了垃圾回收(garbage collection)机制机制:自动判断对象是否还在:自动判断对象是否还在使用,并自动销毁不再使用的对象,回收使用,并自动销毁不再使用的对象,回收对象所占用的资源对象所占用的资源 2024/8/30宋波,李晋,李妙妍,张悦Java垃圾回收器执行机制的生命周期垃圾回收器执行机制的生命周期2024/8/30宋波,李晋,李妙妍,张悦3.1.7 方法的重载方法的重载•在同一个类中定义了多个在同一个类中定义了多个同名而内容同名而内容不同不同的成员方法的成员方法 classScreen {public void print( int i) { … }public void print( float i) { … }public void print( int i, String str ) { … }}2024/8/30宋波,李晋,李妙妍,张悦方法重载方法重载•原原则::Ø参数表必须不同:参数表必须不同:①①方法参数的个数不同方法参数的个数不同②②参数类型不同参数类型不同Ø返回类型、修饰符返回类型、修饰符Ø返回类型返回类型2024/8/30宋波,李晋,李妙妍,张悦【例3-7】方法重载的示例 1.public class Calculate {2. final float PI=3.14159f;3. public float getArea(float r) { 4. return PI*r*r;5. }6. public float getArea(float l,float w) { 7. return l*w;8. }9. public void draw(int num) { 10. System.out.println("画"+num+"个任意形状的图形");11. }12. public void draw(String shape) { 13. System.out.println("画一个"+shape);14. }方法重载方法重载方法重载方法重载2024/8/30宋波,李晋,李妙妍,张悦15. public static void main(String[] args) {16. Calculate c=new Calculate(); //创建Calculate类的对象17.float l=20;18.float w=40;19.System.out.println("求长为"+l+"宽为"+w+"的矩形面积是:"+c.getArea(l,w));20.float r=6;21.System.out.println("求半径为"+r+"的圆形面积是:"+c.getArea(r));22. int num=8;23. c.draw(num);24. c.draw(“矩形”);25. }26.}通过传递的参数判通过传递的参数判断调用哪个方法断调用哪个方法通过传递的参数判通过传递的参数判断调用哪个方法断调用哪个方法2024/8/30宋波,李晋,李妙妍,张悦3.1.8 关键词关键词this•用来指向对象自身用来指向对象自身 Ø用来访问当前对象的数据成员用来访问当前对象的数据成员;Ø用来访问当前对象的成员方法用来访问当前对象的成员方法;Ø重载构造方法时,用来引用同类的重载构造方法时,用来引用同类的其他构造方法。
其他构造方法2024/8/30宋波,李晋,李妙妍,张悦【例3-8】this关键字的使用 1.public class Fruit {2.String color="绿色";3.double price;4.int num;5.……14.public double count(double price, int num) {15. this.price=price; 16. this.num=num; 17. return price*num;18.}19.……23.}成员变量成员变量将参数值赋值给成员变将参数值赋值给成员变量,即指向对象自身量,即指向对象自身2024/8/30宋波,李晋,李妙妍,张悦3.1.9 类的构造方法类的构造方法•功能:功能:初始化类的成员变量初始化类的成员变量•特点:特点:①①名称必须与类名相同名称必须与类名相同②②不能有返回值不能有返回值③③必须用必须用new自动调用自动调用2024/8/30宋波,李晋,李妙妍,张悦【例3-9】在类Apple中定义两个构造方法 1.public class Apple {2. private int num; 3. private double price;4. public Apple() {5.num=10;6.price=2.34;7. }8. public Apple(int num,double price) {9.this.num=num;10.this.price=price;11. }12.……16. public static void main(String args[]){17. Apple a1=new Apple();18. Apple a2=new Apple(50,3.15)19. ……21. }22.}参参数数化化构构造造方方法法2024/8/30宋波,李晋,李妙妍,张悦2. 缺省构造方法缺省构造方法•如果在如果在类定定义中无构造函数,在中无构造函数,在编译时可缺省加入构造方法。
如:可缺省加入构造方法如:Ø public Apple( ) { };•一旦在一旦在类中有一个自己声明的构造函中有一个自己声明的构造函数,数,则缺省的构造函数将不被加到源缺省的构造函数将不被加到源程序中2024/8/30宋波,李晋,李妙妍,张悦3. 构造方法的重载构造方法的重载•功能:功能:Ø使类对象具有不同的初始值,使类对象具有不同的初始值,为对象的初始化提供方便为对象的初始化提供方便•可以使用可以使用this调用重载的构造调用重载的构造方法2024/8/30宋波,李晋,李妙妍,张悦【【例例3-10】】对类Apple的构造方法的构造方法进行重行重载 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/8/30宋波,李晋,李妙妍,张悦class Apple {private String color;private int num;……public Apple( String c) { this(c,0); }public Apple( ) { this("Unknown"); }}调用一个参数的构造方法2024/8/30宋波,李晋,李妙妍,张悦class Apple {private String color;private int num; ……public String getColor() {return color;}public int getNum() {return num;} }2024/8/30宋波,李晋,李妙妍,张悦public class AppleDemo {public static void main(String[ ] args) {Apple applee = new Apple();System.out.println(“苹果苹果颜色色: ”+e.getColor()); System.out.println(“苹果数量苹果数量: ”+e.getNum());}}调用无参数:this(“Unknown”); —〉1个参数:this(c,0);—〉2个参数的构造方法2024/8/30宋波,李晋,李妙妍,张悦3.2 隐藏与封装隐藏与封装1.封装封装2.访问控制控制3.package和和import2024/8/30宋波,李晋,李妙妍,张悦3.2.1 封装封装•封装,是指将封装,是指将对象的数据对象的数据与操作数据的与操作数据的方方法法相结合,通过相结合,通过方法方法将对象的数据与实现将对象的数据与实现细节保护起来。
细节保护起来 Ø在类的定义中设置访问对象属性及方法的权在类的定义中设置访问对象属性及方法的权限,来限制该类对象及其他类的对象的使用限,来限制该类对象及其他类的对象的使用范围Ø提供一个接口来描述其他对象的使用方法提供一个接口来描述其他对象的使用方法2024/8/30宋波,李晋,李妙妍,张悦3.2.2 访问控制访问控制①①私有的私有的——以以private修饰符指定;修饰符指定;②②保护的保护的——以以protected修饰符指定;修饰符指定;③③公开的公开的——以以public修饰符指定;修饰符指定;④④默认的默认的,也称为,也称为default或或package——不使用任何修饰符不使用任何修饰符指定2024/8/30宋波,李晋,李妙妍,张悦表表3-1::4种访问权限及其含义种访问权限及其含义可否直接访问可否直接访问 同一个同一个 同一个同一个 不同包中的不同包中的 任何任何 控制等级控制等级 类中类中 包中包中 子类中子类中 场合场合private Yesdefault Yes Yesprotected Yes Yes Yespublic Yes Yes Yes Yes2024/8/30宋波,李晋,李妙妍,张悦1. private修饰符修饰符•其成员只能在所在类的其成员只能在所在类的内部使用内部使用,在,在其他的类中则不允许其他的类中则不允许直接访问直接访问。
•同一个类的同一个类的不同对象之间不同对象之间可以访问对可以访问对方的方的private成员变量和方法;成员变量和方法;Ø访问控制是在类的级别上,而不是在对访问控制是在类的级别上,而不是在对象的级别上象的级别上2024/8/30宋波,李晋,李妙妍,张悦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(); }} 类中的私有成员类中的私有成员 非法:非法:无法通过无法通过类类ParentParent的对象的对象访问它的私有成员访问它的私有成员 2024/8/30宋波,李晋,李妙妍,张悦class Parent { private int privateVar; public Parent( int p) { privateVar=p; } boolean isEqualTo(Parent anotherParent) { if (this. privateVar==anotherParent.privateVar) return true; else return false; }}•当前对象实例的成员变量与方法的参数传递的另一个对象实例的成员变量是否相等?2024/8/30宋波,李晋,李妙妍,张悦public class PrivateDemo { public static void main(String args[ ]) { Parent p1=new Parent(20); Parent p2=new Parent(40); System.out.println(p1.isEqualTo(p2)); }}执行结果:执行结果:false2024/8/30宋波,李晋,李妙妍,张悦2. default•如果一个类没有显式地设置成员的访问控制级如果一个类没有显式地设置成员的访问控制级别,则说明它使用的是别,则说明它使用的是默认的默认的访问权限,称为访问权限,称为default或或package。
①①允许被这个允许被这个类本身类本身,或者,或者相同包相同包中的其它类中的其它类访问其访问其default成员 ②②构造方法设置为构造方法设置为default权限时,则除这个权限时,则除这个类类本身和同一个包中的类本身和同一个包中的类以外,其他类均不能以外,其他类均不能生成该类的对象实例生成该类的对象实例2024/8/30宋波,李晋,李妙妍,张悦package p1;class Parent{ int packageVar; void packageMethod() { System.out.println(“I am packageMethod!"); } }package p1;class Child{ void accessMethod() { Parent p = new Parent(); p.packageVar=10; p.packageMethod(); }} 类中的默认成员类中的默认成员 合法:合法:因为因为ChildChild与与ParentParent在同一个包中,在同一个包中,因此有权通过因此有权通过ParentParent的对象访问它的默认的对象访问它的默认成员成员 2024/8/30宋波,李晋,李妙妍,张悦3. protected修饰符修饰符•允许允许类本身类本身、它的、它的子类子类、以及、以及同一个包中其余的类同一个包中其余的类访问这些访问这些成员。
成员2024/8/30宋波,李晋,李妙妍,张悦package p1; class Parent { protected int protectedVar; protected void protectedMethod( ) { System.out.println(“I am protectedMethod"); } } 2024/8/30宋波,李晋,李妙妍,张悦package p1; class Person { void accessMethod() { Person p = new Person(); p.protectedVar = 100; p.protectedMethod(); }} •由于由于Person类与类与Parent在同一个包中在同一个包中•所以,可以创建它的对象,并实现访问所以,可以创建它的对象,并实现访问2024/8/30宋波,李晋,李妙妍,张悦packagep2;importp1.*;classChildextendsParent{voidaccessMethod(Parentp,Childc){p.iamprotected=10;c.iamprotected=10;//子类p.protectedMethod();c.protectedMethod();//子类}}X•由于由于Child与父类与父类Parent不在同一个包中,不在同一个包中,只能通过只能通过子类子类Child的对象的对象来实现访问来实现访问√X√2024/8/30宋波,李晋,李妙妍,张悦4. public修饰符修饰符•带有带有public的成员可以被所有的成员可以被所有的类访问。
的类访问• 一个成员只有在被外部对象使一个成员只有在被外部对象使用后不会产生不良后果时,才用后不会产生不良后果时,才被声明为被声明为public 2024/8/30宋波,李晋,李妙妍,张悦3.2.3 package和和import•程序员可以将一组相关的类与接口包程序员可以将一组相关的类与接口包裹在一起形成一个包裹在一起形成一个包(package)Ø易于确定包中的类是相关的,根据功能易于确定包中的类是相关的,根据功能可找到相应的类可找到相应的类Ø防止类命名混乱防止类命名混乱Ø控制包中的类、接口、成员变量和方法控制包中的类、接口、成员变量和方法的可见性的可见性 2024/8/30宋波,李晋,李妙妍,张悦1. package语句语句•指定程序中的指定程序中的类属于一个属于一个哪个包哪个包::Øpackage pkg1[.pkg2.[pkg3…]]; ①①包定义语句在每个源程序中只能有一包定义语句在每个源程序中只能有一条,即一个类只能属于一个包条,即一个类只能属于一个包;②②包定义语句必须在程序的第一行包定义语句必须在程序的第一行(之之前可有空格及注释前可有空格及注释);③③包名用包名用“.” 分隔。
分隔2024/8/30宋波,李晋,李妙妍,张悦【【例例3-13】】利用利用package关关键词,将,将类Circle打包到打包到 com下的下的graphics包中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/8/30宋波,李晋,李妙妍,张悦comgraphicspackage com.graphics;该该Java程序所定义的类程序所定义的类保存的路径为:保存的路径为:C:\ mypkg\com\graphicsclasspath=.;c:\mypkg•包分隔符相当于包分隔符相当于目录分隔符目录分隔符,包存储的路径由包根,包存储的路径由包根路径加上包名指明的路径加上包名指明的路径路径组成;组成;•包的根路径由包的根路径由CLASSPATH环境变量指出。
环境变量指出2024/8/30宋波,李晋,李妙妍,张悦编译和生成包编译和生成包•编译之后拷之后拷贝Øjavac Circle.java→Circle.classØ将将Circle.class复制复制graphics子目录下子目录下•简化的化的编译命令命令Øjavac -d C:\mypkg Circle.java1、生成C:\mypkg\com\graphics;2、将Circle.class保存到该子目录下2024/8/30宋波,李晋,李妙妍,张悦2024/8/30宋波,李晋,李妙妍,张悦2. import语句语句•功能:功能:Øimport语语句句告告诉诉编编译译器器要要使使用用的的Java类所在的位置;类所在的位置;Ø注意注意,包名也是类名的一部分包名也是类名的一部分2024/8/30宋波,李晋,李妙妍,张悦•将将package 引入源程序,格式:引入源程序,格式: import 包名包名.*;; import 包名包名. 类名;名;•import 语句必句必须在源程序之前,在在源程序之前,在package 声明之后,声明之后,Java程序的程序的结构:构: [package …..] // package .; [import ….] // import java.lang.*; [类声明声明…]2024/8/30宋波,李晋,李妙妍,张悦3.3 类的继承与多态类的继承与多态1.类的的继承承2.方法的重写方法的重写3.运行运行时多多态4.对象象类型的型的强制制转换5.Object类2024/8/30宋波,李晋,李妙妍,张悦3.3.1 类的继承类的继承2024/8/30宋波,李晋,李妙妍,张悦1.1.继承其他类的类叫继承其他类的类叫子类子类,被继承的,被继承的类叫做类叫做超类超类(父类)。
父类)2024/8/30宋波,李晋,李妙妍,张悦例例3-15::2024/8/30宋波,李晋,李妙妍,张悦class Animal { boolean live = true; public void eat() { System.out.println(" "动物需要吃食物动物需要吃食物 "); } public void move() { System.out.println(“动物会运动动物会运动 "); }}实现步骤:实现步骤:•步骤1:编写父类步骤1:编写父类•步骤2:编写子类,使用关键字步骤2:编写子类,使用关键字extendsextends继承继承父类父类class Bird extends Animal { String skin= “羽毛羽毛 " public void move() { System.out.println(“鸟会飞翔鸟会飞翔 "); }} 父类名称父类名称 子类名称子类名称2024/8/30宋波,李晋,李妙妍,张悦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.println("鸟有:鸟有:"+bird.skin);"+bird.skin); } }} } 访问父类的成员方法访问父类的成员方法 访问子类的成员方法访问子类的成员方法 【【执行结果执行结果】】动物需要吃食物动物需要吃食物鸟会飞翔鸟会飞翔鸟有:羽毛鸟有:羽毛2024/8/30宋波,李晋,李妙妍,张悦2. 单继承单继承•Java是是单继承承的,即只能从一个的,即只能从一个类继承,承,extends后后类名只能有一个。
名只能有一个•单继承的承的优点点::①①代码更可靠;代码更可靠;②②可以用接口弥补,用一个类实现多个接可以用接口弥补,用一个类实现多个接口,达到多继承效果口,达到多继承效果2024/8/30宋波,李晋,李妙妍,张悦3. super关键字关键字①①super可用于可用于访问父父类中定中定义的属性的属性和成和成员方法;方法;②②super可用于在子可用于在子类构造方法中构造方法中调用用父父类的构造方法;的构造方法;③③super的追溯不的追溯不仅限于直接父限于直接父类2024/8/30宋波,李晋,李妙妍,张悦【【例例3-16】】使用使用super调用父类构造方法调用父类构造方法1.class Animal {2. boolean live=true;3. String skin=" ";4. public Animal(boolean l,String s) {5. live=l;6. skin=s;7. }8.}2024/8/30宋波,李晋,李妙妍,张悦9.class Bird extends Animal {10. public Bird(boolean l,String s) {11. super(l,s); 12. }13.}14.public class Zoo {15. public static void main(String[] args) {16. Bird bird=new Bird(true,"羽毛");17.System.out.println("鸟有:"+bird.skin);18. }19.}通过super调用父类的构造方法2024/8/30宋波,李晋,李妙妍,张悦注意:①①子子类构造方法体的构造方法体的第一句第一句通常要通常要调用用父父类的一个构造方法。
的一个构造方法②②此此时,如果不使用,如果不使用super指定,指定,则将将调用用默默认的父的父类构造方法构造方法(即不即不带参数的构造参数的构造方法方法)③③如果在父如果在父类中没有无参构造方法,中没有无参构造方法,则将将产生生编译错误2024/8/30宋波,李晋,李妙妍,张悦子类中父类成员的隐藏子类中父类成员的隐藏•子子类隐藏藏父父类的成的成员①①当子类的当子类的成员变量成员变量与父类的与父类的成员变量成员变量同名时;同名时;②②当子类的成员方法与父类的成员方法当子类的成员方法与父类的成员方法具有相同的具有相同的名字名字、、参数列表参数列表、、返回值返回值类型类型;;2024/8/30宋波,李晋,李妙妍,张悦“隐藏隐藏”的含义的含义•通通过子子类对象象调用子用子类中与父中与父类同名的同名的变量和方法量和方法时,,有效的有效的(操作操作)是是子子类中定中定义的的变量和方法量和方法•如果要在子如果要在子类中中访问父父类中被中被隐藏的成藏的成员变量或方法,要使用关量或方法,要使用关键词super 2024/8/30宋波,李晋,李妙妍,张悦3.3.2 方法的重写方法的重写•在子在子类中中对从父从父类继承的方法承的方法进行改造,行改造,称称为方法的重写方法的重写。
①①子类中重写方法必须和父类中被重写方法具子类中重写方法必须和父类中被重写方法具有相同的有相同的方法名方法名、、参数列表参数列表和和返回值类型返回值类型②②子类中重写方法的子类中重写方法的访问权限访问权限不能缩小不能缩小③③子类中重写得方法子类中重写得方法不能抛出新的异常不能抛出新的异常 2024/8/30宋波,李晋,李妙妍,张悦class Animal { … … public void cry() { System.out.println("动物发出叫声!动物发出叫声!"); }}class Dog extends Animal { public void cry() { System.out.println("狗发出狗发出“汪汪汪汪”声!声!"); }} class Cat extends Animal { public void cry() { System.out.println("猫发出猫发出“喵喵喵喵”声!声!"); }}重重写写重重写写【【例例3-18】】重写的示例重写的示例2024/8/30宋波,李晋,李妙妍,张悦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.cry()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.cry(); 语句时地执行结果是:语句时地执行结果是:狗发出汪汪声!狗发出汪汪声!执行执行cat.cry(); cat.cry(); 语句时地执行结果是:语句时地执行结果是:猫发出喵喵声!猫发出喵喵声!2024/8/30宋波,李晋,李妙妍,张悦3.3.3 运行时多态运行时多态•多多态性性(Polymorphism)指在一个程序中指在一个程序中相同相同名字的成名字的成员变量和方法可以表示量和方法可以表示不同不同的的实现。
①①方法重载:静态多态性,或称编译时多态;方法重载:静态多态性,或称编译时多态;②②方法重写方法重写(覆盖覆盖):动态多态性;:动态多态性;③③变量覆盖:子类可以隐藏与父类中的同名成变量覆盖:子类可以隐藏与父类中的同名成员变量2024/8/30宋波,李晋,李妙妍,张悦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/8/30宋波,李晋,李妙妍,张悦2. 运行时多态运行时多态•通通过一个父一个父类变量量发出的方法出的方法调用:用:①①该方法在父类中的实现该方法在父类中的实现②②该方法在某个子类中的实现该方法在某个子类中的实现只能在运行时,根据该变量指只能在运行时,根据该变量指向的对象类型确定向的对象类型确定2024/8/30宋波,李晋,李妙妍,张悦/*定义父类定义父类Animal*/import java.util.*;class Animal { void cry( ) { } void move( ) { } }/*定定Animal的子类的子类Parrot*/class Parrot extends Animal{ void cry() { System.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.println("猫发出喵喵声!猫发出喵喵声!"); } void move() { System.out.println("小猫正在爬行!小猫正在爬行!"); }} 子类重写子类重写父类父类AnimalAnimal的成员方法的成员方法 子类重写子类重写父类父类AnimalAnimal的成员方法的成员方法 子类重写子类重写父类父类AnimalAnimal的成员方法的成员方法 public class Zoo { static void animalsCry(Animal aa[]) { for(int i=0;i aa[i].cryaa[i].cry调用的为调用的为DogDog或或CatCat类类的的cry()cry()方法方法2024/8/30宋波,李晋,李妙妍,张悦3.3.4 对象类型的强制转换对象类型的强制转换•下溯造型下溯造型 ①①将父类类型的引用转换为子类将父类类型的引用转换为子类类型,称为下溯造型;类型,称为下溯造型;②②下溯造型不一定是安全的,需下溯造型不一定是安全的,需要进行类型检查要进行类型检查2024/8/30宋波,李晋,李妙妍,张悦1. instanceof运算符<引用引用类型型变量量> instanceof <引用引用类型型>•boolean表达式•左侧是右侧给出的类型或子左侧是右侧给出的类型或子类型时,表达式为类型时,表达式为true2024/8/30宋波,李晋,李妙妍,张悦class Cat extends Animal { }class Dog extends Animal { }public class TestInstanceof {public void doSomething( Animal a) {if (a instanceof Cat) {System.out.println("This is a Cat"); } ……}•使用instanceof方法测试接收的对象是否是Cat类或其子类2024/8/30宋波,李晋,李妙妍,张悦2. 强制类型转换强制类型转换•(SomeClass) aObjectVariable①①父类弱、子类强,指向父类的引用不能直接父类弱、子类强,指向父类的引用不能直接按子类引用,必须要强制类型转换后才能作按子类引用,必须要强制类型转换后才能作为子类的引用使用。 为子类的引用使用②②强制转换之前,一般先用强制转换之前,一般先用instanceof对对象对对象的类型进行测试的类型进行测试2024/8/30宋波,李晋,李妙妍,张悦1.class Animal {2. String skin;3.}4.class Bird extends Animal {5. String skin="羽毛";6. public String getSkin() {7. return skin;8. }9.}10.public class Casting {11. public void someMethod(Animal a) {12. System.out.println(a.getSkin()); 13.if(a instanceof Bird){14. Bird b=(Bird)a; 15. System.out.println(b.getSkin()); 16.}17. }非法:使用父类变量非法:使用父类变量a a调用子类成员方法调用子类成员方法强制类型转换强制类型转换合法合法2024/8/30宋波,李晋,李妙妍,张悦3.3.5 Object类类•Object定定义了所有了所有对象都需要的状象都需要的状态和行和行为。 例如:例如:①①对象之间的比较对象之间的比较②②将对象转换为字符串将对象转换为字符串③③等待某个条件变量等待某个条件变量④④当某条件变量改变时通知相关对象当某条件变量改变时通知相关对象⑤⑤返回对象的类返回对象的类2024/8/30宋波,李晋,李妙妍,张悦1. equals方法•equals方法方法ü用于判别某个指定对象与当前对象(调用于判别某个指定对象与当前对象(调用用equals方法的对象)是否等价;方法的对象)是否等价;•“数据等价数据等价”:两个数据的:两个数据的值相等相等①①引用类型数据比较的是引用引用类型数据比较的是引用②②基本数据类型比较值基本数据类型比较值2024/8/30宋波,李晋,李妙妍,张悦equals与“==”运算符①①equals( )方法只能比方法只能比较引用引用类型;型;②②“==”可以比可以比较引用和基本引用和基本类型;型;③③equals( )方法方法对File、、String、、Date及封装及封装类(Wrapper Class),是比,是比较类型内容,而不考型内容,而不考虑引用的是否是同一引用的是否是同一个个实例;例;2024/8/30宋波,李晋,李妙妍,张悦public class TestEquals { public static void main(String[ ] args) { String s1 = new String ("Hello"); String s2 = new String ("Hello"); if ( s1 == s2 ) { System.out.println("s1==s2"); } else { System.out.println("s1!=s2"); } // 输出: s1!=s22024/8/30宋波,李晋,李妙妍,张悦 if ( s1.equals(s2) ) { System.out.println(“s1 is equal to s2"); } else { System.out.println(“s1 is not equal to s2"); } // 输出: s1 is equal to s2 s2 = s1; if ( s1 == s2 ) { System.out.println(“s1==s2"); } else { System.out.println(“s1!=s2"); } } // 输出: s1==s2}2024/8/30宋波,李晋,李妙妍,张悦2. toString方法•Object类中中实现的的toString( )方方法法是是返返回回当前当前对象的象的类型和内存地址信息。 型和内存地址信息•但但在在一一些些子子类(如如String、、Date等等)中中进行行了了重重写写在在用用户自自定定义类中中通通常常都都将将该方方法重写,以返回更适用的信息法重写,以返回更适用的信息2024/8/30宋波,李晋,李妙妍,张悦3.4 数组数组1.一维数组一维数组2.多维数组多维数组3.数组的复制数组的复制2024/8/30宋波,李晋,李妙妍,张悦Java中数组的分类中数组的分类JavaJava中的数组中的数组一维数组一维数组多维数组多维数组一维数组的定义一维数组的定义一维数组的初始化一维数组的初始化一维数组的引用一维数组的引用二维数组的定义二维数组的定义二维数组的初始化二维数组的初始化二维数组的引用二维数组的引用2024/8/30宋波,李晋,李妙妍,张悦3.4.1 一维数组一维数组1.定定义::ütype arrayName[ ] 或或ütype[ ] arrayName•类型类型(type)可以为可以为Java中任意的数据类中任意的数据类型,包括型,包括简单类型简单类型和和复合类复合类•如:如:int intArray[ ];; Date dateArray[];2024/8/30宋波,李晋,李妙妍,张悦注意:注意:•在声明数在声明数组时不能指定其不能指定其长度:度:üint a[5]; // 不合法不合法•原因:原因:ü声明数组,只是在内存中为该类型声明数组,只是在内存中为该类型数组变量分配数组变量分配引用空间引用空间,,并没有为并没有为数组中每个元素分配数组中每个元素分配数据空间数据空间。 2024/8/30宋波,李晋,李妙妍,张悦2. 数组的创建数组的创建•arrayName = dataType [arraySize3. 数组的长度数组的长度•arrayName.length;2024/8/30宋波,李晋,李妙妍,张悦4. 静态初始化静态初始化声明并创建了一个长度声明并创建了一个长度为为 3 的的double型的数组型的数组double d[ ]={ 3.14, 2.718, 10.0 };String s[ ]={“Hello", “my", “Java"};声明并创建了一个长度声明并创建了一个长度为为 3 的的 String 型的数组型的数组d[0]=3.14;;d[1]=2.718;;d[2]=10.0s[0]= "Hello" s[1]= "my" s[2]= "Java"静态初始化:在声明一个数组的同时,静态初始化:在声明一个数组的同时,对该数组中每个元素进行赋值对该数组中每个元素进行赋值2024/8/30宋波,李晋,李妙妍,张悦5. 动态初始化动态初始化•在声明在声明( (创建建) )一个数一个数组类型型对象象时,只,只为其分配空其分配空间,而不同,而不同时对其中的各元素其中的各元素赋值。 Ønew dataType[arraySize];new dataType[arraySize];2024/8/30宋波,李晋,李妙妍,张悦简单类型:简单类型:•int a[ ];•a=new int[3];•a[0]=1;•a[1]=2;•a[2]=3;声明数组变量a,为其分配定长的引用空间(值为null)1. 创建一个含有创建一个含有3个元素的个元素的int型数型数组对象;组对象;2. 为为a分配分配3个个int型数据空间型数据空间3. 将将3个元素值初始化为个元素值初始化为0 nulla0x2a567ba0000x2a567b3212024/8/30宋波,李晋,李妙妍,张悦引用类型:引用类型:nulls0x2473c4snullnullnull0x2473c4String s[ ];s=new String[3];S[0]S[1]S[2]地址值地址值2024/8/30宋波,李晋,李妙妍,张悦引用类型:引用类型:0x2473c4s0x478b520x2473c4s[0]=new String(“Hello");s[1]=new String(“my");s[2]=new String(“Java");S[0]S[1]S[2]0x478b680x478b3c“my"“Java"0x4d78c9He...2024/8/30宋波,李晋,李妙妍,张悦6. 数组元素的引用数组元素的引用•数数组元素的引用方式元素的引用方式为:: •arrayName[index]Øindex为数组下标,它可以为整型常数为数组下标,它可以为整型常数或表达式,下标从或表达式,下标从0开始。 开始Ø每个数组都有一个属性每个数组都有一个属性length指明它的指明它的长度2024/8/30宋波,李晋,李妙妍,张悦【【例例3-24】】3.int[ ] anArray; 4.anArray = new int[10]; 5.for (int i = 0; i < anArray.length; i++) {6. anArray[i] = i;7. System.out.print(anArray[i] + " ");8.}声明数组声明数组创建长度为创建长度为10的的数组数组数组的长度数组的长度为每个数组元素赋值为每个数组元素赋值2024/8/30宋波,李晋,李妙妍,张悦3.4.2 二维数组二维数组1.定定义:: type arrayName[ ][ ];; 或或 type[ ][ ] arrayName;Ø类型类型(type)可以为可以为Java中任意的数据类型,中任意的数据类型,包括简单类型和复合类包括简单类型和复合类 例如:例如: int intArray[ ][ ];; Date[ ][ ] dateArray;2024/8/30宋波,李晋,李妙妍,张悦示例:示例:int a[ ][ ] = new int [4][5];将创建一个有将创建一个有 4 个数组的数组,每个数组的数组,每个数组中又有个数组中又有 5 个整数,即个整数,即 4 行行 5 列的整数矩阵。 列的整数矩阵2024/8/30宋波,李晋,李妙妍,张悦静态初始化静态初始化int a[ ][ ] = {{2,3}, {1,5}, {3,4}};a[0][0]=2 a[0][1]=3a[1][0]=1 a[1][1]=5a[2][0]=3 a[2][1]=42 31 53 42024/8/30宋波,李晋,李妙妍,张悦静态初始化静态初始化int a[ ][ ] = {{1,2}, {3,4,0,9}, {5,6,7}};a[0][0]=1 a[0][1]=2a[1][0]=3 a[1][1]=4a[1][2]=0 a[1][3]=9a[2][0]=5 a[2][1]=6a[2][2]=71 23 4 0 95 6 72024/8/30宋波,李晋,李妙妍,张悦二维数组的动态初始化二维数组的动态初始化•int a[ ][ ];•a=new int[3][ ];•a[0]=new int[2];•a[1]=new int[4];•a[2]=new int[3];1 23 4 0 95 6 72024/8/30宋波,李晋,李妙妍,张悦正确的说明示例:正确的说明示例:•int a1[ ][ ] = new int [2][3];•int a2[ ][ ] = new int [2][ ];•int a3[ ][ ] = new int [4][6];将创建一个有将创建一个有 2 个数组的数组,个数组的数组,每个数组中又有每个数组中又有 3 个整数,即个整数,即 2 行行 3 列的整数矩阵列的整数矩阵2024/8/30宋波,李晋,李妙妍,张悦错误的说明示例错误的说明示例int errarr1[2][3];不允许静态不允许静态说明数组说明数组数组维数说明顺序应数组维数说明顺序应从高维到低维从高维到低维数组维数的指定只能在数组维数的指定只能在new运算符之后运算符之后int errarr2[ ][ ] = new int [ ][4];int errarr3[ ][4] = new int [3][4];2024/8/30宋波,李晋,李妙妍,张悦0x2473c4a0x478b520x2473c4int a[ ][ ];a=new int[3][3];a[0]a[1]a[2]0x478b680x478b3c0x4d78c90a[0][0]a[0][1]a[0][2]000a[2][0] a[2][1]a[2][2]002024/8/30宋波,李晋,李妙妍,张悦【【例例3-25】】•int[ ][ ] aMatrix = new int[3][ ];将创建一个有将创建一个有 3 个数组的数组,每个数个数组的数组,每个数组中又有组中又有 0~a[i].lengh-1个整数,即个整数,即 3 行行0~a[i].lengh-1列的整数矩阵列的整数矩阵2024/8/30宋波,李晋,李妙妍,张悦for(int i=0;i












