飞道的博客

【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

174人阅读  评论(0)

–本文摘要–
    1、本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承、抽象类、接口、多态等等概念搞不清的初学者。
    2、本文的内容摘要:讲述Java中的一些易混概念,static关键字、继承、重载、重写、多态、抽象类、接口、final关键字。
    【版权声明】归CSDN账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网站与个人采集或转载。


一、static关键字

    static最常见到是在java类中的主函数main的定义那里。关于static关键字,在日常开发中主要记住2个功能:

1、static修饰属性,这个属性提升为类所有,类、类的所有实例化对象共用这个static属性,一般借此可以实现在线人数统计等功能。
2、static修饰方法,这个方法提升为类所有,这样类就可以直接调用,不需要等类实例化为对象,在项目中,一些配置信息可以这样定义使用。


二、继承

    继承的概念不难理解,一个父类A.java,可以派生出多个子类B.java。基本写法如下:

class A{
   }//父类

class B extends A{
   }//子类

【重点】
1、继承是为了实现代码重用(即多次利用,与‘重写’无关)功能而产生的,子类继承了父类后,可以实现代码功能上的拓展。见下图2-1的说明。
2、继承可以多层继承,但是不能多重继承。白话就是,C可以继承B、B再继承A,但是 C不能同时继承B与A。
3、子类实例化时,会先调用父类的构造函数,然后再调用自己的构造函数。
4、B继承了A,在B中继续写一些方法叫做拓展,如果B重新写了一个父类A中已有的方法,叫做重写Override),也说覆写


三、重载(Overloading)

    重载,也就是方法的重载。多个方法拥有同一个方法名,通过返回值类型、形参个数等的不同,让Java来执行不同的方法。最最典型的就是类的构造函数,无参构造、有参构造等等,比较好理解,不多描述。


四、重写(Override)

    重写,也叫做覆写,多伴随继承、接口、抽象类等概念出现。它们都是在父类或接口中先定义方法,然后子类或接口实现类重写方法。


⭐五、多态性

    参见上图5-1,多态性分为方法与对象的多态,主要讲解对象的多态性。对象的多态性分为向上转型和向下转型,其中向上转型特别重要!此处建议结合本文与理论介绍食用。

    代码示例:

class A{
   }

class B extends A{
   }

/*******main函数内*********/
A a = new B();//向上转型
B b = (B)a;//向下转型

【重点】
1、【发生对象的多态性的前提】:必须有两个类,它们互相是继承和派生关系。白话就是有一个父类,一个子类,向上转型或者向下转型发生在它们之间。

2、【向上转型】:如上面的代码块A a = new B();。基本理解是,等号左边声明的是父类的引用,等号右边是创建了子类实例,把子类对象转成父类,名曰‘向上转型’。

3、【向下转型】:如上面的代码块A a = new B();B b = (B)a;。首先,必须有向上转型的出现(即A a = new B();),才能把a向下转型。基本理解是,等号左边声明的是子类的引用,等号右边是已经向上转型了的父类引用,把父类引用转成子类,名曰‘向下转型’。

4、【自动转换、强制转换】:自动转换、强制转换是向上转型、向下转型的别称,我们可以通过下图5-2来理解这两个别称。

图中第一行代码:A a = new B();首先定义了一个A类型的引用a,但是赋给a的值是A类的派生类B。a先是去匹配当初定义的类型A的空间,然后再根据等式右边的B的空间,尝试能否转移到B类的空间上。结果由于B继承A,前面的描述是可行的,于是A类型的引用a,映射了类A的空间,最终转移到了类B的空间。称为‘自动转换’。

图中第二行代码:B b = (B)a;这是向下转型。向下转型的前提就是a已经向上转型了,按下图的描述就是A类型的a引用已经映射了类B的空间。在这个前提下,才能把a强制转换为B类的引用(因为它们最终映射的空间是一样的,都是B空间)。我们把引用a转换为引用b,引用a中间还映射了类A的空间,这个过程在引用b这里已经没有了。我们把这样的转化称为‘强制转换’。

5、【举个例子】:在Java中,Object类是所有类的最终父类。我们在项目中,想要定义一个HashMap结构,但是它存放的可能是String类型、Integer类型、自定义类型,我们不可能为每种类型定义一个HashMap,我们会这样写:

HashMap<String,Object> content = new HashMap<>();

content.put("aa","name");
content.put("bb",123);

⭐⭐这样定义之后,我们的Hash结构就能存放各种数据类型的数据了,这就是向上转型的经典运用!我们定义的Object类型,就像是一个大收纳盒,各种数据类型过来后,由于它们都是Object的派生类,都会向上转型。


六、抽象类(abstract)与接口(interface)

    抽象类经常与接口混淆。首先把握一点就是接口比抽象类地位要高。

【区别】
1、抽象类要被子类继承,接口要被类实现。
2、接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4、抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
5、抽象类主要用来抽象类别,接口主要用来抽象功能。


七、final关键字

    final也叫终结器。在实际开发中,会用到final的三个功能:

1、final修饰类,类不可被继承
2、final修饰方法,方法不可重写
3、final修饰的变量成为常量,值不可修改

获取编程资源

如果需要获取编程资源,请扫描关注我的公众号:


转载:https://blog.csdn.net/qq_43592352/article/details/116664997
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场