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

相关文章
|
6天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
30 5
|
29天前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
105 15
|
3月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
282 60
|
2月前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
2月前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
60 6
|
3月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
46 2
|
3天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
38 14
|
6天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
35 13
|
7天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
109 17