【教学课件】第8章接口、继承和多态.ppt

上传人:牧羊曲112 文档编号:4879264 上传时间:2023-05-21 格式:PPT 页数:69 大小:959.50KB
返回 下载 相关 举报
【教学课件】第8章接口、继承和多态.ppt_第1页
第1页 / 共69页
【教学课件】第8章接口、继承和多态.ppt_第2页
第2页 / 共69页
【教学课件】第8章接口、继承和多态.ppt_第3页
第3页 / 共69页
【教学课件】第8章接口、继承和多态.ppt_第4页
第4页 / 共69页
【教学课件】第8章接口、继承和多态.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《【教学课件】第8章接口、继承和多态.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第8章接口、继承和多态.ppt(69页珍藏版)》请在三一办公上搜索。

1、第8章 接口、继承和多态,本章要点,掌握接口的使用掌握类的继承掌握使用super关键字了解什么是多态,第8章 接口、继承和多态,8.1 接口的使用8.2 类的继承8.3 多态8.4 Object类8.5 对象类型的转换8.6 instanceof判断对象类型,主要内容,8.2 类的继承,8.2.1 继承的实现8.2.2 继承中的重写8.2.3 使用super关键字,8.2.1 继承的实现,继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。Java中只允许每个子类拥有一个直接父类,即单继承。在Java语言中,继承通过关键字extends来实现。即在子类的声

2、明中,通过使用关键字extends来显式的指明其父类。,8.2.1 继承的实现,其基本的语法格式如下:修饰符 class 子类名 extends 父类名 类体,public class Husband protected String name;protected int age;protected String sex;private Wife wife;,public class Wife protected String name;protected int age;protected String sex;private Husband husband;,public class Pe

3、rson protected String name;protected int age;protected String sex;,public class Husband private Wife wife;,public class Wife private Husband husband;,子类可以继承父类的所有非私有成员变量和成员方法。,8.2.1 继承的实现,【例8-3】创建Bird类,定义一个成员变量描述颜色。创建Pigeon类,它继承了Bird类。在构造方法中,对继承的color变量赋值。,public class Bird String color;public class

4、Pigeon extends Bird public Pigeon()color=White;,8.2.1 继承的实现,成员的继承子类可以自行声明新的成员变量子类可以声明新的成员方法子类可以声明与父类具有相同签名的成员方法,即方法的重写。子类可以声明与父类中同名方法的重载方法。,8.2.2 继承中的重写,重写是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,此时,称为子类的方法重写了父类的方法。重写体现了子类补充或者改变父类方法的能力。通过重写,可以使一个方法在不同的子类中表现出不同的行为。,class A

5、public void f()System.out.println(this is fatherclass!);public class myapp extends A public void f1()/增加新的成员方法 System.out.println(this is subclass!);public static void main(String args)myapp a=new myapp();a.f();,class A public void f()System.out.println(this is fatherclass!);public class myapp exten

6、ds A public void f()/方法的重写 System.out.println(this is subclass!);public static void main(String args)myapp a=new myapp();a.f();,class A public void f()System.out.println(this is fatherclass!);public class myapp extends A public void f(String str)/方法的重载 System.out.println(this is subclass!+str);publi

7、c static void main(String args)myapp a=new myapp();a.f(abc);,8.2.3 使用super关键字,子类可以继承父类的非私有成员变量和成员方法。但若子类中声明的成员变量与父类的成员变量同名,则子类的成员变量隐藏了父类的成员变量。若子类中声明的成员方法与父类的成员方法同名,并且方法的返回值类型、参数个数和类型也完全相同,则子类的成员方法重写了父类的成员方法。,8.2.3 使用super关键字,若想在子类中访问父类中被隐藏的成员变量和被重写的成员方法,可以使用super关键字来操作。super关键字主要有以下两种用途。1.调用父类的构造方法若

8、要创建子类对象时希望对从父类继承的成员变量初始化,需在子类的构造方法中利用super调用父类的构造方法。,8.2.3 使用super关键字,1.调用父类的构造方法构造格式:super(参数列表);利用super调用父类构造方法的语句必须作为子类构造方法中的第一条语句。若第一条语句不是调用父类构造方法的语句,系统会自动插入一条调用父类默认构造方法的语句,如果父类没有不带参数的构造方法,则会出现编译错误。,public class Circle private int r;public Circle()r=0;public Circle(int r1)r=r1;public int getR()r

