掘金 后端 ( ) • 2022-08-12 15:35

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

前言

提到重载重写,大家最熟悉的地方莫过于自己封装一个枚举类或者框架中的底层实现类吧?我们经常用着底层的框架技术,但是底层的原理可能不太明白。下面我就来通过Java类的三大特性——封装、继承、多态的具体实现:重载与重写来深入剖析Java的设计原理,让大家可以简简单单写底层源码

根本区别

根本区别: 重载是一个父类方法多个不用的子类功能,重写是一个父类方法多个相同的子类功能.

相当于重载是在创造方法,重写是给子类使用方法!

构造函数是为了在类加载时初始化多个变量的值,也可以在new对象时初始化值!

详细对比

1、使用static修饰的方法只能执行一次,不能再次被实例化; 2、构造函数是一种特殊的方法,方法名与类名相同,构造函数是重载的一种实现,构造函数不能被重写(因为构造函数是一个无自己方法的类型-采用this全局引用符引用的本类中的参数、无自己的返回值-返回值是本类参数的、类名与参数名相同,这三点也就导致构造函数不满足重写的条件——必须修改父类的参数的值,没有返回值就无法修改值,因此子类无法继承父类的方法——总之重载的方法无法被重写,因此已经回不到父类的默认方法了——再底层一点就是:重载是创建一个新的同名方法来扩容原方法参数与功能,从本质上调用的是一个新方法;而重写是在原方法的基础上改变参数的值来实现原功能,从本质上还是调用的原方法) 3、重载与重写是指对方法操作,方法名都相同,参数的值都可以不同; 4、重载是改造原方法的功能(一个类中,参数类型、个数、顺序不相同),重写是重现原方法的功能(子类中,参数类型、个数都相同,但参数的值必须不同) 5、重载用于构造函数,同一个方法名对不同参数的功能实现(即实现一个方法多个功能),重写用于继承父类并再度封装父类的方法

6、在一个类中,可以有多个构造方法(方法参数不同) ,即默认重载方法,来实现对象属性不同的初始化;

7、但是子类中不能定义一个方法无void无返回值的方法,编译错误,即子类无法继承构造方法,但是子类的构造器中可以调用(实例化)父类的构造方法(默认自动调用无参构造);然后,一个父类方法被重载为了构造函数,然后再重写为子类方法,那么构造函数该岂不是指向两个相同的地址?根据JVM的分区,用户方法与对象(非JDK对象)都会放入堆,而堆中的指针是唯一的——相当于内存区的计数器。所以是不能在(重载过的)构造方法上重写的!

8、this是用于指向的当前类(对象)的指针,可以通过this.变量名在构造函数中调用变量的值

9、this() 不能使用在普通方法中,只能写在构造方法(类名与方法名相同,无返回值)中:

public class Student { //定义一个类,类的名字为student。 
 public Student() { //定义一个方法,名字与类相同故为构造方法
  this(“Hello!”);
 }
 public Student(String name) { //定义一个带形式参数的构造方法
 }
}

10、一个实体类再创建后会自动生成一个默认构造函数,是无返回参数的,只有指向实体类的变量指针(this);同时,构造函数可以自定义(即初始化时加入一些不同的元素)

11、Java核心是对象(万物即可对象,对象即类),而类(对象)的核心就是封装继承多态,具体体现是重载重写构造函数

12、this关键字只能访问本类中的成员变量,同时:

  • this调用本类中的属性,也就是类中的成员变量;
  • this调用本类中的其他方法;
  • this调用本类中的其他构造方法,调用时要放在构造方法的首行。

拓展

既然我们已经深入了重载与重写的区别、构造方法的底层,那么,我们就可以去利用这三样东西去创建属于自己的框架源码了。首先,可以重载大量的方法形成不同功能的同名方法(也就是构造方法),然后根据方法体的参数的不同就可以调用不同的功能(参数的值可以自己设置),这就实现了一个方法的多个功能的封装(根据参数不同来选择)。比如:使用Jedis调用方法:

源码:

public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands, AdvancedJedisCommands, ScriptingCommands, BasicCommands, ClusterCommands, SentinelCommands, ModuleCommands {
    protected JedisPoolAbstract dataSource = null;
​
    public Jedis() {
    }
​
    public Jedis(String host) {
        super(host);
    }
​
    public Jedis(HostAndPort hp) {
        super(hp);
    }
​
    public Jedis(String host, int port) {
        super(host, port);
    }
​
    public Jedis(String host, int port, boolean ssl) {
        super(host, port, ssl);
    }

上面是Jedis使用构造函数封装方法的源码,我们可以借鉴上面的源码自己封装底层API(可以是对其他数据库的操作)或者自己封装属于自己功能的方法;当封装的方法足以完成一个完整的操作的时候,我们就可以将其打成Jar包发布到Maven Center,从而形成一个框架。Jar包多了,这时候可以下载OpenJDK的某一个版本,然后将自己的Jar整合到JDK中;这样,就开发出来了属于自己定制功能的JDK版本。npm同理~

欢迎关注白羊🐏,感谢观看ヾ(◍°∇°◍)ノ゙