一、 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. [HNOI 2010]Planar

    Description 题库链接 给出 \(T\) 个 \(N\) 个节点 \(M\) 条边的无向图(无重边自环),并给出它们各自的哈密顿回路.分别判断每个图是否是平面图. \(T\leq 100,3 ...

  2. [BZOJ 4916]神犇和蒟蒻

    Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你 ...

  3. 习题9-8 Uva1632

    题意: 给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间: 否则输出No solution 思路: 对于一段区间[i,j],你取完之后肯定是在最左端或者最 ...

  4. Postgres中postmaster代码解析(中)

    今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...

  5. CSS3中三种清除浮动(float)的方法

    方法一:添加新的元素 .应用 clear:both .clear{ clear:both; height:; height:; overflow:hidden; } 方法二:父级div定义 overf ...

  6. win10下python环境变量设置

    我用的是python_2.7.3.msi,从官网下载之后,一路按照默认进行安装. 安装之后配置环境变量的步骤如下: 1,点“我的电脑”,右键选“属性” 2,选择“高级系统设置”--->选“环境变 ...

  7. 春招实习面经分享(已拿到腾讯春招Offer)

    十分幸运地收到了腾讯的Offer..回来报答一下各位牛客网的战友们,说起来也是有点运气成分,最后通过腾讯的内推收到了offer!之前也屡遭重创,阿里的内推一面挂了(寒假过早地投简历,电话面试应对地不太 ...

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

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

  9. 读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26

    上次读书笔记中,提到了依赖传递.看着依赖传递表,一直在思考为什么会是这样. 先看传递表: compile test provided runtime compile test provided run ...

  10. 利用Express和ejs编写简单页面

    1.创建临时文件夹ejsdemo $ mkdir ejsdemo 2.进入ejsdemo 初始化项目 $ npm init 3.安装express $ npm install express --sa ...