黑马程序员技术交流社区
标题:
面向对象代码块的优先顺序和区别
[打印本页]
作者:
潘才新
时间:
2013-7-5 15:57
标题:
面向对象代码块的优先顺序和区别
本帖最后由 杨兴庭 于 2013-7-5 22:21 编辑
自己笔记出来的, 直接上图了,诚请老师和黑马解惑!
IMG_20130705_155122.jpg
(320.69 KB, 下载次数: 1)
下载附件
2013-7-5 15:57 上传
--
作者:
郑锐
时间:
2013-7-5 16:08
本帖最后由 郑锐 于 2013-7-5 16:13 编辑
第一个问题你说对了。
第二个问题
构造代码块是给所有的对象初始化,就是说你只要创建对象,构造代码块就一定运行。
构造函数是给指定对象初始化用的,就是说创建对象时调用哪个构造函数,就运行哪个构造函数且只运行一个。
总结来说,构造代码块一定会运行,构造函数只有被调用才执行。下面代码运行结果
构造代码块
无参构造函数
-------------我是分割符--------
构造代码块
有参构造函数--------3
<div class="blockcode"><blockquote>public class ReturnThis
{
{
System.out.println("构造代码块");
}
ReturnThis(){
System.out.println("无参构造函数");
}
ReturnThis(int num){
System.out.println("有参构造函数--------"+num);
}
public static void main(String[] args)
{
ReturnThis rt1=new ReturnThis();
System.out.println("-------------我是分割符--------");
ReturnThis rt2=new ReturnThis(3);
}
}
复制代码
作者:
刘_鑫
时间:
2013-7-5 16:18
执行顺序
1. 静态的属性和静态的语句块都是在类加载的时候完成,非静态的东西是在创建对象的时候执行的.
2. 单个类的初始化顺序如下: 静属->静块->非静属->非静块->构造函数.
3. 有继承关系的类的初始化顺序如下: 父静属->父静块->子静属->子静块 ->父非静属->父非静块->父构造->子非静属->子非静块->子构造.
构造代码块和构造函数的区别:构造代码块是给所有对象进行统一初始化 而构造函数是给对应的对象初始化
作者:
x.love
时间:
2013-7-5 16:32
优先级对着呢!构造代码块是给所有对象初始化。而构造函数是给对应对象初始化,比如:可以有无参构造函数和有参构造函数,不同的对象调用不同的构造函数,但是调用是同一个代码块
作者:
崔龙飞
时间:
2013-7-5 16:33
你的笔记写的很清楚。
运行的优先顺序:
static是存放在共享区的,只要类一加载进内存,就会先执行静态代码快。这时对象还没有建立,优先于构造代码块;
构造代码块是在创建对象后才执行的,优先于构造函数;
构造函数是创建对象后,调用就执行,不调用不执行。默认无餐构造函数也在此例,因为一创建对象就会有默认无参构造函数
构造函数和构造代码块都可以给对象初始化;
构造函数在创建对象后,对象调用哪个构造函数,哪个构造函数就运行,不调用不运行。对指定对象初始化;
构造代码块只要在对象创建后就一定会运行,不管你建立多少个对象。用来给所有对象初始化;
作者:
赵海洋
时间:
2013-7-5 17:25
为了更好的维护论坛的学习氛围,如果您的的问题“已经解决”请即时联系版主将帖子状态改成“已解决”
-------------------坚持学习,黑马因你而精彩---------------
作者:
郑先明
时间:
2013-7-5 17:39
第二点: 关于静态代码块和构造代码块.
1, 静态代码块.
作用是: 用于给类进行初始化.
class StaticCode
{
static//静态代码块,随着类的加载而加载.而且只执行一次.
{
}
}
class StaticCodeDemo
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
复制代码
2, 构造代码块.
class Animal
{
private String eat;
{//这是构造代码块,作用是给所有对象初始化,存放对象的共性.
System.out.println("我是一只动物");
}
Animal()//这是构造函数,作用是给对应的对象针对性的初始化,存放对象的特性.
{
eat="肉";
}
Animal(String eat)
{
this.eat=eat;
}
public void food()
{
System.out.println("eat:"+eat);
}
}
class StaticCodeDemo
{
public static void main(String[] args)
{
Animal c = new Animal();
c.food();
Animal d = new Animal("草");
d.food();
}
}
输出
我是一只动物
eat:肉
我是一只动物
eat:草
这是我在老师的笔记上自己添加了一点自己比较好理解的话.
至于优先级, 静态代码块只要类一加载, 静态代码块就存在静态区, 而构造代码块, 只要创建了对象就会调用, 构造函数同理, 只是构造代码块是给所有对象初始化,而构造函数是给相对应对象初始化, 所以我的观点是, 按照优先顺序, 应该是 静态代码块>构造代码块=构造函数
如果有那个理解错误, 请大神帮我指出来.
作者:
杨兴庭
时间:
2013-7-5 22:21
楼主您好,我已将您帖子的状态改成“已解决”,对此如有疑问可以通过
QQ632763270和我取得联系
-------------------坚持学习,黑马因你而精彩---------------
作者:
潘才新
时间:
2013-7-6 00:40
感谢各位牛人,膜拜啊..
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2