Java学习里程-----Java基础_12构造方法与Object类
一、构造方法
啥是构造方法,构造什么玩意?
我们百度百科一下,来用官方的语言去描述一下
可以看得出来,构造方法是每一个类都有的方法,我们每次创建对象,一般都是通过构造方法去完成,也就是说,这个是每个类的最重要的方法,没有它,我们就没有办法实例化对象。构造方法也被叫做构造器。而且每一个类至少有一个构造方法。
也正是因为这样,它是一种特殊的方法。下面让我们来揭开她特殊的面纱。
二、构造方法的使用
我们先来看看构造方法长啥样吧。
我们先创建一个我们最初学代码时候的HelloWorld。
看到了吗,构造方法?
哈哈哈,一般情况下,我们是看不到这个构造方法的,因为这个是被省略了,不是没有,我们呢,让他显示出来。
alt + shift + s
选择Generate Constructors from Superclass,从超类中生成构造函数。(这个知识点我下面说)
创建好之后,是这样滴
这个public HelloWorld()这个就是每一个类的默认构造方法,这个HelloWorld 就是每一个类的类名。
我们上面说了,除去这个默认的构造方法,我们还可以自己创建构造方法,这个自己构建的构造方法就是我基础9博客中说的重载,大家有需要可以去看一下啥叫重载。Java学习里程-----Java基础_9面向对象
下面我们来创建一个,直接上代码
重载完成之后,我们来测试这个构造方法。
创建一个HelloWorldTest类,然后我们实例化这个HelloWorld。
运行:
我们发现,屁也没有,因为我们调用的默认构造器,所以啥也没有。我们再来调用我们刚刚重载的构造器。
因为刚刚我们重载的构造方法需要一个String的参数,所以我们传入一个参数,这样,就可以调用我们刚刚重载的构造方法了。然后运行:
看,是不是,第一个HelloWorld实例化的时候,调用的是默认构造方法,而第二个HelloWorld实例化的时候,调用的是另外一个重载的构造方法。
我们这次呢,将HelloWorld中两个构造方法全部删除掉,然后,我们再HelloWorldTest类中再实例化对象,我们再来看一下:
我们在HelloWorld中顺便弄个普通方法,看好了,普通方法!!用来测试的时候调用。
在这个Test测试方法中,我们可以发现,可以调用,说明这个HelloWorld被实例化了,但是没有构造器怎么实例化的?
Java是这样设计的,如果一个类中没有构造方法,那么系统会自动生成一个默认的无参构造方法。
相反的,如果类中有其他的不是默认的构造方法,那么这个类不会自动创建默认的构造方法了。我们可以测试。上代码!
然后再测试类中进行普通实例化,我们发现会报错,我们来看一下:
说没有定义默认的构造器。
三、Object
Object这个类啊,是个极其特殊的类,为啥这么说,我们来看上面那个创建默认构造函数的事情。(我把图给在贴一下)
不知道大家发现没有,在这个构造函数里面有一个super()方法,学过继承的都知道,super这个是个关键字,super是指向父类的引用。但是这个HelloWorld并没有继承什么啊,它哪里来的父类?
不要急,我们进入到super方法中,我们来看看它具体指的谁。
我们可以看到啊,它是进入到了Object这个类里面了。这就奇怪了,为啥会进入到这里了呢?
我们来看一下jdk Api,https://docs.oracle.com/javase/8/docs/api/ 我给你们连接,自己保存一下。
所有的类都得实现这个类的。看到了吧,这就说是所有的类都默认继承了这个Object。
也就是说,所有的类的父类都是Object。
但是,这时候有人又要问了,不是说Java中不是单继承吗?既然大家都继承了Object了,那为啥还能继承?这不是和Java继承冲突了吗?
下面我来解释:
A这个类默认继承了Object。然后这时候出来了一个B这个类,B呢和A一样,都默认继承了Object。
现在A要继承B,也就是说 A extends B,那么这时候,他们的继承关系就改变了,变成了 A extends B,然后B extends Object。
Java中是这样定义的,如果类没有继承,那么就去继承默认的Object。
大家好好消化一下。