Java 接口、继承与多态 - 日理万妓 2022-05-14 13:16 319阅读 0赞 # 第一章 继承 # ## 1.1 概念 ## ### 1.1.1 继承的范围 ### 在java中,子类可以继承父类的所有的方法和属性变量,private也能被继承但是不能被访问,可以通过public在父类中调用,子类继承父类的一切东西. <Thinking in JAVA>中说到,子类对象拥有父类对象的完整拷贝。 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构。private限制访问方式只能在类的内部,这仅仅是一个访问控制,实际上子类对象拥有父类对象的一切。 ### 1.1.2 继承时的注意事项 ### 子类初始化时一定要调用父类的构造方法,如果父类有默认构造函数或者无参构造函数时,子类实例化时会自动调用,子类继承了父类的各种属性,而构造方法相当于把父类给实例化出来,如果子类实例化的时候不调用父类的构造方法,相当于子类压根既没有父亲。当调用父类的构造方法时,会从顶级父类中一级一级的向下调用,抽象类是例外,因为抽象类是没有构造方法的,无法实例化。 构造函数不可以被继承,只能调用。 ### 1.1.3 重写、重构与重载 ### 重写就是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容、更改成员方法的存储权限,或者修改成员方法的返回值类型(j2SE5.0的新功能)。 如果其它都不变,只改变方法的实现内容时,这种特殊的重写方式被称为重构。重写父类方法时,方法只能从小到大。 重载是方法的参数的类型或者个数不同,目的是为了让方法名相同而形参不同的方法同时存在。 ### 1.1.4 对象类型的转换 ### 将子类对象转换为父类对象称为向上转型,将父类对象转换为子类对象称为向下转型,将子类对象转换为父类对象可以直接转,但是将父类对象转换为子类对象需要加上强转,因为父类对象范围大,子类对象范围小,大转小没事,小转大就会有问题。 可以用instanceof操作符判断对象类型,当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生classcastexception异常。 ## 1.2 例子 ## ### 1.2.1 关于向上或向下转型后使用对象中元素的问题 ### ![70][] ![70 1][] 输出结果为12。 虽然new了一个B对象a,但是声明为父类A类型,所以调用a.i的时候实际上是访问了父类的属性值,事实上当将父类声明为private时,编译会报错,***因为声明类型为A时,java虚拟机就会认为实例化对象为一个A类型的对象,这情况下只能访问A中的成员变量和方法。*** 所以如下代码也会报错,因为A中没有nihao函数,具体如下 ![70 2][] ![70 3][] 如果修改为声明为B则会输出-6,具体如下 ![70 4][] ![70 5][] ### 1.2.2 关于instanceof的使用问题 ### ![70 6][] ![70 7][] ![70 8][] 输出为 yes1 yes2 自己的对象instanceof自己的类是yes,子类对象instanceof父类输出yes,父类对象instanceof子类会是false。 ### 1.2.3 多态 ### 在1.2.1例子中我们了解到,当用父类对象指向子类对象时,我们调用不管是类还是属性都得父类中有才行,如果没有就会报错,跟子类中有没有没关系,但是如果能在子类中重写父类的方法,那么当父类对象指向子类对象时,我们调用父类的方法,实际上调用的是子类中被重写的方法,我们称这个为多态。 在下面的例子中,B类继承了A类并重写了A类中name方法,这样我们在test2中,用指向子类的父类对象调用name方法时,调用到的是重写的方法。 ![70 9][] ![70 10][] ![70 11][] ![70 12][] ### 1.2.4 多次继承后的属性问题 ### ![70 13][] ![70 14][] ![70 15][] ![70 16][] 可以看出,继承后使用的属性为父类的属性,而不是同名的爷类的属性。 ## 第二章 接口 ## ## 2.1 抽象类简介 ## 在java语言中抽象类不可以实例化对象。 抽象方法没有方法体,除非它被重写,而承载这个抽象方法的抽象类必须被继承。 如果声明一个抽象的方法,就必须将这个抽象的方法定义为抽象类。 抽象类被继承要实现所有的抽象方法,就是必须名字、返回值、参数列表都相同。 抽象类的属性必须是非常量。 抽象类虽然是特殊的类,但是也具备类的特性,所以可以继承别的抽象类。 在抽象类中所有的子类都要对抽象方法进行覆盖,所以每个子类都要重写这个方法,比较麻烦,如果能让哪些需要重写的重写,不需要重写的不管就好了,所以接口便出现了。 ## 2.2 接口 ## 接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。 接口中定义的方法必须被定义为public或abstract形式,其它修饰权限不被java编译器认可,即使不讲方法声明为public形式,它也是public。 接口中的属性必须被public、final、static修饰,关于final的详细解释可以看[https://blog.csdn.net/lwj\_199011/article/details/52385926][https_blog.csdn.net_lwj_199011_article_details_52385926] 在java中可以将类向上转型为父类对象,也可以转型为抽象父类对象,或者向上转型为该类实现接口,都可以。 继承接口需要实现接口中的所有方法。 ## 2.3 例子 ## ### 2.3.1 接口中的常量 ### ![70 17][] ![70 18][] 可以看出,接口中的字段必须是final且static的 ## 第三章 多态 ## ## 3.1 多态的概念 ## 1.多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 2.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 ## 3.2 例子 ## class A \{ public String show(D obj)...\{ return ("A and D"); \} public String show(A obj)...\{ return ("A and A"); \} \} class B extends A \{ public String show(B obj)...\{ return ("B and B"); \} public String show(A obj)...\{ return ("B and A"); \} \} class C extends B\{\} class D extends B\{\} class E \{ public static void main(String \[\] args) \{ A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); //① System.out.println(a1.show(c)); //② System.out.println(a1.show(d)); //③ System.out.println(a2.show(b)); //④ System.out.println(a2.show(c)); //⑤ System.out.println(a2.show(d)); // ⑥ System.out.println(b.show(b)); //⑦ System.out.println(b.show(c)); //⑧ System.out.println(b.show(d)); //⑨ \} \} (三)答案 ① A and A ② A and A ③ A and D ④ B and A ⑤ B and A ⑥ A and D ⑦ B and B ⑧ B and B ⑨ A and D 参考链接: 一个比较好的多态讲解 [https://www.cnblogs.com/mz-lover/p/4786337.html][https_www.cnblogs.com_mz-lover_p_4786337.html] 一个比较好的关于多态的例子 [https://www.cnblogs.com/1693977889zz/p/8296595.html][https_www.cnblogs.com_1693977889zz_p_8296595.html] [70]: https://img-blog.csdn.net/2018090818535760?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 1]: /images/20220514/0f934dbbb3c74d56af9a84d557792aa2.png [70 2]: https://img-blog.csdn.net/20180908190736385?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 3]: /images/20220514/5ecf4a54d2ea461aa761ea3da376d8a9.png [70 4]: https://img-blog.csdn.net/20180908190636736?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 5]: /images/20220514/7680bafc7b0740bc9b530fafcdd15137.png [70 6]: https://img-blog.csdn.net/20180909095550416?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 7]: /images/20220514/3aded419db0649c39144e2fd776de9f8.png [70 8]: /images/20220514/818406b9cb5b4d77bf98fedb0a596c1d.png [70 9]: https://img-blog.csdn.net/20180909110056443?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 10]: /images/20220514/523b1fcc558c4a55bd763642d73ad091.png [70 11]: https://img-blog.csdn.net/20180909110134402?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 12]: /images/20220514/0b3871a45070486981b8483d8ed3e421.png [70 13]: https://img-blog.csdn.net/20180909194159109?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 14]: /images/20220514/e03972899f404e11ab1d4e464220f2b4.png [70 15]: https://img-blog.csdn.net/20180909193737618?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 16]: /images/20220514/2f23b77d8dd448ae91df7ab353c58509.png [https_blog.csdn.net_lwj_199011_article_details_52385926]: https://blog.csdn.net/lwj_199011/article/details/52385926 [70 17]: https://img-blog.csdn.net/20180910112542922?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E2MTAzNzY2ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 18]: /images/20220514/fe22e1b902da42e6a78d00320af773b6.png [https_www.cnblogs.com_mz-lover_p_4786337.html]: https://www.cnblogs.com/mz-lover/p/4786337.html [https_www.cnblogs.com_1693977889zz_p_8296595.html]: https://www.cnblogs.com/1693977889zz/p/8296595.html
还没有评论,来说两句吧...