Java 接口、继承与多态

                                                     第一章 继承          

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 关于向上或向下转型后使用对象中元素的问题

            

输出结果为12。

扫描二维码关注公众号,回复: 3438604 查看本文章

虽然new了一个B对象a,但是声明为父类A类型,所以调用a.i的时候实际上是访问了父类的属性值,事实上当将父类声明为private时,编译会报错,因为声明类型为A时,java虚拟机就会认为实例化对象为一个A类型的对象,这情况下只能访问A中的成员变量和方法。

所以如下代码也会报错,因为A中没有nihao函数,具体如下

 

如果修改为声明为B则会输出-6,具体如下

      

1.2.2 关于instanceof的使用问题

     

输出为 yes1 yes2

自己的对象instanceof自己的类是yes,子类对象instanceof父类输出yes,父类对象instanceof子类会是false。

1.2.3 多态

       在1.2.1例子中我们了解到,当用父类对象指向子类对象时,我们调用不管是类还是属性都得父类中有才行,如果没有就会报错,跟子类中有没有没关系,但是如果能在子类中重写父类的方法,那么当父类对象指向子类对象时,我们调用父类的方法,实际上调用的是子类中被重写的方法,我们称这个为多态。

        在下面的例子中,B类继承了A类并重写了A类中name方法,这样我们在test2中,用指向子类的父类对象调用name方法时,调用到的是重写的方法。

       

     

1.2.4 多次继承后的属性问题

    

     

可以看出,继承后使用的属性为父类的属性,而不是同名的爷类的属性。

                                                         第二章 接口 

2.1 抽象类简介

在java语言中抽象类不可以实例化对象。

抽象方法没有方法体,除非它被重写,而承载这个抽象方法的抽象类必须被继承。

如果声明一个抽象的方法,就必须将这个抽象的方法定义为抽象类。

抽象类被继承要实现所有的抽象方法,就是必须名字、返回值、参数列表都相同。

抽象类的属性必须是非常量。

抽象类虽然是特殊的类,但是也具备类的特性,所以可以继承别的抽象类。

在抽象类中所有的子类都要对抽象方法进行覆盖,所以每个子类都要重写这个方法,比较麻烦,如果能让哪些需要重写的重写,不需要重写的不管就好了,所以接口便出现了。

2.2 接口

       接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。

       接口中定义的方法必须被定义为public或abstract形式,其它修饰权限不被java编译器认可,即使不讲方法声明为public形式,它也是public。

  接口中的属性必须被public、final、static修饰,关于final的详细解释可以看https://blog.csdn.net/lwj_199011/article/details/52385926

        在java中可以将类向上转型为父类对象,也可以转型为抽象父类对象,或者向上转型为该类实现接口,都可以。

        继承接口需要实现接口中的所有方法。

2.3 例子

2.3.1 接口中的常量

        

可以看出,接口中的字段必须是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/1693977889zz/p/8296595.html

猜你喜欢

转载自blog.csdn.net/q610376681/article/details/82532094