Java多态性抽象类与接口细致详解
Java多态性抽象类与接口细致详解,博智网带你了解详细信息 。
目录
- 1、多态性
- 1.1 向上转型
- 1.2 向下转型
- 2、抽象类
- 2.1 抽象类的基本概念
- 3、接口
- 3.1 接口的基本概念
- 3.2 接口的使用限制
- 3.3 使用接口定义标准
- 3.4 抽象类与接口的区别
1、多态性多态性是面向对象的最后一个特征,它本身主要分为两个方面:
方法的多态性:重载与覆写
1 重载:同一个方法名称,根据参数类型以及个数完成不同功能;
2 覆写:通一个方法,根据操作的子类不同,所完成的功能也不同 。
对象的多态性:父子类对象的转换 。
1 向上转型:子类对象变为父类对象,父类 父类对象 = 子类 子类对象 自动;
2 向上转型:父类对象变为子类对象,格式:子类 子类对象 = (子类)父类实例,强制;
class A{ public void print(){System.out.println("A输出"); }}class B extends A{ public void print(){System.out.println("B输出"); }}public class TestDemo1{ public static void main(String args[]){B b = new B();//B输出b.print(); }}
这种操作主要观察两点:
1 看实例化的是哪一类(new);
2 看new的这个类之中是否被覆写了父类调用的方法 。
1.1 向上转型public class TestDemo1{ public static void main(String args[]){A a = new B();//向上转型//B输出a.print(); }}
1.2 向下转型public class TestDemo1{ public static void main(String args[]){A a = new B();//向上转型B b = (B) a;//向下转型b.print(); }}
public class TestDemo1{ public static void main(String args[]){A a = new A();//没有转型B b = (B) a;//向下转型b.print(); }}/*Exception in thread "main" java.lang.ClassCastException: A cannot be cast to Bat DuoTaiXing.main(TestDemo1.java:14)*/
以上的程序在编译的时候没有发生任何错误信息,但是在执行的时候出现了“ClassCastException”错误提示,表示的是类转换异常,即:两个没有关系的类互相发生了对象的强制转型 。
转型的因素:
1 在实际工作之中,对象的向上转型为主要使用,向上转型之后,多有方法以父类的方法为主,但是具体的实现,还是要看子类是否覆写了此方法; 。
2 向下转型,因为在进行向下转型操作之前,一定要首先发生向上转型,以建立两个对象之间的联系,如果没有这种联系,是不可能发生向下转型的,一旦发生了运行中就会出现“ClassCastException”当需要调用子类自己特殊定义方法的时候,菜需要向下转型 。
3 不转型,在一些资源较少的时候,如:移动开发 。
class A{ public void print(){System.out.println("A输出"); }}class B extends A{ public void print(){System.out.println("B输出"); } public void funB(){System.out.println("funB"); }}public class TestDemo1{ public static void main(String args[]){A a = new B();//向上转型System.out.println(a instanceof A);System.out.println(a instanceof B);if (a instanceof B){B b = (B) a;b.funB();} }}/*truetruefunB*/
为了日后的操作方便,在编写代码的时候,尽量不要去执行向下的转型操作,子类尽量不要去扩充新的方法名称(父类没有的方法名称),依据父类定义的操作完善方法 。
例题:利用对象向上转型完成
class A{ public void print(){System.out.println("A输出"); }}class B extends A{ public void print(){System.out.println("B输出"); }}class C extends A{ public void print(){System.out.println("C输出"); }}public class TestDemo2{ public static void main(String args[]){fun(new B());fun(new C()); } public static void fun(A a){a.print(); }}
这样以来就得到了类型的统一,就算有再多的子类出现,方法或者是类也不需要进行修改了,但是在这块必须强调的是:子类操作的过程之中,尽量向父类靠拢 。
以后所有的代码之中,都会存在对象的转型问题,并且向上转型居多 。
在日后的所有开发之中,像之前程序那样,一个类去继承另外一个已经实现好的类的情况,是不可能出现的 。即:一个类不能去继承一个已经实现好的类,只能继承抽象类或实现接口 。
2、抽象类在以后你进行的项目开发中,绝对不要出现一个类继承一个已经实现好的类 。
对象多态性的核心本质在于方法的覆写,这样的操作有些不合要求,所以要对子类的方法进行强制的要求就必须采用我们的抽象类进行实现 。
2.1 抽象类的基本概念普通类就是一个完善的功能类,可以直接产生对象并且可以使用,里面的方法都是带有方法体的,而抽象类之中最大的特点是包含了抽象方法,而抽象方法是只声明而未实现(没有方法体)的方法,而抽象方法定义的时候要使用abstract关键字完成,而抽象方法一定要在抽象类之中,抽象类要使用是用abstract声明 。
推荐阅读
- 螺旋纹是抽象纹样吗
- 如何培养小学生的抽象逻辑思维
- 人长得丑的经典语录
- Day10基础不牢地动山摇?Java基础
- Structs框架原理案例详解 Java
- Java基础之匿名内部类、包装类
- 浅谈Java包装类型Long的==操作引发的低级bug
- 抽象梗包括什么呢
- java工程师需要掌握哪些技术
- 教大家几道java面试题