9、eturn r;,public class Cylinder extends Circle int x,y;public Cylinder()super();x=0;y=0;public Cylinder(int r1,int x1,int y1)super(r1);x=x1;y=y1;,public static void main(String args)Cylinder cy=new Cylinder();Cylinder cy2=new Cylinder(1,2,3);System.out.println(cy);System.out.println(cy2);,半径:0 坐标:(0,

10、0)半径:1 坐标:(2,3),public String toString()return 半径:+getR()+坐标:(+x+,+y+);,8.2.3 使用super关键字,super关键字主要有以下两种用途。2.操作被隐藏的成员变量和被重写的成员方法具体格式:super.成员变量名 super.成员方法名(参数列表),class Father public String v=Father;public String x=Father类的成员变量x!;public Father()System.out.println(Father构造方法被调用!);public void outinfo(

11、)System.out.println(Father的outinfo方法被调用);,public class Son extends Fatherpublic String v=Son;public Son()super();System.out.println(Son构造方法被调用!);/覆盖了超类成员方法outinfo()public void outinfo()System.out.println(Son的outinfo()方法被调用);,public void test()String v=哈哈哈哈!;System.out.println(-1-);System.out.println

12、(v);System.out.println(this.v);System.out.println(super.v);System.out.println(-2-);System.out.println(x);System.out.println(super.x);System.out.println(-3-);outinfo();this.outinfo();super.outinfo();,public static void main(String args)Son son=new Son();son.test();,8.3 多态,对于同一个消息,不同类的对象可以作出不同的反应被称为多态

13、性。在Java中,通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态性。方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。,8.3 多态,【例8-5】在项目中创建MaxNumber类,定义两个getMax()方法,分别用来比较int类型和double类型变量并获得最大值。,public class MaxNumber public static int getMax(int number1,int number2)return

14、(number1 number2?number1:number2);,public class MaxNumber public static int getMax()public static double getMax(double number1,double number2)return(number1 number2?number1:number2);public static void main(String args)int intMax=getMax(12,21);System.out.println(12和21最大值:+intMax);double doubleMax=get

15、Max(12.0,21.0);System.out.println(12.0和21.0最大值:+doubleMax);,8.3 多态,通过方法的重写实现多态是指一个给定类型的变量可以引用不同类型的对象,并且能够自动地调用变量所引用的对象类型的特定成员方法。在Java中,实现这种处理机制的方法是利用指向父类对象的引用指向其子类对象,并根据该引用所指的当前子类类型,选择执行哪一个子类中重写的成员方法。,class BaseClasspublic void f()System.out.println(father);class DeriveClass1 extends BaseClasspublic

16、 void f()System.out.println(son1);class DeriveClass2 extends BaseClasspublic void f()System.out.println(son2);,public class myapp public static void main(String args)BaseClass bc=new BaseClass3;bc0=new BaseClass();bc0.f();bc1=new DeriveClass1();bc1.f();bc2=new DeriveClass2();bc2.f();,fatherson1son2,

17、8.4 Object类,8.4.1 getClass()方法8.4.2 toString()方法8.4.3 equals()方法,8.4 Object类,在Java中,所有的类都直接或间接继承了类。Object类是所有类的父类,是Java类层中最高层类,Java中任何一个类都是它的子类。当创建一个类时,总是在继承,除非某个类已经指定要从其他类继承,否则它就是从类继承而来的,如String、Integer等类都是继承于Object类除此之外自定义的类也都继承于Object类,8.4 Object类,由于所有类都是Object子类,所以在定义类时,省略了extends Object关键字。,8.4

18、 Object类,Java将所有的类都作为Object类的子类。1)一个Object类型的对象可以用来引用任何类的对象。2)可以将成员方法的参数设置为Object类型,以方便方法能够接收参数传递进来的任何类型的对象。3)在Object类中提供了所有对象都应该有的行为方法,可以更好地统一这些成员方法的接口形式。,8.4 Object类,1)getClass()方法getClass()方法是Object类的定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下:getClass().getname();可以将getClass()方法与to

