继承之构造方法之爸爸开车

来源:互联网 发布:淘宝宝贝拍照要点 编辑:程序博客网 时间:2024/05/01 22:37

个人对继承中构造方法的一些理解.完全从小白角度看的问题.希望能给新学JAVA继承的同学加深理解微笑如有不妥之处请各位大大加以指正.O(∩_∩)O谢谢!



什么是构造方法:

官方解释:

构造方法:

给对象的数据进行初始化

 

格式:

A:方法名与类名相同

B:没有返回值类型,连void都没有

C:没有具体的返回值

跟没说一样........不过倒是指定了格式.

class Student{

String name;//这是this.name

public Student(){

System.out.println("我是Student无参构造函数");

}

public Student(String name){

this.name = name;//=后面的name是传入的name

System.out.println("我是Student参构造函数");

 

}

}

然后官方还说了如果一个类中没有默认的无参构造方法,并且在实例化一个类对象时候,JAVA虚拟机在编译的时候会给自动加上.

package test;

 

class Student{

}

public class Test{

public static void main(String[] args) {

Student student = new Student();

}

}

但是这个是没有明显提示的,获得反编译文本后发现官方说的对....

以下为反编译文本:

// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.

// Jad home page: http://kpdus.tripod.com/jad.html

// Decompiler options: packimports(3) fieldsfirst ansi space 

// Source File Name:   Test.java

package test;

class Student

{

 

Student()

{

}

}

然后还有就是如果我们只是定义了有参构造函数的话那么JAVA虚拟机就不会给咱们加上无参构造的方法了.而且这时候咱们要是硬要实例化一个无参的对象时还会报错.

package test;

 

class Student{

public Student(String name){

System.out.println("我是有参构造函数.有我单独在无参构造是不可能被虚拟机添加的.");

}

}

public class Test{

public static void main(String[] args) {

Student student = new Student();

}

}

报错信息:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

The constructor Student() is undefined

 

at test.Test.main(Test.java:10)

 

 

 

 

 

 

 

构造方法之爸爸开车带儿子出去玩案例解析

 

全部代码如下:

//以下代码前提是无车的爸爸都会教开车,有车的爸爸都会开,但是不会教开车.儿子都不会开车

//按照常理来说,一个儿子类(无车有车都可以)要想着开车去远方玩.按照咱们常理来讲最好是让儿子自己学会开车而不是让有车的爸爸直接开车带着他去玩(授人以鱼不如授人与渔),(JAVA虚拟机默认都是先调用父类无参构造方法,)

//也就是说JAVA虚拟机会让无车的爸爸教开车而不是让有车的爸爸直接带着儿子去玩.这也可以理

//解为JAVA虚拟机的节省开销性,毕竟让儿子自力更生是每个爸爸的希望啊

 

//然后对于爸爸类来说无参数就是无车,有参数就是有车

.前提:(爸爸类有无参和有参构造方法.详见代码1)

解释为啥子类在构造”无参”(无车)儿子和”有参”(有车)儿子的时候要(如果不写”super();”的话会隐式的调用,其实你也直接指定让爸爸教开车,这样的话JAVA虚拟机就不会自己加上让爸爸教开车了)调用父类的无参构造方法(爸爸教开车)

 

继承中JAVA虚拟机默认都是先调用父类无参构造方法,也就是说JAVA虚拟机会让无车的爸爸教开车而不是让有车的爸爸直接带着儿子去玩

 

按照常理来说,一个儿子要想着开车去远方玩.

1.这个儿子没车 ,然后他现在要让爸爸教他开车.最后自己去玩

2.这个儿子有车,然后要让爸爸教他开车

(让有车爸爸直接带着去玩就先不要想了,JAVA虚拟机很抠门的.)

代码1:

不加无车爸爸教开车版(super();)

 

