Java学习里程-----Java基础_12构造方法与Object类

一、构造方法

啥是构造方法,构造什么玩意?

我们百度百科一下,来用官方的语言去描述一下

Java学习里程-----Java基础_12构造方法与Object类

可以看得出来,构造方法是每一个类都有的方法,我们每次创建对象,一般都是通过构造方法去完成,也就是说,这个是每个类的最重要的方法,没有它,我们就没有办法实例化对象。构造方法也被叫做构造器。而且每一个类至少有一个构造方法。

也正是因为这样,它是一种特殊的方法。下面让我们来揭开她特殊的面纱。

二、构造方法的使用

我们先来看看构造方法长啥样吧。

我们先创建一个我们最初学代码时候的HelloWorld。

Java学习里程-----Java基础_12构造方法与Object类

看到了吗,构造方法?

哈哈哈,一般情况下,我们是看不到这个构造方法的,因为这个是被省略了,不是没有,我们呢,让他显示出来。

alt + shift + s

Java学习里程-----Java基础_12构造方法与Object类

选择Generate Constructors from Superclass,从超类中生成构造函数。(这个知识点我下面说)

创建好之后,是这样滴

Java学习里程-----Java基础_12构造方法与Object类

这个public HelloWorld()这个就是每一个类的默认构造方法,这个HelloWorld 就是每一个类的类名。

我们上面说了,除去这个默认的构造方法,我们还可以自己创建构造方法,这个自己构建的构造方法就是我基础9博客中说的重载,大家有需要可以去看一下啥叫重载。Java学习里程-----Java基础_9面向对象

下面我们来创建一个,直接上代码

Java学习里程-----Java基础_12构造方法与Object类

重载完成之后,我们来测试这个构造方法。

创建一个HelloWorldTest类,然后我们实例化这个HelloWorld。

Java学习里程-----Java基础_12构造方法与Object类

运行:

Java学习里程-----Java基础_12构造方法与Object类

我们发现,屁也没有,因为我们调用的默认构造器,所以啥也没有。我们再来调用我们刚刚重载的构造器。

Java学习里程-----Java基础_12构造方法与Object类

因为刚刚我们重载的构造方法需要一个String的参数,所以我们传入一个参数,这样,就可以调用我们刚刚重载的构造方法了。然后运行:

Java学习里程-----Java基础_12构造方法与Object类

看,是不是,第一个HelloWorld实例化的时候,调用的是默认构造方法,而第二个HelloWorld实例化的时候,调用的是另外一个重载的构造方法。

我们这次呢,将HelloWorld中两个构造方法全部删除掉,然后,我们再HelloWorldTest类中再实例化对象,我们再来看一下:

Java学习里程-----Java基础_12构造方法与Object类

我们在HelloWorld中顺便弄个普通方法,看好了,普通方法!!用来测试的时候调用。

Java学习里程-----Java基础_12构造方法与Object类

在这个Test测试方法中,我们可以发现,可以调用,说明这个HelloWorld被实例化了,但是没有构造器怎么实例化的?

Java是这样设计的,如果一个类中没有构造方法,那么系统会自动生成一个默认的无参构造方法。

相反的,如果类中有其他的不是默认的构造方法,那么这个类不会自动创建默认的构造方法了。我们可以测试。上代码!

Java学习里程-----Java基础_12构造方法与Object类

然后再测试类中进行普通实例化,我们发现会报错,我们来看一下:

Java学习里程-----Java基础_12构造方法与Object类

说没有定义默认的构造器。

三、Object

Object这个类啊,是个极其特殊的类,为啥这么说,我们来看上面那个创建默认构造函数的事情。(我把图给在贴一下)

Java学习里程-----Java基础_12构造方法与Object类

不知道大家发现没有,在这个构造函数里面有一个super()方法,学过继承的都知道,super这个是个关键字,super是指向父类的引用。但是这个HelloWorld并没有继承什么啊,它哪里来的父类?

不要急,我们进入到super方法中,我们来看看它具体指的谁。

Java学习里程-----Java基础_12构造方法与Object类

我们可以看到啊,它是进入到了Object这个类里面了。这就奇怪了,为啥会进入到这里了呢?

我们来看一下jdk Api,https://docs.oracle.com/javase/8/docs/api/ 我给你们连接,自己保存一下。

Java学习里程-----Java基础_12构造方法与Object类

所有的类都得实现这个类的。看到了吧,这就说是所有的类都默认继承了这个Object。

也就是说,所有的类的父类都是Object。

但是,这时候有人又要问了,不是说Java中不是单继承吗?既然大家都继承了Object了,那为啥还能继承?这不是和Java继承冲突了吗?

下面我来解释:

A这个类默认继承了Object。然后这时候出来了一个B这个类,B呢和A一样,都默认继承了Object。

现在A要继承B,也就是说 A extends B,那么这时候,他们的继承关系就改变了,变成了 A extends B,然后B extends Object。

Java中是这样定义的,如果类没有继承,那么就去继承默认的Object。

 

大家好好消化一下。