版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《Java程序设计》电子课件宋波,李晋,李妙妍,张悦2024/11/23宋波,李晋,李妙妍,张悦第1篇核心基础篇第3章Java面向对象特性2024/11/23宋波,李晋,李妙妍,张悦本章内容3.1类与对象3.2隐藏和封装3.3类的继承与多态3.4数组2024/11/23宋波,李晋,李妙妍,张悦学习目标掌握对象与类的基本概念了解对象的生命周期熟练掌握类的定义及实例化理解隐藏与封装熟练掌握类的继承与多态掌握数组的应用2024/11/23宋波,李晋,李妙妍,张悦本章概要Java中类和对象的定义;Java对OOP三个主要特性——封装、继承和多态的支持机制;Java中的对象数组这种数据结构。2024/11/23宋波,李晋,李妙妍,张悦本章概要Java中类和对象的定义;Java对OOP三个主要特性——封装、继承和多态的支持机制;Java中的对象数组这种数据结构。2024/11/23宋波,李晋,李妙妍,张悦3.1类与对象类与对象的定义成员变量与局部变量成员方法对象的创建对象的使用对象的消除方法重载this构造方法2024/11/23宋波,李晋,李妙妍,张悦3.1.1类和对象的定义Java程序是由一个或若干个类组成,类是Java程序的基本组成单位,包括:成员变量:描述对象的属性成员方法:描述对象的行为2024/11/23宋波,李晋,李妙妍,张悦类定义的结构2024/11/23宋波,李晋,李妙妍,张悦1.类的声明格式[public][abstract|final]class<className>[extendssuperClassName][implementsinterfaceNameList]类的访问权限及其属性类定义关键字类名继承某个父类的关键字实现接口的关键字2024/11/23宋波,李晋,李妙妍,张悦2.类体构造和初始化新对象的构造方法;表示类及其对象状态的变量;
实现类及其对象的方法;进行对象清除的finalize()方法。2024/11/23宋波,李晋,李妙妍,张悦2.类体构造和初始化新对象的构造方法;表示类及其对象状态的变量;
实现类及其对象的方法;进行对象清除的finalize()方法。2024/11/23宋波,李晋,李妙妍,张悦3.1.2成员变量与局部变量成员变量(类):在类体中声明的变量,且不属于任何一个方法时。局部变量:在方法体中声明的变量以及方法的参数则统称为方法的局部变量。2024/11/23宋波,李晋,李妙妍,张悦【例3-1】成员变量示例publicclassApple{publicStringcolor; //公共变量colorpublicstaticintnum; //静态变量numpublicfinalbooleanMATURE=true;//常量MATURE并赋值publicstaticvoidmain(String[]args){System.out.println("苹果数量:"+Apple.num);Appleapple=newApple();System.out.println("苹果颜色:"+apple.color);System.out.println("苹果是否成熟:"+apple.MATURE);}}num是类变量(即静态变量),可通过类名直接访问2024/11/23宋波,李晋,李妙妍,张悦2.局部变量[final]<type><varibleName>;指定局部变量为常量局部变量的参数类型局部变量的名称2024/11/23宋波,李晋,李妙妍,张悦【例3-2】局部变量的使用publicclassApple{Stringcolor="Red";floatprice;publicStringgetColor(){returncolor;}publicfloatcount(){intnum;if(num<0)
return0;elsereturnprice*num;}成员变量错误语句,因为局部变量num还没有被赋值就使用2024/11/23宋波,李晋,李妙妍,张悦publicstaticvoidmain(String[]args){Appleapple=newApple();System.out.println("苹果总价钱:"+apple.count());}}2024/11/23宋波,李晋,李妙妍,张悦publicstaticvoidmain(String[]args){Appleapple=newApple();System.out.println("苹果总价钱:"+apple.count());}}2024/11/23宋波,李晋,李妙妍,张悦概念:指该变量在程序代码中的作用区域,在该区域外不能直接访问变量。生命周期:指从声明一个变量并分配内存空间、使用变量开始,然后释放该变量并清除所占用内存空间的一个过程。3.变量的有效范围2024/11/23宋波,李晋,李妙妍,张悦变量的种类:成员变量——类体中声明的成员变量在整个类中有效。局部变量——在方法内或方法内的复合代码块(方法内部,“{”与“}”之间的代码)声明的变量。2024/11/23宋波,李晋,李妙妍,张悦【例3-3】变量的有效范围
publicclassOlympics1{privateintmedal_All=800;
publicvoidChina(){intmedal_CN=100;
if(medal_CN<1000){
intgold=50;
medal_CN+=30;
medal_All-=130;
}
}}成员变量代码块外、方法体内的局部变量代码块的局部变量允许访问本方法的局部变量
允许访问本类的成员变量
2024/11/23宋波,李晋,李妙妍,张悦3.1.3成员方法返回值类型方法名称{//方法开始标记}//方法结束标记方法主体(参数1,参数2,……参数n)2024/11/23宋波,李晋,李妙妍,张悦注意:方法体中定义的局部变量的作用域只在方法内部;如果局部变量的名字和类的成员变量名字相同,则类的成员变量被屏蔽;如果要在方法中使类的成员变量有效,则可以使用this关键字。2024/11/23宋波,李晋,李妙妍,张悦注意:方法体中定义的局部变量的作用域只在方法内部;如果局部变量的名字和类的成员变量名字相同,则类的成员变量被屏蔽;如果要在方法中使类的成员变量有效,则可以使用this关键字。2024/11/23宋波,李晋,李妙妍,张悦publicclassOlympics2{ privateintgold=0; privateintsilver=0; privateintcopper=0;
public
voidchangeModel(inta,intb,intc){
gold=a;//给类的成员变量赋值
intsilver=b;//使同名类成员变量silver隐藏
intcopper=50;//使同名类成员变量copper隐藏
System.out.println(“InchangModel:”+“金牌=”+gold+“银牌=”+silver+“铜牌"+copper);
this.copper=c;//给类成员变量z赋值
}2024/11/23宋波,李晋,李妙妍,张悦StringgetModel(){ return“金牌=”+gold+“银牌=”+silver+“铜牌="+copper;}2024/11/23宋波,李晋,李妙妍,张悦publicstaticvoidmain(Stringargs[]){Olympics2o2=newOlympics2();System.out.println("BeforechangModel:"+o2.getModel()); o2.changeModel(100,100,100); System.out.println("AfterchangeModel:"+o2.getModel());}}BeforchangModel:金牌=0银牌=0铜牌=0gold=100silver=100copper=50InchangModel:金牌=100银牌=100铜牌=50AfterchangModel:金牌=100银牌=0铜牌=100如果在方法中对成员变量的值进行了修改,则这种修改将是永久的。gold=0silver=0copper=02024/11/23宋波,李晋,李妙妍,张悦3.1.4对象的创建一个对象的生命周期包括三个阶段:对象的创建对象的使用对象的消除2024/11/23宋波,李晋,李妙妍,张悦创建对象创建对象
声明实例化初始化类对象名称
=
new
构造方法(参数)publicclassPoint{intx=1;inty=1;publicPoint(intx,inty){this.x=x;this.y=y;}}//实例化Point类,创建对象ptPointpt=newPoint(2,3);2024/11/23宋波,李晋,李妙妍,张悦创建对象创建对象
声明实例化初始化类对象名称
=
new
构造方法(参数)publicclassPoint{intx=1;inty=1;publicPoint(intx,inty){this.x=x;this.y=y;}}//实例化Point类,创建对象ptPointpt=newPoint(2,3);2024/11/23宋波,李晋,李妙妍,张悦Pointpt=
newPoint(2,3);2024/11/23宋波,李晋,李妙妍,张悦3.1.5对象的使用引用对象的变量objectReference.variableName;调用对象的方法objectReference.methodName(argumentList)2024/11/23宋波,李晋,李妙妍,张悦【例3-6】对象使用的示例
publicclassPoint{intx=1;inty=1;publicvoidsetXY(intx,inty){……}publicintgetXY(){……}publicstaticvoidmain(String[]args){ Pointpt=newPoint(); pt.x=2; System.out.println("x与y的乘积为:"+pt.getXY()); pt.setXY(3,2); System.out.println("x与y的乘积为:"+pt.getXY());}}成员变量成员方法声明并创建Point类的对象pt访问对象pt的成员变量x调用成员方法
2024/11/23宋波,李晋,李妙妍,张悦3.1.6对象的消除在C++中,程序员要显式地删除不用的对象,即手动释放对象占用的存储空间。Java提供了垃圾回收(garbagecollection)机制:自动判断对象是否还在使用,并自动销毁不再使用的对象,回收对象所占用的资源。2024/11/23宋波,李晋,李妙妍,张悦Java垃圾回收器执行机制的生命周期2024/11/23宋波,李晋,李妙妍,张悦Java垃圾回收器执行机制的生命周期2024/11/23宋波,李晋,李妙妍,张悦3.1.7方法的重载在同一个类中定义了多个同名而内容不同的成员方法。
classScreen{ publicvoidprint(inti){…} publicvoidprint(floati){…} publicvoidprint(inti,Stringstr){…} }2024/11/23宋波,李晋,李妙妍,张悦方法重载原则:参数表必须不同:方法参数的个数不同参数类型不同返回类型、修饰符返回类型2024/11/23宋波,李晋,李妙妍,张悦【例3-7】方法重载的示例
publicclassCalculate{finalfloatPI=3.14159f;
publicfloatgetArea(floatr){
returnPI*r*r;}
publicfloatgetArea(floatl,floatw){returnl*w;}
publicvoiddraw(intnum){
System.out.println("画"+num+"个任意形状的图形");}
publicvoiddraw(Stringshape){
System.out.println("画一个"+shape);}方法重载方法重载2024/11/23宋波,李晋,李妙妍,张悦publicstaticvoidmain(String[]args){Calculatec=newCalculate();//创建Calculate类的对象 floatl=20; floatw=40; System.out.println("求长为"+l+"宽为"+w+"的矩形面积是:"+c.getArea(l,w)); floatr=6; System.out.println("求半径为"+r+"的圆形面积是:"+c.getArea(r));intnum=8;c.draw(num);c.draw(“矩形”);}}通过传递的参数判断调用哪个方法通过传递的参数判断调用哪个方法2024/11/23宋波,李晋,李妙妍,张悦3.1.8关键词this用来指向对象自身用来访问当前对象的数据成员;用来访问当前对象的成员方法;重载构造方法时,用来引用同类的其他构造方法。2024/11/23宋波,李晋,李妙妍,张悦3.1.8关键词this用来指向对象自身用来访问当前对象的数据成员;用来访问当前对象的成员方法;重载构造方法时,用来引用同类的其他构造方法。2024/11/23宋波,李晋,李妙妍,张悦【例3-8】this关键字的使用
publicclassFruit{ Stringcolor="绿色"; doubleprice; intnum;……publicdoublecount(doubleprice,intnum){ this.price=price; this.num=num; returnprice*num; }……}成员变量将参数值赋值给成员变量,即指向对象自身。2024/11/23宋波,李晋,李妙妍,张悦3.1.9类的构造方法功能:初始化类的成员变量特点:名称必须与类名相同不能有返回值必须用new自动调用2024/11/23宋波,李晋,李妙妍,张悦【例3-9】在类Apple中定义两个构造方法publicclassApple{privateintnum;privatedoubleprice;publicApple(){ num=10; price=2.34;}publicApple(intnum,doubleprice){ this.num=num; this.price=price;}……publicstaticvoidmain(Stringargs[]){Applea1=newApple();Applea2=newApple(50,3.15)……}}参数化构造方法2024/11/23宋波,李晋,李妙妍,张悦2.缺省构造方法如果在类定义中无构造函数,在编译时可缺省加入构造方法。如:publicApple(){};一旦在类中有一个自己声明的构造函数,则缺省的构造函数将不被加到源程序中。2024/11/23宋波,李晋,李妙妍,张悦3.构造方法的重载功能:使类对象具有不同的初始值,为对象的初始化提供方便。可以使用this调用重载的构造方法。2024/11/23宋波,李晋,李妙妍,张悦3.构造方法的重载功能:使类对象具有不同的初始值,为对象的初始化提供方便。可以使用this调用重载的构造方法。2024/11/23宋波,李晋,李妙妍,张悦【例3-10】对类Apple的构造方法进行重载classApple{ privateStringcolor; privateintnum; publicApple(Stringc,intn){ color=c; num=n; } publicApple(Stringc){
this(c,0);
}调用两个参数的构造方法2024/11/23宋波,李晋,李妙妍,张悦classApple{ privateStringcolor; privateintnum; …… publicApple(Stringc){ this(c,0); } publicApple(){ this("Unknown"); }}调用一个参数的构造方法2024/11/23宋波,李晋,李妙妍,张悦classApple{ privateStringcolor; privateintnum;…… publicStringgetColor(){ returncolor; } publicintgetNum(){ returnnum; }}2024/11/23宋波,李晋,李妙妍,张悦publicclassAppleDemo{ publicstaticvoidmain(String[]args){ Appleapplee=newApple(); System.out.println(“苹果颜色:”+e.getColor());System.out.println(“苹果数量:”+e.getNum()); }}调用无参数:this(“Unknown”);—〉1个参数:this(c,0);—〉2个参数的构造方法2024/11/23宋波,李晋,李妙妍,张悦3.2隐藏与封装封装访问控制package和import2024/11/23宋波,李晋,李妙妍,张悦3.2隐藏与封装封装访问控制package和import2024/11/23宋波,李晋,李妙妍,张悦3.2.1封装封装,是指将对象的数据与操作数据的方法相结合,通过方法将对象的数据与实现细节保护起来。在类的定义中设置访问对象属性及方法的权限,来限制该类对象及其他类的对象的使用范围。提供一个接口来描述其他对象的使用方法。2024/11/23宋波,李晋,李妙妍,张悦3.2.2访问控制私有的——以private修饰符指定;保护的——以protected修饰符指定;公开的——以public修饰符指定;默认的,也称为default或package——不使用任何修饰符指定。2024/11/23宋波,李晋,李妙妍,张悦表3-1:4种访问权限及其含义可否直接访问同一个同一个不同包中的任何控制等级类中包中子类中场合privateYesdefaultYesYesprotectedYesYesYespublicYesYesYesYes2024/11/23宋波,李晋,李妙妍,张悦1.private修饰符其成员只能在所在类的内部使用,在其他的类中则不允许直接访问。同一个类的不同对象之间可以访问对方的private成员变量和方法;访问控制是在类的级别上,而不是在对象的级别上。2024/11/23宋波,李晋,李妙妍,张悦classParent{
private
intprivateVar;privatevoidprivateMethod(){
System.out.println(“IamprivateMethod!");}}classChild{
voidaccessMethod(){Parentp=newParent();p.privateVar=100;p.privateMethod();}}类中的私有成员非法:无法通过类Parent的对象访问它的私有成员
2024/11/23宋波,李晋,李妙妍,张悦classParent{
private
intprivateVar;privatevoidprivateMethod(){
System.out.println(“IamprivateMethod!");}}classChild{
voidaccessMethod(){Parentp=newParent();p.privateVar=100;p.privateMethod();}}类中的私有成员非法:无法通过类Parent的对象访问它的私有成员
2024/11/23宋波,李晋,李妙妍,张悦classParent{privateintprivateVar;publicParent(intp){ privateVar=p;}booleanisEqualTo(ParentanotherParent){if(this.privateVar==anotherParent.privateVar)returntrue;elsereturnfalse;}}当前对象实例的成员变量与方法的参数传递的另一个对象实例的成员变量是否相等?2024/11/23宋波,李晋,李妙妍,张悦publicclassPrivateDemo{publicstaticvoidmain(Stringargs[]){Parentp1=newParent(20);Parentp2=newParent(40); System.out.println(p1.isEqualTo(p2));}}执行结果:false2024/11/23宋波,李晋,李妙妍,张悦2.default如果一个类没有显式地设置成员的访问控制级别,则说明它使用的是默认的访问权限,称为default或package。允许被这个类本身,或者相同包中的其它类访问其default成员。构造方法设置为default权限时,则除这个类本身和同一个包中的类以外,其他类均不能生成该类的对象实例。2024/11/23宋波,李晋,李妙妍,张悦packagep1;classParent{intpackageVar;voidpackageMethod(){
System.out.println(“IampackageMethod!");}}packagep1;classChild{
voidaccessMethod(){Parentp=newParent();p.packageVar=10;p.packageMethod();}}类中的默认成员合法:因为Child与Parent在同一个包中,因此有权通过Parent的对象访问它的默认成员
2024/11/23宋波,李晋,李妙妍,张悦3.protected修饰符允许类本身、它的子类、以及同一个包中其余的类访问这些成员。2024/11/23宋波,李晋,李妙妍,张悦3.protected修饰符允许类本身、它的子类、以及同一个包中其余的类访问这些成员。2024/11/23宋波,李晋,李妙妍,张悦packagep1;classParent{ protectedintprotectedVar; protectedvoidprotectedMethod(){ System.out.println(“IamprotectedMethod"); }}2024/11/23宋波,李晋,李妙妍,张悦packagep1;classPerson{ voidaccessMethod(){ Personp=newPerson(); tectedVar=100; tectedMethod(); }}由于Person类与Parent在同一个包中所以,可以创建它的对象,并实现访问。2024/11/23宋波,李晋,李妙妍,张悦packagep2;importp1.*;classChildextendsParent{ voidaccessMethod(Parentp,Childc){ p.iamprotected=10; c.iamprotected=10;//子类 tectedMethod(); tectedMethod();//子类
}}X由于Child与父类Parent不在同一个包中,只能通过子类Child的对象来实现访问√X√2024/11/23宋波,李晋,李妙妍,张悦4.public修饰符带有public的成员可以被所有的类访问。一个成员只有在被外部对象使用后不会产生不良后果时,才被声明为public。2024/11/23宋波,李晋,李妙妍,张悦3.2.3package和import程序员可以将一组相关的类与接口包裹在一起形成一个包(package)。易于确定包中的类是相关的,根据功能可找到相应的类。防止类命名混乱。控制包中的类、接口、成员变量和方法的可见性。2024/11/23宋波,李晋,李妙妍,张悦3.2.3package和import程序员可以将一组相关的类与接口包裹在一起形成一个包(package)。易于确定包中的类是相关的,根据功能可找到相应的类。防止类命名混乱。控制包中的类、接口、成员变量和方法的可见性。2024/11/23宋波,李晋,李妙妍,张悦1.package语句指定程序中的类属于一个哪个包:packagepkg1[.pkg2.[pkg3…]];包定义语句在每个源程序中只能有一条,即一个类只能属于一个包;包定义语句必须在程序的第一行(之前可有空格及注释);包名用“.”分隔。2024/11/23宋波,李晋,李妙妍,张悦【例3-13】利用package关键词,将类Circle打包到com下的graphics包中。packagecom.graphics;publicclassCircle{finalfloatPI=3.14159f;//定义一个常量PIpublicstaticvoidmain(String[]args){System.out.println("画一个圆形!");}}包的创建2024/11/23宋波,李晋,李妙妍,张悦comgraphicspackagecom.graphics;该Java程序所定义的类保存的路径为:C:\mypkg\com\graphicsclasspath=.;c:\mypkg包分隔符相当于目录分隔符,包存储的路径由包根路径加上包名指明的路径组成;包的根路径由CLASSPATH环境变量指出。2024/11/23宋波,李晋,李妙妍,张悦编译和生成包编译之后拷贝javacCircle.java→Circle.class将Circle.class复制graphics子目录下简化的编译命令javac-dC:\mypkgCircle.java1、生成C:\mypkg\com\graphics;2.将Circle.class保存到该子目录下。2024/11/23宋波,李晋,李妙妍,张悦2024/11/23宋波,李晋,李妙妍,张悦2024/11/23宋波,李晋,李妙妍,张悦2.import语句功能:import语句告诉编译器要使用的Java类所在的位置;注意,包名也是类名的一部分。2024/11/23宋波,李晋,李妙妍,张悦将package引入源程序,格式: import包名.*; import包名.类名;import语句必须在源程序之前,在package声明之后,Java程序的结构:[package…..]//package.;[import….]//importjava.lang.*;[类声明…]2024/11/23宋波,李晋,李妙妍,张悦3.3类的继承与多态类的继承方法的重写运行时多态对象类型的强制转换Object类2024/11/23宋波,李晋,李妙妍,张悦3.3.1类的继承2024/11/23宋波,李晋,李妙妍,张悦继承其他类的类叫子类,被继承的类叫做超类(父类)。继承的特点层次结构子类继承父类的属性和方法2024/11/23宋波,李晋,李妙妍,张悦继承其他类的类叫子类,被继承的类叫做超类(父类)。继承的特点层次结构子类继承父类的属性和方法2024/11/23宋波,李晋,李妙妍,张悦例3-15:2024/11/23宋波,李晋,李妙妍,张悦classAnimal{
booleanlive=true;
publicvoideat(){System.out.println("动物需要吃食物");}
publicvoidmove(){
System.out.println(“动物会运动
");}}实现步骤:步骤1:编写父类步骤2:编写子类,使用关键字extends继承父类classBirdextendsAnimal{Stringskin=“羽毛"
publicvoidmove()
{
System.out.println(“鸟会飞翔
");}}父类名称子类名称2024/11/23宋波,李晋,李妙妍,张悦publicclassZoo{
publicstaticvoidmain(String[]args){Birdbird=newBird();bird.eat();bird.move();System.out.println("鸟有:"+bird.skin);}}访问父类的成员方法
访问子类的成员方法
【执行结果】动物需要吃食物鸟会飞翔鸟有:羽毛2024/11/23宋波,李晋,李妙妍,张悦2.单继承Java是单继承的,即只能从一个类继承,extends后类名只能有一个。单继承的优点:代码更可靠;可以用接口弥补,用一个类实现多个接口,达到多继承效果。2024/11/23宋波,李晋,李妙妍,张悦3.super关键字super可用于访问父类中定义的属性和成员方法;super可用于在子类构造方法中调用父类的构造方法;super的追溯不仅限于直接父类。2024/11/23宋波,李晋,李妙妍,张悦3.super关键字super可用于访问父类中定义的属性和成员方法;super可用于在子类构造方法中调用父类的构造方法;super的追溯不仅限于直接父类。2024/11/23宋波,李晋,李妙妍,张悦【例3-16】使用super调用父类构造方法classAnimal{booleanlive=true;Stringskin="";publicAnimal(booleanl,Strings){live=l; skin=s;}}2024/11/23宋波,李晋,李妙妍,张悦classBirdextendsAnimal{publicBird(booleanl,Strings){super(l,s);}}publicclassZoo{publicstaticvoidmain(String[]args){Birdbird=newBird(true,"羽毛"); System.out.println("鸟有:"+bird.skin);}}通过super调用父类的构造方法2024/11/23宋波,李晋,李妙妍,张悦注意:子类构造方法体的第一句通常要调用父类的一个构造方法。此时,如果不使用super指定,则将调用默认的父类构造方法(即不带参数的构造方法)。如果在父类中没有无参构造方法,则将产生编译错误。2024/11/23宋波,李晋,李妙妍,张悦子类中父类成员的隐藏子类隐藏父类的成员当子类的成员变量与父类的成员变量同名时;当子类的成员方法与父类的成员方法具有相同的名字、参数列表、返回值类型;2024/11/23宋波,李晋,李妙妍,张悦“隐藏”的含义通过子类对象调用子类中与父类同名的变量和方法时,有效的(操作)是子类中定义的变量和方法。如果要在子类中访问父类中被隐藏的成员变量或方法,要使用关键词super。2024/11/23宋波,李晋,李妙妍,张悦“隐藏”的含义通过子类对象调用子类中与父类同名的变量和方法时,有效的(操作)是子类中定义的变量和方法。如果要在子类中访问父类中被隐藏的成员变量或方法,要使用关键词super。2024/11/23宋波,李晋,李妙妍,张悦3.3.2方法的重写在子类中对从父类继承的方法进行改造,称为方法的重写。子类中重写方法必须和父类中被重写方法具有相同的方法名、参数列表和返回值类型子类中重写方法的访问权限不能缩小子类中重写得方法不能抛出新的异常2024/11/23宋波,李晋,李妙妍,张悦classAnimal{……
public
voidcry(){
System.out.println("动物发出叫声!");}}classDogextendsAnimal{
publicvoidcry(){System.out.println("狗发出“汪汪”声!");}}classCatextendsAnimal{
publicvoidcry(){System.out.println("猫发出“喵喵”声!");}}重写重写【例3-18】重写的示例2024/11/23宋波,李晋,李妙妍,张悦publicclassZoo{publicstaticvoidmain(String[]args){Dogdog=newDog();System.out.println(“执行dog.cry()语句时的执行结果是:");dog.cry();Catcat=newCat();System.out.println(“执行cat.cry()语句时的执行结果是:");cat.cry();}}访问子类Dog的重写后的成员方法
访问子类Cat的重写后的成员方法【执行结果】执行dog.cry();语句时地执行结果是:狗发出汪汪声!执行cat.cry();语句时地执行结果是:猫发出喵喵声!2024/11/23宋波,李晋,李妙妍,张悦3.3.3运行时多态多态性(Polymorphism)指在一个程序中相同名字的成员变量和方法可以表示不同的实现。方法重载:静态多态性,或称编译时多态;方法重写(覆盖):动态多态性;变量覆盖:子类可以隐藏与父类中的同名成员变量。2024/11/23宋波,李晋,李妙妍,张悦1.上溯造型通过引用子类的实例来调用父类的方法,从而将一种类型(子类)对象的引用转换成另一种类型(父类)对象的引用。Animala1=newParrot();Animala2=newDog();Animala3=newCat();2024/11/23宋波,李晋,李妙妍,张悦1.上溯造型通过引用子类的实例来调用父类的方法,从而将一种类型(子类)对象的引用转换成另一种类型(父类)对象的引用。Animala1=newParrot();Animala2=newDog();Animala3=newCat();2024/11/23宋波,李晋,李妙妍,张悦2.运行时多态通过一个父类变量发出的方法调用:该方法在父类中的实现该方法在某个子类中的实现只能在运行时,根据该变量指向的对象类型确定2024/11/23宋波,李晋,李妙妍,张悦/*定义父类Animal*/import
java.util.*;classAnimal{
voidcry(){}
voidmove(){}}/*定Animal的子类Parrot*/classParrotextendsAnimal{
voidcry(){ System.out.println("狗发出汪汪声!");}
voidmove(){ System.out.println("小狗正在奔跑!");}}/*动物类Animal的子类Dog*/classDogextendsAnimal{
voidcry(){ System.out.println("狗发出汪汪声!");}
voidmove(){ System.out.println("小狗正在奔跑!");}}classCatextendsAnimal{/*定义Animal的子类Cat*/
voidcry(){ System.out.println("猫发出喵喵声!");}
voidmove(){ System.out.println("小猫正在爬行!");}}
子类重写父类Animal的成员方法
子类重写父类Animal的成员方法
子类重写父类Animal的成员方法
publicclassZoo{
staticvoidanimalsCry(Animalaa[]){for(inti=0;i<aa.length;i++){ aa[i].cry();}}
publicstaticvoidmain(String[]args){
Randomrand=new
Random(); Animala[]=newAnimal[8]; for(inti=0;i<a.length;i++){ switch(rand.nextInt(3)){ case0:a[i]=newParrot();break; case1:a[i]=newDog();break; case2:a[i]=newCat();break; } } animalsCry(a);}}父类变量a[i]指向子类对象Dog或Cat。aa[i].cry调用的为Dog或Cat类的cry()方法2024/11/23宋波,李晋,李妙妍,张悦3.3.4对象类型的强制转换下溯造型将父类类型的引用转换为子类类型,称为下溯造型;下溯造型不一定是安全的,需要进行类型检查。2024/11/23宋波,李晋,李妙妍,张悦1.instanceof运算符<引用类型变量>instanceof<引用类型>boolean表达式左侧是右侧给出的类型或子类型时,表达式为true2024/11/23宋波,李晋,李妙妍,张悦classCatextendsAnimal{}classDogextendsAnimal{}publicclassTestInstanceof{publicvoiddoSomething(Animala){ if(ainstanceofCat){ System.out.println("ThisisaCat"); }……}使用instanceof方法测试接收的对象是否是Cat类或其子类2024/11/23宋波,李晋,李妙妍,张悦classCatextendsAnimal{}classDogextendsAnimal{}publicclassTestInstanceof{publicvoiddoSomething(Animala){ if(ainstanceofCat){ System.out.println("ThisisaCat"); }……}使用instanceof方法测试接收的对象是否是Cat类或其子类2024/11/23宋波,李晋,李妙妍,张悦2.强制类型转换(SomeClass)aObjectVariable父类弱、子类强,指向父类的引用不能直接按子类引用,必须要强制类型转换后才能作为子类的引用使用。强制转换之前,一般先用instanceof对对象的类型进行测试。2024/11/23宋波,李晋,李妙妍,张悦classAnimal{Stringskin;}classBirdextendsAnimal{Stringskin="羽毛";publicStringgetSkin(){returnskin;}}publicclassCasting{publicvoidsomeMethod(Animala){System.out.println(a.getSkin());
if(ainstanceofBird){ Birdb=(Bird)a;
System.out.println(b.getSkin());
}}非法:使用父类变量a调用子类成员方法强制类型转换合法2024/11/23宋波,李晋,李妙妍,张悦3.3.5Object类Object定义了所有对象都需要的状态和行为。例如:对象之间的比较将对象转换为字符串等待某个条件变量当某条件变量改变时通知相关对象返回对象的类2024/11/23宋波,李晋,李妙妍,张悦1.equals方法equals方法用于判别某个指定对象与当前对象(调用equals方法的对象)是否等价;“数据等价”:两个数据的值相等引用类型数据比较的是引用基本数据类型比较值2024/11/23宋波,李晋,李妙妍,张悦equals与“==”运算符equals()方法只能比较引用类型;“==”可以比较引用和基本类型;equals()方法对File、String、Date及封装类(WrapperClass),是比较类型内容,而不考虑引用的是否是同一个实例;2024/11/23宋波,李晋,李妙妍,张悦equals与“==”运算符equals()方法只能比较引用类型;“==”可以比较引用和基本类型;equals()方法对File、String、Date及封装类(WrapperClass),是比较类型内容,而不考虑引用的是否是同一个实例;2024/11/23宋波,李晋,李妙妍,张悦publicclassTestEquals{ publicstaticvoidmain(String[]args){ Strings1=newString("Hello"); Strings2=newString("Hello"); if(s1==s2){ System.out.println("s1==s2"); }else{ System.out.println("s1!=s2"); }//输出:s1!=s22024/11/23宋波,李晋,李妙妍,张悦if(s1.equals(s2)){ System.out.println(“s1isequaltos2");}else{ System.out.println(“s1isnotequaltos2");} //输出:s1isequaltos2s2=s1;if(s1==s2){ System.out.println(“s1==s2");}else{ System.out.println(“s1!=s2");}}//输出:s1==s2}2024/11/23宋波,李晋,李妙妍,张悦2.toString方法Object类中实现的toString()方法是返回当前对象的类型和内存地址信息。但在一些子类(如String、Date等)中进行了重写。在用户自定义类中通常都将该方法重写,以返回更适用的信息。2024/11/23宋波,李晋,李妙妍,张悦3.4数组一维数组多维数组数组的复制2024/11/23宋波,李晋,李妙妍,张悦Java中数组的分类Java中的数组一维数组多维数组一维数组的定义一维数组的初始化一维数组的引用二维数组的定义二维数组的初始化二维数组的引用2024/11/23宋波,李晋,李妙妍,张悦Java中数组的分类Java中的数组一维数组多维数组一维数组的定义一维数组的初始化一维数组的引用二维数组的定义二维数组的初始化二维数组的引用2024/11/23宋波,李晋,李妙妍,张悦3.4.1一维数组定义:typearrayName[]或type[]arrayName类型(type)可以为Java中任意的数据类型,包括简单类型和复合类如:intintArray[];DatedateArray[];2024/11/23宋波,李晋,李妙妍,张悦注意:在声明数组时不能指定其长度:inta[5];//不合法原因:声明数组,只是在内存中为该类型数组变量分配引用空间,并没有为数组中每个元素分配数据空间。2024/11/23宋波,李晋,李妙妍,张悦2.数组的创建arrayName=dataType[arraySize3.数组的长度arrayName.length;2024/11/23宋波,李晋,李妙妍,张悦4.静态初始化声明并创建了一个长度为3的double型的数组doubled[]={3.14,2.718,10.0};Strings[]={“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/11/23宋波,李晋,李妙妍,张悦5.动态初始化在声明(创建)一个数组类型对象时,只为其分配空间,而不同时对其中的各元素赋值。newdataType[arraySize];2024/11/23宋波,李晋,李妙妍,张悦5.动态初始化在声明(创建)一个数组类型对象时,只为其分配空间,而不同时对其中的各元素赋值。newdataType[arraySize];2024/11/23宋波,李晋,李妙妍,张悦简单类型:inta[];a=newint[3];a[0]=1;a[1]=2;a[2]=3;声明数组变量a,为其分配定长的引用空间(值为null)1.创建一个含有3个元素的int型数组对象;2.为a分配3个int型数据空间3.将3个元素值初始化为0nulla0x2a567ba0000x2a567b3212024/11/23宋波,李晋,李妙妍,张悦引用类型:nulls0x2473c4snullnullnull0x2473c4Strings[];s=newString[3];S[0]S[1]S[2]地址值2024/11/23宋波,李晋,李妙妍,张悦引用类型:0x2473c4s0x478b520x2473c4s[0]=newString(“Hello");s[1]=newString(“my");s[2]=newString(“Java");S[0]S[1]S[2]0x478b680x478b3c“my"“Java"0x4d78c9He...2024/11/23宋波,李晋,李妙妍,张悦6.数组元素的引用数组元素的引用方式为:arrayName[index]index为数组下标,它可以为整型常数或表达式,下标从0开始。每个数组都有一个属性length指明它的长度。2024/11/23宋波,李晋,李妙妍,张悦【例3-24】int[]anArray; anArray=newint[10]; for(inti=0;i<anArray.length;i++){anArray[i]=i;System.out.print(anArray[i]+"");}声明数组创建长度为10的数组数组的长度为每个数组元素赋值2024/11/23宋波,李晋,李妙妍,张悦【例3-24】int[]anArray; anArray=newint[10]; for(inti=0;i<anArray.length;i++){anArray[i]=i;System.out.print(anArray[i]+"");}声明数组创建长度为10的数组数组的长度为每个数组元素赋值2024/11/23宋波,李晋,李妙妍,张悦3.4.2二维数组定义:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 窗帘合作合同范本
- 2024年度光刻机技术研发与许可合同
- 餐馆自己改造装修方案
- 餐馆消费策略研究报告
- 2024年度企业云计算数据中心建设合同
- 集装箱仓库出租合同范本
- 二零二四年度BIM模型信息管理与共享服务合同
- 铁路市场需求大数据
- 林业机械故障机理分析
- 毒笔心理分析
- 2024秋期国家开放大学《当代中国政治制度》一平台在线形考(任务一至四)试题及答案
- T-CECS120-2021套接紧定式钢导管施工及验收规程
- 2024年浙江省单独考试招生文化课考试数学试卷真题(含答案详解)
- 2025届甘肃省庆阳市庆城县陇东中学高考考前提分物理仿真卷含解析
- 2024至2030年中国补肾市场销售前景模及消费需求潜力分析报告
- 2024-2030年中国水循环利用行业市场发展趋势与前景展望战略分析报告
- 2024年秋新人教版七年级上册数学教学课件 第三章 代数式 数学活动
- 石油钻采设备采购与供应链管理考核试卷
- 联想数字化转型及新IT白皮书-Lenovo
- 医院护理人员招聘考试试题与答案
- 华东师大版(2024年新教材)七年级上册数学期中综合素质评价试卷(含答案)
评论
0/150
提交评论