class Father {

 

public Father() {// (爸爸类无参构造方法)

// 无参构造方法可以想象成是爸爸们固有的本领-----没车的爸爸都能开车.

System.out.println("没车的爸爸教开车");

}

 

public Father(String car) {// (爸爸类有参构造方法)

// 有参构造方法可以想象成是当爸爸们有车之后才拥有的本领(开车带着儿子玩))

System.out.println("有车的爸爸开车带着儿子出去玩");

}

}

 

class Son extends Father {

public Son() { // (儿子类无参构造方法,儿子没车)

// 无参构造方法可以想象成是一个儿子没车也不会开车

 

System.out.println("没车的儿子不会开车,但是也想着先学会开车然后自己开车去玩");

}

 

public Son(String car) {// (儿子类有参构造方法,儿子有车) 儿子现在有车了.且儿子的车和父亲的车可以是用一个名字(car只是指代车,不是具体的哪个车)

 

System.out.println("有车的儿子学会了开车然后自己开车去玩");

}

}

public class Test {

public static void main(String[] args) {

Son son = new Son();// 构造一个没车的儿子

System.out.println("我是无车有车儿子的分割线---------");

Son son2 = new Son("宝马");// 构造一个有车的儿子

}

}

运行结果:

没车的爸爸教开车

没车的儿子不会开车,但是也想着先学会开车然后自己开车去玩

我是无车有车儿子的分割线---------

没车的爸爸教开车

有车的儿子学会了开车然后自己开车去玩

//自己尝试着在无车儿子和有车儿子构造方法里加上super();效果一样

 

.(爸爸类无参构造方法没有写)能教开车的无车爸爸没有了,这可咋办呢?

 

在现实中通常遇到这种情况,只能让有车爸爸带着去玩了.这样也好,不用自己学开车了.但分以下三种情况(不能出现哪个儿子都不提供车的情况,那样还玩啥啊..)

 

 

1.无车儿子和有车儿子都直接给有车爸爸提供一辆车.注意:有车爸爸类只是JAVA虚拟机说有车,但是JAVA虚拟机没义务给他提供车,再说了.也提供不起啊........

class Father {


 

public Father(String car) {// (爸爸类有参构造方法)  有参构造方法可以想象成是当爸爸们有车之后才拥有的本领(开车带着儿子玩))

System.out.println("有车的爸爸开车带着儿子出去玩");

}

}

 

class Son extends Father {

public Son() { // (儿子类无参构造方法,儿子没车) 无参构造方法可以想象成是一个儿子没车也不会开车

super("BYD");//这里随便给车,是车就行

System.out.println("没车的儿子没车也不会开车给爸爸买了一辆,跟着有车爸爸出去玩");

}

 

public Son(String car) {// (儿子类有参构造方法,儿子有车) 儿子现在有车了.且儿子的车和父亲的车可以是用一个名字(car只是指代车,不是具体的哪个车)

super("宝马");//这里随便给车,是车就行

System.out.println("有车的儿子不会开车给爸爸买了一辆(或者直接把自己的给爸爸了)只好跟着有车爸爸出去玩");

}

}

public class Test {

public static void main(String[] args) {

Son son = new Son();// 构造一个没车的儿子

System.out.println("我是无车有车儿子的分割线---------");

Son son2 = new Son("宝马");// 构造一个有车的儿子

}

}

运行结果:

有车的爸爸开车带着儿子出去玩

没车的儿子没车也不会开车给爸爸买了一辆,跟着有车爸爸出去玩

我是无车有车儿子的分割线---------

有车的爸爸开车带着儿子出去玩

有车的儿子不会开车给爸爸买了一辆(或者直接把自己的给爸爸了)只好跟着有车爸爸出去玩

 

 

2.无车儿子给有车爸爸买了一辆,有车儿子直接跟着他们一起出去玩了.这个很好理解.

class Father {

 

 

public Father(String car) {// (爸爸类有参构造方法) 有参构造方法可以想象成是当爸爸们有车之后才拥有的本领(开车带着儿子玩))

System.out.println("有车的爸爸开车带着儿子出去玩");

}

}

 

