《第6章--继承与多态-Java语言程序设计(第2版)课件.ppt》由会员分享,可在线阅读,更多相关《第6章--继承与多态-Java语言程序设计(第2版)课件.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态第第6 6章章 继承与多态继承与多态6.1继承承 -构造方法在构造方法在类继承中的作用承中的作用6.2 多多态性性 -方法的重方法的重载、方法的覆盖方法的覆盖6.3 几个特殊几个特殊类 -Object类、Class类6.4 访问控制修控制修饰符符6.5 final修修饰符的使用符的使用6.6 对象引用象引用转换 -赋值转换、JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态n继承的概念承的概念 父类父类或超类。实际上是所有子或超类。实际上是所有子类的公共域和
2、公共方法的集合类的公共域和公共方法的集合.子类子类,父类的特殊化,父类的特殊化,是对公共是对公共域和方法在功能、内涵方面的域和方法在功能、内涵方面的扩展和延伸扩展和延伸 ,祖先类的所有成,祖先类的所有成员均将成为子类拥有的员均将成为子类拥有的“财富财富”ObjectObject类类是所有类的祖先。是所有类的祖先。人(人(Person)包括学生)包括学生(Student),但学生是人),但学生是人的特殊群体的特殊群体JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.1.1 Java继承的承的实现 import java.awt.Color;clas
3、s Pixel private int x;/x坐坐标 private int y;/y坐坐标 Color c;/颜色色 /其他其他 x,y在在Point类中有定义类中有定义JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.1.1 Java继承的承的实现import java.awt.Color;class Pixel extends Point Color c;/颜色色 /其他其他只有只有c c属性是新加入的,其它属性在属性是新加入的,其它属性在PointPoint类中均存在类中均存在 JavaJava语言程序设计语言程序设计(第第2 2版版)
4、第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态以下程序在以下程序在编译时将出将出错,为什么?什么?class parent String my;public parent(String x)my=x;public class subclass extends parent parent类类没有无参构造方法。没有无参构造方法。所以,类设计通常要提供无参构造方法所以,类设计通常要提供无参构造方法JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态【例例6-1】类的的继承中构
5、造方法的承中构造方法的调用用测试 import java.awt.Color;class Point private int x,y;public Point(int x,int y)/有参构造方法有参构造方法 this.x=x;this.y=y;public Point()/无参构造方法无参构造方法 this(0,0);/用用this调用本用本类的另一构造方法的另一构造方法 public String toString()return 点:点:+x+,+y;this代表当前对象代表当前对象JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态【例例6-
6、1】续public class Pixel extends Point Color c;public Pixel(int x,int y,Color c)super(x,y);/用用super调用父用父类的构造方法的构造方法 this.c=c;public String toString()return super.toString()+颜色:色:+c;public static void main(String a)Pixel x=new Pixel(3,24,Color.blue);System.out.println(x);【注意】使用 thisthis 查找匹配的方法时首先在本类查找,
7、找不到时再到其父类和祖先类查找;使用supersuper查找匹配方法时,首先到直接父类查找,如果不存在,则继续到其祖先类逐级往高层查找。如果没有这行,执行如果没有这行,执行super()用用super调用父类成员调用父类成员super代表父类对代表父类对象的引用象的引用JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态n首先按首先按“精确匹配精确匹配”原则去查找匹配方法,如果原则去查找匹配方法,如果找不到,则按找不到,则按“自动类型转换匹配自动类型转换匹配”
8、原则去查找原则去查找能匹配的方法。能匹配的方法。l所谓所谓“精确匹配精确匹配”就是实参和形参类型完全一致。就是实参和形参类型完全一致。l所谓所谓“自动转换匹配自动转换匹配”是指虽然实参和形参类型不同,是指虽然实参和形参类型不同,但但能将实参的数据按自动转换原则赋值给形参能将实参的数据按自动转换原则赋值给形参。方法调用的匹配处理原则方法调用的匹配处理原则能精确最好,没有就按转换顺序看哪个匹配!能精确最好,没有就按转换顺序看哪个匹配!JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态【思考思考】如果将如果将test(int x)test(int x)方法
9、注释掉方法注释掉,则调用则调用test(5)test(5)如何如何?3 3个方法中,只将个方法中,只将test(double x)test(double x)方法注释掉,程序能编译通过吗?方法注释掉,程序能编译通过吗?public class A public class A /void test(int x)System.out.println(int:+x);void test(int x)System.out.println(int:+x);void void test(long x)test(long x)System.out.println(long:+x);System.out.p
10、rintln(long:+x);void void test(double x)test(double x)System.out.println(double:+x);System.out.println(double:+x);public static void main(String args)public static void main(String args)A a1=new A();A a1=new A();a1.test(5.0);a1.test(5.0);a1.test(5);a1.test(5);JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与
11、多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态/*方法方法2:将复数与另一个由两将复数与另一个由两实数数a,b构成的复数相加构成的复数相加*/public Complex add(double a,double b)/实例方法例方法 return new Complex(x+a,y+b);/*方法方法3:将两复数:将两复数a和和b相加相加*/public static Complex add(Complex a,Complex b)/静静态方法方法 return new Complex(a.x+b.x,a.y+b.y);思考实例方法
12、和静思考实例方法和静态方法的差异性!态方法的差异性!JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.2.2 方法的覆盖方法的覆盖 以下以下类B定定义的方法中,方法覆盖如何?的方法中,方法覆盖如何?class B extends A void test(int x)System.out.println(in B.test(int):+x);void test(String x,int y)System.out.println(in B.test(Stri
13、ng,int):+x+,+y);【思考思考】通通过子子类B的的对象可象可调用多少用多少test方法?方法?publicclassAvoidtest(intx)voidtest(longx)voidtest(doublex)JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态关于方法覆盖有以下关于方法覆盖有以下问题值得注意:得注意:p 方法名、参数列表、完全相同方法名、参数列表、完全相同才会产生方法覆盖;返回类才会产生方法覆盖;返回类型通常也要一致,只有返回类型为引用类型时,型通常也要一致,只有返回类型为引用类型时,允许子类允许子类方法的返回类型是父类方
14、法返回类型的子类型方法的返回类型是父类方法返回类型的子类型。其他情形。其他情形导致类型不一致时编译将指示错误。导致类型不一致时编译将指示错误。p覆盖不能改变方法的覆盖不能改变方法的静态与非静态属性静态与非静态属性。子类中不能将父。子类中不能将父类非静态方法定义为静态方法,反之也一样。类非静态方法定义为静态方法,反之也一样。p不允许子类不允许子类方法的访问修饰符方法的访问修饰符比父类有更多的限制比父类有更多的限制。例如:子类不能将父类的例如:子类不能将父类的publicpublic方法定义为方法定义为protectedprotected方方法。但可以将父类的法。但可以将父类的privatepri
15、vate方法在子类中重新定义为方法在子类中重新定义为publicpublic方法方法.pfinalfinal方法不能被覆盖。方法不能被覆盖。JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态【例例6-4】访问继承的成承的成员 class SuperShow int y=8;/父父类SuperShow的的y属性属性 int m=2;void show()/父父类SuperShow的的show方法方法 System.out.println(sup.show,y=
16、+y);public class ExtendShow extends SuperShow int y=20;/子子类ExtendShow的的y属性属性 int z=1;void show()/子子类ExtendShow的的show方法方法 System.out.println(ext.show,y=+y);每个子类对象有每个子类对象有4个属性个属性yzsuper.ymJavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态public static void main(String args)ExtendShow b=new ExtendShow();S
17、uperShow a=b;System.out.println(ext.y=+b.y);System.out.println(sup.y=+a.y);b.show();a.show();System.out.println(z=+b.z +,m=+b.m);classSuperShowinty=8;intm=2;voidshow()System.out.println(sup.show,y=+y);publicclassExtendShowextendsSuperShowinty=20;intz=1;voidshow()System.out.println(ext.show,y=+y);Jav
18、aJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态写运行写运行结果果class Test5 int k=8;public void doSome()System.out.println(k1=+k);class Sub extends Test5 int k=66;public void doSome()k=k-2;System.out.println(k2=+k);public static void main(String args)Test5 obj=new Sub();obj.doSome();System.out.println(k3=+obj.
19、k);k2=64k3=8运行结果运行结果运行结果运行结果思考:思考:(1)将)将obj定义为子类引用定义为子类引用变量如何变量如何?(2)将子类的将子类的dosom()方法删方法删除又如何?除又如何?JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态写运行写运行结果果class exSuper public void func(String p,String s)System.out.println(p);public class example extends exSuper public void func(String p,String s)S
20、ystem.out.println(p+:+s);static public void main(String arg)exSuper e1=new exSuper();e1.func(hello1,hi1);exSuper e2=new example();e2.func(hello2,hi2);hello1hello2:hi2运行结果运行结果运行结果运行结果JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.3.1 Object类ObjectObject类是所有是所有JavaJava类的最的最终祖先,以下祖先,以下为常用方法:常用方法:publ
21、ic boolean equals(public boolean equals(ObjectObject obj):obj):该方法本意用于两方法本意用于两个个对象的象的“深度深度”比比较,也就是比,也就是比较两两对象封装的数据是否相象封装的数据是否相等;而比等;而比较运算符运算符“=”=”在比在比较两两对象象变量量时,只有当两个,只有当两个对象引用指向同一象引用指向同一对象象时才才为真真值。但。但在在ObjectObject类中,中,equalsequals方法是采用方法是采用“=”=”运算运算进行比行比较;public String toString():public String toS
22、tring():该方法返回方法返回对象的字符串描述;象的字符串描述;public final Class getClass():public final Class getClass():返回返回对象的所属象的所属类;protected void finalize():protected void finalize():该方法方法JavaJava垃圾回收程序垃圾回收程序在在删除除对象前自象前自动执行。行。6.3 几个特殊几个特殊类JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章
23、 继承与多态继承与多态public static void main(String arg)Point x=new Point(4,3);System.out.println(x=+x);System.out.println(x.equals(new Point(4,3);【思考思考】l观察有无观察有无toString()toString()方法时程序运行结果的变化。方法时程序运行结果的变化。l观察有无观察有无equals(Point p)equals(Point p)方法程序运行结果的变化。方法程序运行结果的变化。JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承
24、与多态继承与多态写运行写运行结果果public class IsEqual int x;public IsEqual(int x1)x=x1;public static void main(String a)IsEqual m1=new IsEqual(4);IsEqual m2=new IsEqual(4);IsEqual m3=m2;m3.x=6;System.out.println(m1=m2 is+(m1=m2);System.out.println(m2=m3 is+(m2=m3);System.out.println(m1.x=m2.x is+(m1.x=m2.x);System.
25、out.println(m1.equals(m2)=+m1.equals(m2);m1=m2isfalsem2=m3istruem1.x=m2.xisfalsem1.equals(m2)=false运行结果运行结果运行结果运行结果JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.3.2 Class类(选讲)1获取取Class类型的型的对象象Class类封装一个封装一个对象和接口运行象和接口运行时的状的状态,当装,当装载类时,Class类型的型的对象自象自动创建。有以下建。有以下3种方法可以种方法可以获取取Class的的对象。象。方法方法1:调用用
26、Object类的的getClass()方法。方法。方法方法2:使用:使用Class类的的forName()方法。方法。方法方法3:如果:如果T是一个是一个Java类型,那么型,那么T.class就代表了就代表了与与该类型匹配的型匹配的Class对象。例如,象。例如,String.class代表字代表字符串符串类型,型,int.class代表整数代表整数类型。型。JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态【例例6-6】反射机制反射机制简单测试举例。例。
27、import java.lang.reflect.*;class Test public int add(int x,int y)return x+y;public int minus(int x,int y)return x-y;public class A public static void main(String args)throws Exception Class myclass=Class.forName(Test);System.out.println(myclass.getName();Object x=myclass.newInstance();/获取取Test类的一个的一
28、个对象象 Method m=myclass.getMethods();/获取取Test类的所有方法的所有方法 Object Args=new Object 1,2;JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态 for(int i=0;i 2;i+)System.out.println(mi.toString();System.out.println(m0.invoke(x,Args);/调用用对象的第象的第1个方法个方法 Method addm=myclass.getMethod(add,int.class,int.class);System.
29、out.println(addm.invoke(x,Args);/调用用add方法方法 JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态1.公共公共访问控制符控制符 public 作作为类的修的修饰符符,将,将类声明声明为公共公共类,表明它可以被所有的表明它可以被所有的其它其它类所所访问和引用。和引用。作作为类的成的成员的的访问修修饰符符,表明在其他,表明在其他类中可以无限制地中可以无限制地访问该成成员。要真正做到要真正做到类成成员可以在任何地方可以在任何
30、地方访问,在,在进行行类设计时必必须同同时满足两点:足两点:首先首先类被定被定义为public,其次,其次,类的成的成员被定被定义为public。从从类类-成员成员看访问限制看访问限制JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态2.缺省缺省访问控制符控制符没有没有给出出访问控制符情形控制符情形 该类只能被只能被同一个包中同一个包中的的类访问和引用和引用 JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态3.私有私有访问控制符控制符 private 用用privateprivate修饰的域或方法只能在该
31、类自身中访问修饰的域或方法只能在该类自身中访问【例例6-7】测试对私有成私有成员的的访问。class Myclass private int a;/私有私有变量量 void display()System.out.println(a);public class test public static void main(String arg)Myclass my=new Myclass();my.a=5;my.display();JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态4.保保护访问控制符控制符 protected 用用protected修修
32、饰的成的成员可以在三种可以在三种类中所引用中所引用:该类本身;本身;与它在同一个包中的其它与它在同一个包中的其它类;在其它包中的在其它包中的该类的子的子类。JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态【例例6-8】测试包的包的访问控制控制文件文件1:PackageData.java(该文件存放在文件存放在sub子目子目录下)下)package sub;public class PackageData protected static int number=1;文件文件2:Mytest.java import sub.*;public class
33、 Mytest public static void main(String args)System.out.println(result=+PackageData.number);JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态各各类访问控制符的作用控制符的作用可直接访问修饰同一类中同一包中不同包的子类中其他privateYes默认默认YesYesprotectedYesYesYespublicYesYesYesYesJavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.5final修修饰符符 fina
34、lfinal作为类修饰符作为类修饰符 -最最终类(不能有子(不能有子类)用用finalfinal修饰方法修饰方法 -不能被子不能被子类重新定重新定义 用用finalfinal定义常量定义常量 -只能只能赋值一次一次 注意:注意:如果将引用如果将引用类型的型的变量量标记为final,那么那么该变量固量固定指向一个定指向一个对象,但可以改象,但可以改变对象内的属性象内的属性值。final意味着不能改变,到此为止!意味着不能改变,到此为止!JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态例例6-9 常量常量赋值测试public final class A
35、ssignTest public static int totalNumber=5;public final int id;public int weight;public AssignTest(int weight)id=totalNumber+;this.weight=weight;public static void main(String args)final AssignTest t=new AssignTest(5);t.weight=t.weight+2;t=new AssignTest(4);/不允不允许 t.id+;/不允不允许 与普通属性变量不与普通属性变量不同的是,系统不
36、会给同的是,系统不会给常量赋默认初值常量赋默认初值.JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.6.1 对象引用象引用赋值转换 l允许将子类对象赋值给父类引用允许将子类对象赋值给父类引用。public class A void test(Object obj)System.out.println(test(Object):+obj);void test(String str)System.out.println(test(String):+str);public static void main(String args)A a1=new A
37、();a1.test(hello);如果将如果将test(Stringstr)方法定义注释掉,则运行结方法定义注释掉,则运行结果如何果如何?test(String):hello运行结果运行结果运行结果运行结果test(Object):hello运行结果运行结果运行结果运行结果父概念包含子概念父概念包含子概念!JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态6.6.2 对象引用象引用强制制转换 将父类引用赋值给子类变量时要进行强制转换,将父类引用赋值给子类变量时要进行强制转换,强制转强制转换换在编译时总是认可的,但运行时的情况取决于对象的值在编译时总
38、是认可的,但运行时的情况取决于对象的值。Object m=new String(123);/允允许,父,父类变量引用子量引用子类对象象 String y=m;/不允不允许 String y=(String)m;/强制制转换,编译允允许,且运行没,且运行没问题 Integer p=(Integer)m;/强制制转换,编译允允许,但运行,但运行时出出错JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态写运行写运行结果果public class Test6 static void m(double x)System.out.println(m(double
39、):+x);static void m(Object obj)System.out.println(m(Object):+obj);public static void main(String args)m(hello);m(5);m(Object):hellom(double):5.0运行结果运行结果运行结果运行结果JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态 问题思考思考继承意味着什么继承意味着什么?什么是变量的隐藏什么是变量的隐藏?子类构造方法与父类构造方法有何联系子类构造方法与父类构造方法有何联系?什么是参数多态什么是参数多态?什么是覆
40、盖多态什么是覆盖多态?访问控制符有哪些访问控制符有哪些?finalfinal修饰符作用于类、方法、变量上的含义修饰符作用于类、方法、变量上的含义?supersuper的作用的作用?如何访问父类的方法和构造方法如何访问父类的方法和构造方法?对象引用转换赋值的特点对象引用转换赋值的特点?JavaJava语言程序设计语言程序设计(第第2 2版版)第第6 6章章 继承与多态继承与多态 作作业1.1.定义一个定义一个PersonPerson类类,含,含:姓名、性别、年龄等字段;继承姓名、性别、年龄等字段;继承PersonPerson类设类设计计TeacherTeacher类类,增加:职称、部门等字段;继
41、承,增加:职称、部门等字段;继承PersonPerson类设计类设计StudentStudent类类,增加:学号、班级等字段。定义各类的构造方法和,增加:学号、班级等字段。定义各类的构造方法和toStringtoString()()方法,并分别创建对象进行测试。方法,并分别创建对象进行测试。2.设计一个一个矩矩阵类,其中,封装有一个数,其中,封装有一个数组,含,含求所有元素和的方法。求所有元素和的方法。方阵方阵继承继承矩矩阵类,构造,构造时要求数据的行、列相同,并提供求主要求数据的行、列相同,并提供求主对角角线元素和的方法,用随机数构建元素和的方法,用随机数构建6x6方阵,输出方阵,并求所有元素方阵,输出方阵,并求所有元素和、和、主主对角角线元素和。元素和。3.编写一个写一个Person类,其中有,其中有name属性和属性和work()方法,()方法,该方法方法输出出“正在工作正在工作.”。继承承Person类编写写足球运足球运动员和和歌手歌手,为子子类编写写work方法,足球运方法,足球运动员的工作是的工作是“踢球踢球”,歌手的工作是,歌手的工作是“唱歌唱歌”。分分别创建父建父类和子和子类对象象给Person类型的型的变量量赋值,调用用work方方法法进行行测试。
限制150内