【教学课件】第8章接口、继承和多态.ppt
第第8章章 接口、继承和多态接口、继承和多态本章要点本章要点u掌握接口的使用掌握接口的使用u掌握类的继承掌握类的继承u掌握使用掌握使用super关键字关键字u了解什么是多态了解什么是多态第第8章章 接口、继承和多态接口、继承和多态n n8.1 接口的使用接口的使用n n8.2 类的继承类的继承n n8.3 多态多态n n8.4 Object类类n n8.5 对象类型的转换对象类型的转换n n8.6 instanceof判断对象类型判断对象类型主要内容主要内容8.2 类的继承类的继承n8.2.1 继承的实现继承的实现n8.2.2 继承中的重写继承中的重写n8.2.3 使用使用super关键字关键字8.2.1 继承的实现继承的实现n继承是指一个类的定义可以基于另外一个已继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父经存在的类,即子类基于父类,从而实现父类代码的类代码的重用重用。nJava中只允许每个子类拥有中只允许每个子类拥有一个一个直接父类直接父类,即单继承。即单继承。n在在Java语言中,继承通过关键字语言中,继承通过关键字extends来来实现。即在子类的声明中,通过使用关键字实现。即在子类的声明中,通过使用关键字extends来显式的指明其父类。来显式的指明其父类。8.2.1 继承的实现继承的实现n其基本的语法格式如下:其基本的语法格式如下:修饰符修饰符 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 Person protected String name;protected int age;protected String sex;public class Husband private Wife wife;public class Wife private Husband husband;n子类可以继承子类可以继承父类的所有非父类的所有非私有成员变量私有成员变量和成员方法。和成员方法。8.2.1 继承的实现继承的实现【例例8-3】创建创建Bird类,定义一个成员变量描类,定义一个成员变量描述颜色。创建述颜色。创建Pigeon类,它继承了类,它继承了Bird类。在类。在构造方法中,对继承的构造方法中,对继承的color变量赋值。变量赋值。public class Bird String color;public class Pigeon extends Bird public Pigeon()color=White;8.2.1 继承的实现继承的实现n成员的继承成员的继承子类可以自行声明子类可以自行声明新的成员变量新的成员变量子类可以声明子类可以声明新的成员方法新的成员方法子类可以声明与父类具有相同子类可以声明与父类具有相同签名签名的成员的成员方法,即方法的方法,即方法的重写重写。子类可以声明与父类中同名方法的子类可以声明与父类中同名方法的重载方重载方法法。8.2.2 继承中的重写继承中的重写n重写是指父子类之间的关系,当子类继承父重写是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,类中所有可能被子类访问的成员方法时,如如果子类的方法名与父类的方法名相同,果子类的方法名与父类的方法名相同,那么那么子类就不能继承父类的方法,此时,称为子子类就不能继承父类的方法,此时,称为子类的方法类的方法重写重写了父类的方法。了父类的方法。n重写体现了子类补充或者改变父类方法的能重写体现了子类补充或者改变父类方法的能力。力。通过重写,可以使一个方法在不同的子通过重写,可以使一个方法在不同的子类中表现出不同的行为类中表现出不同的行为。class A 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 extends 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);public static void main(String args)myapp a=new myapp();a.f(abc);8.2.3 使用使用super关键字关键字n子类可以子类可以继承继承父类的非私有成员变量和成员父类的非私有成员变量和成员方法。方法。n但若子类中声明的成员变量与父类的但若子类中声明的成员变量与父类的成员变成员变量同名量同名,则子类的成员变量,则子类的成员变量隐藏隐藏了父类的成了父类的成员变量。员变量。n若子类中声明的成员方法与父类的若子类中声明的成员方法与父类的成员方法成员方法同名同名,并且方法的,并且方法的返回值类型、参数个数和返回值类型、参数个数和类型也完全相同类型也完全相同,则子类的成员方法,则子类的成员方法重写重写了了父类的成员方法。父类的成员方法。8.2.3 使用使用super关键字关键字n若想在子类中访问父类中被隐藏的成员变量若想在子类中访问父类中被隐藏的成员变量和被重写的成员方法,可以使用和被重写的成员方法,可以使用super关键字关键字来操作。来操作。nsuper关键字主要有以下两种用途。关键字主要有以下两种用途。n1.调用父类的构造方法调用父类的构造方法若要创建子类对象时希望对从父类继承的若要创建子类对象时希望对从父类继承的成员变量初始化成员变量初始化,需在子类的构造方法中,需在子类的构造方法中利用利用super调用父类的构造方法。调用父类的构造方法。8.2.3 使用使用super关键字关键字n1.调用父类的构造方法调用父类的构造方法构造格式:构造格式:super(参数列表参数列表);利用利用super调用父类构造方法的语句必须作调用父类构造方法的语句必须作为子类构造方法中的第一条语句。为子类构造方法中的第一条语句。若第一条语句不是调用父类构造方法的语若第一条语句不是调用父类构造方法的语句,系统会自动插入一条调用父类默认构句,系统会自动插入一条调用父类默认构造方法的语句,如果父类没有不带参数的造方法的语句,如果父类没有不带参数的构造方法,则会出现编译错误。构造方法,则会出现编译错误。public class Circle private int r;public Circle()r=0;public Circle(int r1)r=r1;public int getR()return 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,0)半径:半径:1 坐标:坐标:(2,3)public String toString()return 半径半径:+getR()+坐标坐标:(+x+,+y+);8.2.3 使用使用super关键字关键字nsuper关键字主要有以下两种用途。关键字主要有以下两种用途。n2.操作被隐藏的成员变量和被重写的成员方法操作被隐藏的成员变量和被重写的成员方法具体格式:具体格式:super.成员变量名成员变量名 super.成员方法名成员方法名(参数列表参数列表)class Father public String v=Father;public String x=Father类的成员变量类的成员变量x!;public Father()System.out.println(Father构造方法被调用构造方法被调用!);public void outinfo()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(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 多态多态n对于同一个消息,不同类的对象可以作出不对于同一个消息,不同类的对象可以作出不同的反应被称为同的反应被称为多态性多态性。n在在Java中,通常使用中,通常使用方法的重载方法的重载(Overloading)和重写和重写(Overriding)实现类的实现类的多态性。多态性。n方法的重载是指在一个类中,出现方法的重载是指在一个类中,出现多个方法多个方法名相同,但参数个数或参数类型不同的方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。则称为方法的重载。Java在执行具有重载关在执行具有重载关系的方法时,将系的方法时,将根据调用参数的个数和类型根据调用参数的个数和类型区分具体执行的是哪个方法区分具体执行的是哪个方法。8.3 多态多态【例例8-5】在项目中创建在项目中创建MaxNumber类,定类,定义两个义两个getMax()方法,分别用来比较方法,分别用来比较int类型和类型和double类型变量并获得最大值。类型变量并获得最大值。public class MaxNumber public static int getMax(int number1,int number2)return(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=getMax(12.0,21.0);System.out.println(12.0和和21.0最大值最大值:+doubleMax);class BaseClasspublic void f()System.out.println(father);class DeriveClass1 extends BaseClasspublic 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();fatherson1son28.4 Object类类n8.4.1 getClass()方法方法n8.4.2 toString()方法方法n8.4.3 equals()方法方法8.4 Object类类n在在Java中,所有的类都直接或间接继承了类。中,所有的类都直接或间接继承了类。nObject类是所有类的父类类是所有类的父类,是,是Java类层中最类层中最高层类,高层类,Java中任何一个类都是它的子类。中任何一个类都是它的子类。n当创建一个类时,总是在继承,除非某个类当创建一个类时,总是在继承,除非某个类已经指定要从其他类继承,否则它就是从类已经指定要从其他类继承,否则它就是从类继承而来的,继承而来的,如如String、Integer等类都是继承于等类都是继承于Object类类除此之外自定义的类也都继承于除此之外自定义的类也都继承于Object类类8.4 Object类类n由于所有类都是由于所有类都是Object子类,所以在定义类子类,所以在定义类时,省略了时,省略了extends Object关键字。关键字。8.4 Object类类nJava将所有的类都作为将所有的类都作为Object类的子类。类的子类。1)一个一个Object类型的对象可以用来类型的对象可以用来引用任引用任何类的对象何类的对象。2)可以将成员方法的可以将成员方法的参数设置为参数设置为Object类类型型,以方便方法能够接收参数传递进来的任,以方便方法能够接收参数传递进来的任何类型的对象。何类型的对象。3)在在Object类中提供了所有对象都类中提供了所有对象都应该有应该有的行为方法的行为方法,可以更好地统一这些成员方法,可以更好地统一这些成员方法的接口形式。的接口形式。8.4 Object类类n1)getClass()方法方法getClass()方法是方法是Object类的定义的方法,类的定义的方法,它会返回它会返回对象执行时的对象执行时的Class实例实例,然后,然后使用此实例调用使用此实例调用getName()方法可以取得方法可以取得类的名称。语法如下:类的名称。语法如下:getClass().getname();可以将可以将getClass()方法与方法与toString()方法方法联合使用。联合使用。8.4 Object类类n2)toString()方法方法toString()方法的功能是方法的功能是将一个对象返回为将一个对象返回为字符串形式,字符串形式,返回一个返回一个String实例。实例。在实际应用中通常重写在实际应用中通常重写toString()方法,为方法,为对象提供一个特定的输出模式。对象提供一个特定的输出模式。当这个类当这个类转换为字符串或与字符串连接转换为字符串或与字符串连接时,时,将自动调用重写的将自动调用重写的toString()方法。方法。在在输出输出引用类型变量时,也会自动调用引用类型变量时,也会自动调用toString()方法。方法。8.4 Object类类【例例8-6】重写重写toString方法方法public class ToStringDemo Override public String toString()return ToStringDemo类类;public static void main(String args)ToStringDemo t=new ToStringDemo();System.out.println(t);8.4 Object类类ntoString()方法方法重写重写的几点说明的几点说明必须被声明为必须被声明为public返回类型为返回类型为String方法的名称必须为方法的名称必须为toString,且没有参数且没有参数在方法体中不要使用输出方法在方法体中不要使用输出方法()8.4 Object类类n3)equals()方法方法“=”操作符可以用来比较两个基本类型操作符可以用来比较两个基本类型的变量值是否相同,还可以比较两个引用的变量值是否相同,还可以比较两个引用是否指向同一个对象。是否指向同一个对象。Object类中定义的类中定义的equals()方法,其默认方法,其默认实现也是比较两个引用是否指向同一个对实现也是比较两个引用是否指向同一个对象。这在实际开发中并无任何意义。因此象。这在实际开发中并无任何意义。因此通常需要重写该方法来比较实际内容是否通常需要重写该方法来比较实际内容是否相同。相同。注意:注意: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.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=new Circle(0);System.out.println(c1.equals(c2);补充:装箱和拆箱补充:装箱和拆箱n在在java中,数据类型总共可分为两大种,基中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据本数据类型(值类型)和类类型(引用数据类型)。基本类型的数据不是对象,不能作类型)。基本类型的数据不是对象,不能作为对象调用其为对象调用其toString()、hashCode()、getClass()、equals()等等方法。等等方法。n所以在所以在java中,针对中,针对8种基本数据类型,提供种基本数据类型,提供了针对每个基本数据类型的包装类。了针对每个基本数据类型的包装类。INDEX 基本数据类型基本数据类型 包装类包装类 1 int Integer 2 char Character 3 float Float 4 double Double 5 byte Byte 6 short Short 7 long Long 8 boolean Boolean补充:装箱和拆箱补充:装箱和拆箱补充:装箱和拆箱补充:装箱和拆箱n所谓装箱,就是把基本类型用它们相应的引所谓装箱,就是把基本类型用它们相应的引用类型包起来用类型包起来,使它们可以具有对象的特质,使它们可以具有对象的特质把把int型包装成型包装成Integer类的对象,类的对象,把把double包装成包装成Double,等等。,等等。n所谓拆箱所谓拆箱,就是跟装箱的方向相反,将,就是跟装箱的方向相反,将Integer及及Double这样的这样的引用类型的对象重引用类型的对象重新简化为值类型的数据。新简化为值类型的数据。补充:装箱和拆箱补充:装箱和拆箱n/JDK1.5 之前使用手动方式进行装箱和拆箱的之前使用手动方式进行装箱和拆箱的操作操作public class IntegerDemo public static void main(String agrs)int i=10;Integer 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);补充:装箱和拆箱补充:装箱和拆箱n/JDK1.5之后可自动进行的装箱和拆箱的操作,之后可自动进行的装箱和拆箱的操作,比较方便比较方便8.5 对象类型的转换对象类型的转换n8.5.1 向上转型向上转型n8.5.2 向下转型向下转型8.5.1 向上转型向上转型n向上转型:向上转型:将子类对象看做是父类的对象将子类对象看做是父类的对象。n向上转型是从一个较具体的类到较抽象的类向上转型是从一个较具体的类到较抽象的类之间的转换,总是安全的。之间的转换,总是安全的。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)Parallelogram p=new Parallelogram();draw(p);8.5.2 向下转型向下转型n向下转型是将较抽象类转换为较具体的类。向下转型是将较抽象类转换为较具体的类。n子类对象总是父类的一个实例,但是父类对子类对象总是父类的一个实例,但是父类对象不一定是子类的实例。象不一定是子类的实例。n因此在程序中使用向下转型技术时,因此在程序中使用向下转型技术时,必须使必须使用显式类型转换用显式类型转换,向编译器指明将父类对象,向编译器指明将父类对象转换为哪一种类型的子类对象。转换为哪一种类型的子类对象。8.5.2 向下转型向下转型【例例8-9】修改例修改例8-8,在,在Parallelogram类的主类的主方法中将父类方法中将父类Quadrangle的对象赋值给子类的对象赋值给子类Parallelogram的对象的引用变量将使程序产生错的对象的引用变量将使程序产生错误。误。class Quadrangle public static void draw(Quadrangle q)/SomeSentence 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 向下转型向下转型n如果将父类对象如果将父类对象直接直接赋予子类,将会发生编赋予子类,将会发生编译器错误,因为父类对象译器错误,因为父类对象不一定是不一定是子类实例子类实例例如一个四边形不一定就是指平行四边形,例如一个四边形不一定就是指平行四边形,也许它是梯形,也许是正方形,也许是其也许它是梯形,也许是正方形,也许是其他带有四个边的不规则图形。他带有四个边的不规则图形。8.5.2 向下转型向下转型n做向下转型操作时,将特性范围小的对象转做向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题,换为特性范围大的对象肯定会出现问题,n所以这时需要告知编译器这个四边形就是平所以这时需要告知编译器这个四边形就是平行四边形,将行四边形,将父类对象强制转换为某个子类父类对象强制转换为某个子类对象对象,这种方式称为显式类型转换,这种方式称为显式类型转换8.1 接口的使用接口的使用n8.1.1 接口的定义接口的定义n8.1.2 接口的实现接口的实现8.1 接口的使用接口的使用n可以把用于完成特定功能的若干属性可以把用于完成特定功能的若干属性(方法方法)组织成相对独立的属性组织成相对独立的属性(方法方法)集合,凡是需集合,凡是需要实现这种特定功能的类,都可以继承这个要实现这种特定功能的类,都可以继承这个集合,并在类内使用它,这种集合就是接口。集合,并在类内使用它,这种集合就是接口。8.1.1 接口的定义接口的定义n使用使用interface来定义一个接口。来定义一个接口。接口定义同类接口定义同类的定义类似,也是分为接口的声明和接口体的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义两部分组成。其中接口体由变量定义和方法定义两部分组成。定义接口的基本语法格式如下:定义接口的基本语法格式如下:修饰符修饰符 interface 接口名接口名 extends 父接口名列表父接口名列表 public static final 变量变量;public abstract 方法方法;8.1.1 接口的定义接口的定义表表8-1 8-1 定义接口的语法格式的参数说明定义接口的语法格式的参数说明参数参数说明说明修修饰符符可可选参数,用于指定接口的参数,用于指定接口的访问权限,可限,可选值为public。如果省略如果省略则使用默使用默认的的访问权限限接口名接口名必必选参数,用于指定接口名称,接口名必参数,用于指定接口名称,接口名必须是合法的是合法的Java标识符。一般情况下,要求首字母大写符。一般情况下,要求首字母大写extends父父接口列表接口列表可可选参数,用于指定要定参数,用于指定要定义的接口的接口继承于哪个父接口。承于哪个父接口。当使用当使用extends关关键字字时,父接口名,父接口名为必必选参数参数方法方法接口中的的方法只有定接口中的的方法只有定义而没有被而没有被实现8.1.1 接口的定义接口的定义n接口的特点:接口的特点:与抽象类一样都是定义多个类的共同属性与抽象类一样都是定义多个类的共同属性使抽象概念更深入了一层,是一个使抽象概念更深入了一层,是一个“纯纯”抽象类,它只提供一种形式,并不提供实抽象类,它只提供一种形式,并不提供实现现允许创建者规定方法的基本形式:方法名、允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但参数列表以及返回类型,但不规定方法主不规定方法主体体也也可以包含基本数据类型的数据成员,但可以包含基本数据类型的数据成员,但它们都默认为它们都默认为static和和final8.1.1 接口的定义接口的定义【例例8-1】创建接口创建接口 public interface ICircle double PI=3.14159;double getCircumference(double radius);double getArea(double radius);double getVolume(double radius);8.1.2 接口的实现接口的实现n因为接口中的属性都是常量,接口中的方法因为接口中的属性都是常量,接口中的方法都是没有方法体的抽象方法。都是没有方法体的抽象方法。n接口定义的仅仅是实现某一特定功能的一组接口定义的仅仅是实现某一特定功能的一组功能的功能的对外接口和规范对外接口和规范,而并没有真正实现,而并没有真正实现这个功能,这个功能的真正实现是在这个功能,这个功能的真正实现是在“继承继承”这个接口的各个类中完成的,要由这些类这个接口的各个类中完成的,要由这些类来具体定义接口中各抽象方法的方法体。来具体定义接口中各抽象方法的方法体。8.1.2 接口的实现接口的实现n接口的应用:接口的应用:规定某些类应该实现的方法调用接口。规定某些类应该实现的方法调用接口。通过定义一个能实现多个接口的类,模拟通过定义一个能实现多个接口的类,模拟类的多重继承。类的多重继承。n接口在定义后,就可以在类中实现该接口接口在定义后,就可以在类中实现该接口。8.1.2 接口的实现接口的实现n在类中实现接口可以使用关键字在类中实现接口可以使用关键字implementsn基本语法格式如下所示:基本语法格式如下所示:修饰符修饰符 class extends 父类名父类名 implements 接口列表接口列表 n在非抽象类中实现接口时,在非抽象类中实现接口时,方法名、返回值方法名、返回值类型、参数的个数及类型必须与接口中的完类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法全一致,并且必须实现接口中的所有方法。8.1.2 接口的实现接口的实现n【例【例8-2】创建类实现接口】创建类实现接口public class Circle implements ICircle Override public double getCircumference(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判断对象类型判断对象类型n当在程序中执行向下转型操作时,如果父类当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生对象不是子类对象的实例,就会发生ClassCastException异常异常,n所以在执行向下转型之前应使用所以在执行向下转型之前应使用instanceof操作符来判断父类对象是否为子类对象的实操作符来判断父类对象是否为子类对象的实例。例。ninstanceof操作符可以用来判断一个类是否操作符可以用来判断一个类是否实现了某个接口,也可以用来判断一个实例实现了某个接口,也可以用来判断一个实例对象是否属于一个类。对象是否属于一个类。8.6 instanceof判断对象类型判断对象类型ninstanceof的语法格式如下:的语法格式如下:myobject instanceof ExampleClass myobject:某类的对象引用。:某类的对象引用。ExampleClass:某个类:某个类。n使用使用instanceof操作符的表达式返回值为布尔值。操作符的表达式返回值为布尔值。如果使用如果使用instanceof操作符的表达式返回值为操作符的表达式返回值为true,说明,说明myobject对象为对象为ExampleClass的实例的实例对象,如果返回值为对象,如果返回值为false,说明,说明myobject对象对象不是不是ExampleClass的实例对象。的实例对象。父类对象父类对象子类名子类名class Quadrangle public static void draw(Quadrangle q)/SomeSentence class Square extends Quadrangle /SomeSentenceclass Anything /SomeSentencepublic class Parallelogram extends Quadrangle public static void main(String args)Quadrangle q=new Quadrangle();if(q instanceof Parallelogram)Parallelogram p=(Parallelogram)q;if(q instanceof Square)Square s=(Square)q;/由于由于q对象不为对象不为Anything类的对象,所以这条类的对象,所以这条语句是错误的语句是错误的 /System.out.println(q instanceof Anything);知识点提炼知识点提炼n1)Java中使用中使用interface关键字来定义接口,关键字来定义接口,在接口中可以包含常量和方法。在接口中可以包含常量和方法。n2)使用)使用extends关键字可以继承类,使用关键字可以继承类,使用implement关键字可以实现接口。关键字可以实现接口。n3)Java中的类可以继承一个类,可以实现多中的类可以继承一个类,可以实现多个接口。个接口。n4)通过继承,可以让子类获得父类中定义的)通过继承,可以让子类获得父类中定义的非私有成员变量和方法。非私有成员变量和方法。n5)对于继承的方法,可以在子类中进行重写)对于继承的方法,可以在子类中进行重写知识点提炼知识点提炼n6)在重写方法时,要保证方法名称和参数与)在重写方法时,要保证方法名称和参数与父类完全相同,并且访问权限不能减小。父类完全相同,并且访问权限不能减小。n7)使用)使用super关键字可以调用父类中定义的关键字可以调用父类中定义的构造方法。构造方法。n8)即使子类隐藏了父类中定义的成员变量和)即使子类隐藏了父类中定义的成员变量和成员方法,还可以使用成员方法,还可以使用super关键字调用。关键字调用。n9)使用)使用Override注解可以减少重写方法时出注解可以减少重写方法时出现的错误。现的错误。