19、String()方法联合使用。,8.4 Object类,2)toString()方法toString()方法的功能是将一个对象返回为字符串形式,返回一个String实例。在实际应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。在输出引用类型变量时,也会自动调用toString()方法。,8.4 Object类,【例8-6】重写toString方法,public class ToStringDemo Override public String toString()return ToStringD

20、emo类;public static void main(String args)ToStringDemo t=new ToStringDemo();System.out.println(t);,8.4 Object类,toString()方法重写的几点说明必须被声明为public返回类型为String方法的名称必须为toString,且没有参数在方法体中不要使用输出方法(),8.4 Object类,3)equals()方法“=”操作符可以用来比较两个基本类型的变量值是否相同,还可以比较两个引用是否指向同一个对象。Object类中定义的equals()方法,其默认实现也是比较两个引用是否指向同

21、一个对象。这在实际开发中并无任何意义。因此通常需要重写该方法来比较实际内容是否相同。,注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。,8.4 Object类,【例8-7】在项目中创建EqualsDemo类,在主方法中使用“=”和equals()方法来比较内容相同的两个字符串对象。,public static void main(String args)String s1=new String(mrsoft);String s2=new String(mrsoft);System.out.

22、println(s1+和+s2+指向同一对象:+(s1=s2);System.out.println(s1+和+s2+内容相同:+(s1.equals(s2);,public class Circle protected int r;public Circle()r=0;public Circle(int r1)r=r1;public boolean equals(Circle s)if(s.r=r)return true;else return false;public static void main(String args)Circle c1=new Circle();Circle c2

23、=new Circle(0);System.out.println(c1.equals(c2);,补充:装箱和拆箱,在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型)。基本类型的数据不是对象,不能作为对象调用其toString()、hashCode()、getClass()、equals()等等方法。所以在java中,针对8种基本数据类型,提供了针对每个基本数据类型的包装类。,INDEX 基本数据类型 包装类 1 int Integer 2 char Character 3 float Float 4 double Double 5 byte Byte 6

24、short Short 7 long Long 8 boolean Boolean,补充:装箱和拆箱,补充:装箱和拆箱,所谓装箱,就是把基本类型用它们相应的引用类型包起来,使它们可以具有对象的特质把int型包装成Integer类的对象,把double包装成Double,等等。所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。,补充:装箱和拆箱,/JDK1.5 之前使用手动方式进行装箱和拆箱的操作,public class IntegerDemo public static void main(String agrs)int i=10;In

25、teger j=new Integer(i);/手动装箱操作 int i1=j.intValue();/手动拆箱操作 System.out.println(i1*i1);,public class IntegerDemo02 public static void main(String agrs)int i=10 Integer j=i;int k=j;System.out.println(+k);,补充:装箱和拆箱,/JDK1.5之后可自动进行的装箱和拆箱的操作,比较方便,8.5 对象类型的转换,8.5.1 向上转型8.5.2 向下转型,8.5.1 向上转型,向上转型:将子类对象看做是父类的

26、对象。向上转型是从一个较具体的类到较抽象的类之间的转换,总是安全的。,8.5.1 向上转型,【例8-8】创建Parallelogram类,在类中创建Quadrangle类,并使Parallelogram类继承Quadrangle类,然后在主方法中调用父类的draw()方法。,class Quadrangle public static void draw(Quadrangle q)/SomeSentence public class Parallelogram extends Quadrangle public static void main(String args)Parallelogra

27、m p=new Parallelogram();draw(p);,8.5.2 向下转型,向下转型是将较抽象类转换为较具体的类。子类对象总是父类的一个实例,但是父类对象不一定是子类的实例。因此在程序中使用向下转型技术时,必须使用显式类型转换,向编译器指明将父类对象转换为哪一种类型的子类对象。,8.5.2 向下转型,【例8-9】修改例8-8,在Parallelogram类的主方法中将父类Quadrangle的对象赋值给子类Parallelogram的对象的引用变量将使程序产生错误。,class Quadrangle public static void draw(Quadrangle q)/Som

28、eSentence public class Parallelogram extends Quadrangle public static void main(String args)draw(new Parallelogram();Quadrangle q=new Parallelogram();/Parallelogram p=q;Parallelogram p=(Parallelogram)q;,8.5.2 向下转型,如果将父类对象直接赋予子类,将会发生编译器错误,因为父类对象不一定是子类实例例如一个四边形不一定就是指平行四边形,也许它是梯形,也许是正方形,也许是其他带有四个边的不规则图

29、形。,8.5.2 向下转型,做向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题,所以这时需要告知编译器这个四边形就是平行四边形,将父类对象强制转换为某个子类对象,这种方式称为显式类型转换,8.1 接口的使用,8.1.1 接口的定义8.1.2 接口的实现,8.1 接口的使用,可以把用于完成特定功能的若干属性(方法)组织成相对独立的属性(方法)集合,凡是需要实现这种特定功能的类,都可以继承这个集合,并在类内使用它,这种集合就是接口。,8.1.1 接口的定义,使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义

30、两部分组成。定义接口的基本语法格式如下:,修饰符 interface 接口名 extends 父接口名列表 public static final 变量;public abstract 方法;,8.1.1 接口的定义,表8-1 定义接口的语法格式的参数说明,8.1.1 接口的定义,接口的特点:与抽象类一样都是定义多个类的共同属性使抽象概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体也可以包含基本数据类型的数据成员,但它们都默认为static和final,8.1.1 接口的定义,【例8-1】创建接口,

31、public interface ICircle double PI=3.14159;double getCircumference(double radius);double getArea(double radius);double getVolume(double radius);,8.1.2 接口的实现,因为接口中的属性都是常量,接口中的方法都是没有方法体的抽象方法。接口定义的仅仅是实现某一特定功能的一组功能的对外接口和规范,而并没有真正实现这个功能,这个功能的真正实现是在“继承”这个接口的各个类中完成的,要由这些类来具体定义接口中各抽象方法的方法体。,8.1.2 接口的实现,接口的应

32、用:规定某些类应该实现的方法调用接口。通过定义一个能实现多个接口的类,模拟类的多重继承。接口在定义后,就可以在类中实现该接口。,8.1.2 接口的实现,在类中实现接口可以使用关键字implements基本语法格式如下所示:修饰符 class extends 父类名 implements 接口列表 在非抽象类中实现接口时,方法名、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。,8.1.2 接口的实现,【例8-2】创建类实现接口,public class Circle implements ICircle Override public double getCi

33、rcumference(double radius)return 2*PI*radius;Override public double getArea(double radius)return PI*radius*radius;Override public double getVolume(double radius)return 4*PI*radius*radius*radius/3.0;,8.6 instanceof判断对象类型,当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前应使用instanceof

34、操作符来判断父类对象是否为子类对象的实例。instanceof操作符可以用来判断一个类是否实现了某个接口,也可以用来判断一个实例对象是否属于一个类。,8.6 instanceof判断对象类型,instanceof的语法格式如下:myobject instanceof ExampleClass myobject:某类的对象引用。ExampleClass:某个类。使用instanceof操作符的表达式返回值为布尔值。如果使用instanceof操作符的表达式返回值为true,说明myobject对象为ExampleClass的实例对象,如果返回值为false,说明myobject对象不是Examp

35、leClass的实例对象。,父类对象,子类名,class Quadrangle public static void draw(Quadrangle q)/SomeSentence class Square extends Quadrangle/SomeSentenceclass Anything/SomeSentence,public class Parallelogram extends Quadrangle public static void main(String args)Quadrangle q=new Quadrangle();if(q instanceof Parallelo

36、gram)Parallelogram p=(Parallelogram)q;if(q instanceof Square)Square s=(Square)q;/由于q对象不为Anything类的对象,所以这条语句是错误的/System.out.println(q instanceof Anything);,知识点提炼,1)Java中使用interface关键字来定义接口,在接口中可以包含常量和方法。2)使用extends关键字可以继承类,使用implement关键字可以实现接口。3)Java中的类可以继承一个类,可以实现多个接口。4)通过继承,可以让子类获得父类中定义的非私有成员变量和方法。5)对于继承的方法,可以在子类中进行重写,知识点提炼,6)在重写方法时,要保证方法名称和参数与父类完全相同,并且访问权限不能减小。7)使用super关键字可以调用父类中定义的构造方法。8)即使子类隐藏了父类中定义的成员变量和成员方法,还可以使用super关键字调用。9)使用Override注解可以减少重写方法时出现的错误。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号