class Son extends Father {

public Son() { // (儿子类无参构造方法,儿子没车) 无参构造方法可以想象成是一个儿子没车也不会开车

super("BYD");//这里随便给车,是车就行

System.out.println("没车的儿子没车也不会开车给爸爸买了一辆,有车爸爸顺路叫上有车儿子一起出去玩");

}

 

public Son(String car) {// (儿子类有参构造方法,儿子有车)  儿子现在有车了.且儿子的车和父亲的车可以是用一个名字(car只是指代车,不是具体的哪个车)

this();//指代本类中无参构造方法,也就是无车儿子(现在无车儿子可是给爸爸买车的人.哼哼╭(^))

System.out.println("有车的儿子抠门死,不想给爸爸买车也不想让爸爸开自己的车只好蹭无车儿子给爸爸买的车出去玩");

}

}

public class Test {

public static void main(String[] args) {

Son son = new Son();// 构造一个没车的儿子

System.out.println("我是无车有车儿子的分割线---------");

Son son2 = new Son("宝马");// 构造一个有车的儿子

}

}

运行结果:

有车的爸爸开车带着儿子出去玩

没车的儿子没车也不会开车给爸爸买了一辆,有车爸爸顺路叫上有车儿子一起出去玩

我是无车有车儿子的分割线---------

有车的爸爸开车带着儿子出去玩

没车的儿子没车也不会开车给爸爸买了一辆,有车爸爸顺路叫上有车儿子一起出去玩

有车的儿子抠门死,不想给爸爸买车也不想让爸爸开自己的车只好蹭无车儿子给爸爸买的车出去玩

 

 

3.有车儿子给有车爸爸买了一辆,无车儿子直接跟着他们一起出去玩了.这个很好理解.

 

class Father {

 

public Father(String car) {// (爸爸类有参构造方法)     有参构造方法可以想象成是当爸爸们有车之后才拥有的本领(开车带着儿子玩))

System.out.println("有车的爸爸开车带着儿子出去玩");

}

}

 

class Son extends Father {

public Son() { // (儿子类无参构造方法,儿子没车) 无参构造方法可以想象成是一个儿子没车也不会开车

this("BYD");//这个车也是随意的,BYD宝马都可以,只是指代一下有车儿子的车而已.(指代本类中有参构造方法,也就是有车儿子(现在爸爸开的车是有车儿子提供的.哼哼╭(^)))

 

System.out.println("没车的儿子毕竟是个屌丝,只能靠着有车儿子的车一起出去玩了");

}

 

public Son(String car) {// (儿子类有参构造方法,儿子有车)  儿子现在有车了.且儿子的车和父亲的车可以是用一个名字(car只是指代车,不是具体的哪个车)

super("BYD");// 这里随便给车,是车就行

System.out.println("有车的儿子给爸爸买了一辆车,叫上无车儿子一起出去玩");

}

}

 

public class Test {

public static void main(String[] args) {

Son son = new Son();// 构造一个没车的儿子

System.out.println("我是无车有车儿子的分割线---------");

Son son2 = new Son("宝马");// 构造一个有车的儿子

}

}

运行结果:

有车的爸爸开车带着儿子出去玩

有车的儿子给爸爸买了一辆车,叫上无车儿子一起出去玩

没车的儿子毕竟是个屌丝,只能靠着有车儿子的车一起出去玩了

我是无车有车儿子的分割线---------

有车的爸爸开车带着儿子出去玩

有车的儿子给爸爸买了一辆车,叫上无车儿子一起出去玩

 

 

总结:

通过以上代码我们可以认识到,在继承中,JAVA虚拟机而言,子类在实例化自身时(无参有参都是),都要首先调用父类的无参构造方法----super();

我们可以指定子类具体调用父类的无参或有参构造方法--super();super(参数)//此参数视父类有参构造方法参数类型而定

this();在子类中代表调用子类本身的无参构造方法(在有参构造方法中使用)

this(参数);代表调用子类本身的有参构造方法(在无参构造方法中使用)

其中参数于子类本身需要类型而不同而不同.

 

 

 

0 0