一、 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. 【NOIP 2017】列队

    Description Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 n ...

  2. ●UVA 10652 Board Wrapping

    题链: https://vjudge.net/problem/UVA-10652 题解: 计算几何,Andrew求凸包, 裸题...(数组开小了,还整了半天...) 代码: #include<c ...

  3. poj 2425 AChessGame(博弈)

    A Chess Game Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3791   Accepted: 1549 Desc ...

  4. bzoj 4010: [HNOI2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  5. [bzoj4906][BeiJing2017]喷式水战改

    来自FallDream的博客,未经允许,请勿转载,谢谢. [题目背景] 拿到了飞机的驾照(?),这样补给就不愁了 XXXX年XX月XX日 拿到了喷气机(??)的驾照,这样就飞得更快了 XXXX年XX月 ...

  6. VB6工程在Win10系统打开提示MSCOMCTL.OCX无法加载

    解决办法: 修改.vbp文件中的 00F8754DA1}#2.1#0; MSCOMCTL.OCX 改为 00F8754DA1}#2.0#0; MSCOMCTL.OCX 中间的2.1 改为 2.0

  7. c++读写MySQL

    看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂.写这篇文章的目的不是别的,就一个,告诉您用 ...

  8. this指针是什么?

    this指针的用处: 一个对象的this指针并不是对象本身的一部分.不会影响sizeof(对象)的结果.this的作用域在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本 ...

  9. dva-quickstart 与 create-react-app 比较(一)

    最近在学习 React ,  现对 dva-quickstart   与  create-react-app 比较 1. 安装, 两个都需要安装工具包:npm install -g create-re ...

  10. IE下iframe跨域session和cookie失效问题的解决方案

    http://blog.csdn.net/wauit/article/details/9875157