1、完整word版零基础学JAVAJavaSE面向对象部分16面向对象高级04上季内容回顾:1、 final 关键字修饰类不能被继承修饰方法不能被覆写修饰的变量就是一个常量,全局常量( public static final )2、 抽象类和接口抽象类:只包含一个抽象方法的类,抽象方法只需声明而不需要实现,必须有子类接口:只包含抽象方法和全局常量的类一一接口,也是必须有子类在实际中一个类很少会去继承一个已经完全实现好的类, 基本上都是继承抽象类和实现接口。本季主要知识点:1、 对象的多态性2、 instanceof 关键字3、Object 类 对象的多态性 对$仃乂逻恥上M W f换e rxui向
2、父炎对探转换(向上龟 址英対象血子逆对徹杞挽 向厂金 强引討力4孑史洞蔑=广子貴址宝址滋注意点: 为了清楚的阐述出概念,现在先使用普通类的继承关系。向上转型:class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();pub
3、lic void fun 3()System.out.println( B 类= public void fun3();public class Demo01public static void main( Str ing args)B b = new B();A a = new A();b.fu n1();a.fu n2();b.fu n3();H:jauax)oi1javac De no 01H=5public uoidl nnl J1Fl类=pufcliG void funlOB=-=puI)lic vofunGOE 二 Xjmu曰、dcj4class Apublic void fun
4、1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();public void fun 3()System.out.println( B 类= public void fun3();public class Demo02public static void main
5、( Str ing args)/声明一个父类对象A a = null ;/new B()是子类对象向父类对象转换a = new B();a.fu n1();现在我们来看下a.fu n1()调用的是哪个类的方法哈E: jauiQo4Jauac Deno2 .JavaE : jauaooi1jaua DcmcO2B类冶ulilic; void funlOE 二 Xjgujaiou4.class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法th
6、is .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();public void fun 3()System.out.println( B 类= public void fun3();public class Demo02public static void main( Str ing args)/声明一个父类对象A a = null ;/new B()是子类对象向父类对象转换/子类对象向父类对象转型之后,所调用的方法一定是被覆写过的方
7、法 a = new B();a.fu n1();a.fu n2();E: jaua-ot)4Jauac Den)oB2 .JavaE: jauaXjoo4Ju Demo02 B=pijihlic uoipul)lic voii funl向下转型:class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()Syst
8、em.out.println( B 类= public void fun 1();public void fun 3()System.out.println( B 类= public void fun3();public class Demo03public static void main( Str ing args)/声明一个父类对象A a = null ;/new B()是子类对象向父类对象转换/子类对象向父类对象转型之后,所调用的方法一定是被覆写过的方法现在我们来看下能否调用 a.fu n3()哈ncno03.jaua:3b:找不到荷号 隠寻方法皿切Kfi;类 fi41错误E : ja
9、uaXoo4程序提示找不到fun3()方法,A类中没有fun3()方法哈,如果我们一定要调用的话,我们 就要使用向下转型哈class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();public void fun 3()Sy
10、stem.out.println( B 类= public void fun3();public class Demo03public static void main( Str ing args)/声明一个父类对象A a = null ;/new B()是子类对象向父类对象转换/子类对象向父类对象转型之后,所调用的方法一定是被覆写过的方法 a = new B();/可以进行向下转型,需要使用强制性手段哈 B b = (B)a;b.fu n3();验证下效果:E J*vaoo4 De no 03. javaE; Muao jaua De no 03B= = public uoid. fun3E
11、 i XjAuaoo4_这就是对象向下转型哈观察以下一种代码,检查下有没问题哈 :class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是funl方法this .fun 1();class B extends A/现在我们不覆写 A类中的fun 1()方法public void fun X()程序找不到B类中被覆写的fun 1()方法,所以去查找父类 A中的fun 1()方法了哈E:Xiauaoo4Jauac Dema04.java!j*uaooBe
12、no04 public void funlE : xjauaot)4class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();public void fun 3()E:Jauac Demo04.jdtuAE = jjav*
13、 Icno941 类=Mpul)lic void funlOE: XjauaXoo4_如果现在我们要调用 fun3()方法呢?现在使用向下转型可以吗这样修改的话,我们看下有没问题哈,验证一下,发现编译时没有错误,但执行时却出现ClassCastException 错误了哈 E:口*1 vac le - j:昂 vaE: 7鼻啪事7v* PegHEnrvpt ion in thrafld ftajau aa LangaC1aE: 鼻1在程序开发中有两大错误是比较常见的:NullPointerException :表示空指向异常,如果没有开辟堆内存空间,则出现此异常ClassCastExcepti
14、on :表示类转换异常,两个不相关的类的对象进行向下转型操作。上面一个解释比较难理解哈, 我们光看A类的话,我们不能知道 A类有什么子类哈,但是如果我们光看B类的话,我们可以看出 B类是继承A类的话,所以得出了下面一个结论。结论:在进行向下转型之前,两个对象必然先发生向上转型关系,这样好建立起关系,否则两个没有关系的对象是不能相互转型的。对象多态性到底有那些用处呢?如果不知道多态性的时候应该使用以下的方式编写代码,利用方法的重载完成。class Apublic void fun 2()fun2 方法调用的是funl方法this .fun 1();class B extends A/覆写A类中的
15、fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();public void fun 3()System.out.println( B 类= public void fun3();class C extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( C 类= public void fun 1() );public void fun 4()System.out.println( C 类= public void fun4();pu
16、blic class Demo05public static void main( Str ing args)fun( new B();fun( new C();/现在要求定义几个方法,可以接收父类 A的子类对象/如果不知道多态性的时候应该使用以下的方式编写代码public static void fun(B b)b.fu n2();E ! jauaoo4jauAC . JauaB=fjublic void funlO C=public uo id funi E J Xjauaoo4如果按此做法,就会面临一个很严重的问题:如果现在A类有30个子类,则方法要重写 30遍。所以此时就可以利用对象的
17、多态性完成,因为所有的子类对象都可以向父类对象转换。现在我们就只留一个 fun()方法,new B() , new C()都是A类的子类哈,所以现在不管调用时传什么子类,都调用所传子类被覆写的 fun 1()方法哈这就是对象多态性带来的好处,谁被其实例化就具备这样的功能哈 如果父类设计的非常的完善,则方法中会非常的好写。已弓百DemoBGXjavaoo4j*UHa Deno06 =puhlic void funl =pui)lic void funl public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();cl
18、ass B extends Apublic void fun 3()System.out.println( B 类= public void fun3();/覆写A类中的fun 1()方法public void fun 1()System.out.println( C 类= public void fun 1() );public void fun 4()我们来判断下对象 b是否是A类的实例哈,我们分析下哈,子类B可以直接向父类 A转型哈,说明父类A可以接收子类B的实例,那两者必然有关系哈,我们验证一下,结果返回 true哈,证明对象b是A类的实例哈E = Beno07力霾#目E:DenoB?
19、trueE: System.out.println( B 类= public void fun3();class C extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( C 类= public void fun 1() );public void fun 4()System.out.println( C 类= public void fun4();public class Demo07public static void main( Str ing args)B b = new B();System.out.pri n
20、tln(b in sta nceof A);System.out.pri ntln(b in sta nceof B);对象b也肯定是B类的实例哈E:jauac DenoB7.JavaE:javaooBemoO? truetrueclass Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();那相反对象a是B类的实例吗?验证显示不是哈 说明不能向子类转换哈 E:jauJauac DemoB7.Ja.uaE;Xjauao
21、o4J*u BemoB? trueFalseE: jauaXDo4class Apublic void fun 1()System.out.println( A 类= public void fun 1();public void fun 2()fun2 方法调用的是fun1方法this .fun 1();class B extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( B 类= public void fun 1();public void fun 3()System.out.println( B 类= publi
22、c void fun3();class C extends A/覆写A类中的fun 1()方法public void fun 1()System.out.println( C 类= public void fun 1() );public void fun 4()System.out.println( C 类= public void fun4();public class Demo08public static void main( Str ing args)fun( new B();System.out.pri ntl n( # );fun( new C();public static v
23、oid fun(A a)a.fu n2();这就是instanceof 关键字的作用哈Ez jauaio4Javc Deno68 , jauaE: jauao4jaua BenoSS B-=-pul)lic Jo il funi piit)lic uci id fun3 C=pul)lic uo ipijihlic uoil fun4javacE: De no S?Scudent0757aefE=加和不加都是一样滴,那我们下面就覆写 Object类的toString() 方法哈class Student /extends Objectprivate Str ing n ame;private int age;public Student(String name, int age)this .name = name;this .age = age;public String toStri ng()return Michael;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1