一、 java 构造方法不等于创建对象而是初始化对象,new 关键字分配内存和创建对象的。



 二、Test test = new Test();

有人用上面的表达式来说明构造方法返回对象引用,这是明显错误的。new关键字有两个作用。

一是分配内存,创建对象。

二是调用构造方法,完成对象的初始化工作。

完成这两步之后,才算创建了一个完整的Java对象。

因此,得到的引用是new指令的结果,不是构造方法的返回值,因为构造方法没有返回值。

     有一点需要注意:new指令创建对象,同时使对象的各个字段得到其默认值,比如整数为0,浮点数为0.0,引用为null,boolean为false等。也就是说在构造方法执行之前,各个字段都有默认值了。

     通过上面说明,我们明确了构造方法的职能(初始化new指令创建的对象,得到一个状态合法的对象,完成对象的

创建过程)。任何类都有构造方法,但是new指令只能创建非抽象类的对象。

三、父类的构造方法中调用被子类重写的方法有多态现象。

如下:

class Father{
    private int i = 5;
    public Father() {
        System.out.println("Father's i is " + this.i);
        test();
    }
    public void test(){
        System.out.println(this.i);
    }
}   

class Son extends Father{
    private int i = 55;   

    public Son() {
        System.out.println("Son's i is " + this.i);
    }   

    @Override
    public void test() {
        System.out.println(this.i);
    }   

}
public class Test {
    public static void main(String[] args) {
        new Son();
    }
} 

结果是:

Father's i is 5

0

Son's i is 55

结合第一点,构造方法调用之前,首先是new指令创建了一个对象,并将各个成员初始化为其默认值。下面看构造方法的调用过程。

子类构造方法会调用父类构造方法,父类构造方法首先打印Father's i is 5。然后调用test()方法,注意,我们创建的是Son类的对象,所以test()方法调用的是Son类定义的test()方法,也就是说发生了多态。我们再去看Son类中test方法的实现,就是简单的输出this.i,为什么是0呢,别忘了我们还没有执行子类的构造方法啊,所以此时子类的i还是new指令初始化得到的0。好,test()方法执行完了,总算回到子类构造方法继续执行,先把i赋值为55,下面的输出语句Son's
i is 55也就不难理解了。

在构造方法中调用方法要特别注意这种多态现象。

如果有多层继承关系,也是一样,如下:

<span style="font-size:18px;">public class Duotai {
	public static void main(String[] args) {
		new Sunzi();
	}
}

class Father {
	private int a = 10;

	public void test() {
		System.out.println("father=" + this.a);
	}

	public Father() {
		System.out.println("father constract=" + this.a);
		test();
	}
}

class Son extends Father {
	private int b = 1;

	public Son() {
		System.out.println("son constract=" + this.b);
		test();
	}

	@Override
	public void test() {
		System.out.println("son =" + this.b);
	}
}

class Sunzi extends Son {
	private int c = 100;

	public Sunzi() {
		test();
	}

	@Override
	public void test() {
		System.out.println("sunzi=" + this.c);
	}
}</span>

结果为:

father constract=10

sunzi=0

son constract=1

sunzi=0

sunzi=100

在继承抽象类中也是一样:

public abstract class Super {
<span style="white-space:pre">	</span>public Super(){
<span style="white-space:pre">	</span>print();
}
<span style="white-space:pre">	</span>public abstract void print();
} 

public class Sub extends Super{
<span style="white-space:pre">	</span>private int i = 10;
<span style="white-space:pre">	</span>public void print(){
<span style="white-space:pre">	</span>System.out.println(i);
}
public static void main(String args[]){
<span style="white-space:pre">	</span>Sub sub = new Sub();
<span style="white-space:pre">	</span>sub.print();
}
} 

Output:
0
10 

这个涉及到类的初始化的问题 

当你入口类Main方法里掉用Sub sub = new Sub(); 触发Sub类初始化,但他发现他有父类Super,而Super类没有初始化,所有先初始化父类,当初始化父类的时候,他的构造方法调用了一个抽象方法,所以找到子类的实现,(注意:这个时候的i值是0,默认值),所有输出0,之后初始化子类Sub,
i的值是10,当调用print方法时候输出10

抽象类不能来被实例化,因为它可能是一个不完整的类,里面可能包含抽象方法,抽象方法没有方法体,没有实现,所以子类继承抽象类后,实现了它的方法体,子类就是一个具体的类,可以被实例化。

java创建对象详解和多态问题的更多相关文章

  1. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  2. Java面向对象详解

    Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...

  3. Java内部类详解(一)

    (转自:http://blog.csdn.net/wangpeng047/article/details/12344593) 很多人对于Java内部类(Inner Class)都十分陌生,甚至听都没听 ...

  4. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  5. 「万字图文」史上最姨母级Java继承详解

    摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...

  6. Java 集合详解 | 一篇文章解决Java 三大集合

    更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...

  7. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  8. 黑马----JAVA迭代器详解

    JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...

  9. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 机器学习基石:07 The VC Dimension

    当N大于等于2,k大于等于3时, 易得:mH(N)被Nk-1给bound住. VC维:最小断点值-1/H能shatter的最大k值. 这里的k指的是存在k个输入能被H给shatter,不是任意k个输入 ...

  2. JS 变量类型互相转换

    转载自:http://zhaizhiyuan.blog.163.com/blog/static/1897672632009093147268/ Java中几种常用的数据类型之间转换方法:  1. sh ...

  3. pytorch 移动端框架 thnets 附c示例代码

    前年年前做一个手机移动端图像识别项目的时候, 先后尝试了mxnet,thnets,caffe,tensorflow. 当时的情况是,mxnet内存管理奇差,内存经常由于模型运算分配不足,app挂掉. ...

  4. [TJOI 2016&HEOI 2016]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  5. [ZJOI2015]幻想乡战略游戏

    Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...

  6. Codeforces #Round 406(Div.2)

    来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------- 大家好,我是一个假人.在学习O ...

  7. SpringBoot学习之集成mybatis

    一.spring boot集成Mybatis gradle配置: //gradle配置: compile("org.springframework.boot:spring-boot-star ...

  8. Django Class Views

    一.Base views View class django.views.generic.base.View 主要的基于类的基本视图.所有其他基于类的视图都从这个基类继承而来.它不是一个通用的视图,因 ...

  9. B/S与C/S架构

    1.CS.BS架构定义 CS(Client/Server):客户端----服务器结构.C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据. ...

  10. 百度移动深度学习 Mobile-deep-learning(MDL)

    Free and open source mobile deep learning framework, deploying by Baidu. This research aims at simpl ...