–本文摘要–
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修饰方法,方法不可重写