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

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

–本文摘要–

   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),也说覆写

image.png

三、重载(Overloading)


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

四、重写(Override)


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

⭐五、多态性


20210511193410529.png

  参见上图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这里已经没有了。我们把这样的转化称为‘强制转换’。

20210511213839927.png

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修饰的变量成为常量,值不可修改

相关文章
|
1天前
|
Java
Java中多态的实现原理解析
Java中多态的实现原理解析
|
1天前
|
Java
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
1天前
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
|
1天前
|
Java
Java面向对象 ( 多态 | final关键字 | 接口 )
Java面向对象 ( 多态 | final关键字 | 接口 )
|
1天前
|
Java
Java Map.Entry接口详解
Java Map.Entry接口详解
|
1天前
|
运维 监控 算法
java实现一个动态监控系统,监控接口请求超时的趋势
java实现一个动态监控系统,监控接口请求超时的趋势
17 2
|
2天前
|
Java API 数据处理
Java中的Lambda表达式和函数式接口
【6月更文挑战第29天】在Java的世界里,Lambda表达式的引入标志着编程范式的一次革新。它不仅简化了代码,还提高了开发效率。本文将通过探索Lambda表达式的本质、优势以及如何与函数式接口协同工作,带领读者理解这一特性的强大之处。我们将从基础概念出发,逐步深入到实际应用,揭示Lambda表达式如何让Java代码更加简洁、灵活。
12 3
|
4天前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
12 0
|
7天前
|
Java 机器人 程序员
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
8天前
|
安全 Java
深度解读Java的继承和多态的特性
深度解读Java的继承和多态的特性