黑马程序员技术交流社区
标题:
]构造函数、构造代码块、静态代码块对类和对象的初始化区别?
[打印本页]
作者:
余耀明
时间:
2012-4-17 21:57
标题:
]构造函数、构造代码块、静态代码块对类和对象的初始化区别?
构造函数、构造代码块、静态代码块对类和对象的初始化区别?
作者:
胡元
时间:
2012-4-17 22:43
构造函数、构造代码块、静态代码块对类和对象的初始化区别?
静态代码块是先于对象存在的,类一加载就会在内存中产生,随着类的加载而加载,生命周期最长,
一般作为共享数据来用!
构造代码块是对所有对象做的初始化,不包含特有数据,比如人,人都有胳膊腿,这就可以用构造代码块
优先级高于构造函数!
构造函数对虾昂创建时给对象属性初始化,比如人,人各有个的名字,创建对象的时候通过构造函数
初始化对象的特有属性!
作者:
liuyang
时间:
2012-4-17 22:46
构造函数
特点:
1、函数名与类名相同
2、不用定义返回值类型
3、不可以写return语句
作用:
给对象进行初始化。
注意:
1、默认构造函数的特点。
2、多个构造函数是以重载的形式存在的。
对象一建立就会调用与之对应的构造函数。
构造函数的作用:可以用于给对象进行初始化。
当在堆内存中产生一个对象的时候需要一个初始化动作
对象为什么要进行初始化呢?
现实生活中的事物很多他只要一出现就具备了一些基本的特性:比如产生一个人,这人一出生他就会哭这个行为,这个行为就是他的初始化行为。
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。
构造函数和一般函数在写法上有不同。
在运行上也有不同。
构造函数是在对象一建立就运行,给对象初始化。
而一般函数是对象调用才执行,是给对象添加对象具备的功能
一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。
什么时候定义构造函数呢?
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
构造函数在定义过程中要分析是否需要未知内容参与运算,这些内容是什么数据类型,这一点与一般函数相同。
注意:如果把类中的所有构造函数都私有private,那么该类所有的对象都不能初始化成功,会报错。
class Person
{
// Person( ){ }//系统默认添加的构造函数,方便对象初始化,否则对象是建立不出来的。
Person( )
{
System.out.println("Person run");
}
private String name;
private int age;
构造代码块:
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
构造代码块和构造函数的区别:
构造代码块是给所有对象进行统一初始化,定义不同对象共性初始化内容:比如每个孩子生出来都会哭。
而构造函数是给对应的对象初始化。
{
//System.out.println("person code run);
cry( );
}
Person( )
{
System.out.println("A: name="+name+",,age="+age);
cry( );
}
Person( String n)
{
System.out.println("B: name="+name+",,age="+age);
cry( );
}
Person( String n,int a)
{
name=n;
age=a;
System.out.println("C: name="+name+",,age="+age);
cry( );
}
public void getName()
{
return name;
}
public void setName(String n)
{
name=n;
}
public void cry( )
{
System.out.println("cry.......");
}
}
class PersonDemo
{
public static void main(String[ ] args)
{
Person p1=new Person( );
//打印结果:A:name=null,,age=0 cry.....
p1.cry( );
//打印结果:cry.....
Person p2=new Person( "lisi");
//打印结果:A:name=lisi,,age=0 cry......
System.out.println( p2.getName( ) );//打印结果:lisi
lisi认为这个名字太难听,想改名为libusi,但是我们不能这样写
// Person p2=new Person( "lisi");
因为这样写就又新建了一个对象叫libusi
应该这样写:
p2.setName(libusi);
System.out.println( p2.getName( ) );//打印结果:libusi
Person p1=new Person("wangwu",10 );
//打印结果:A:name=wangwu,,age=10 cry.....
}
}
作者:
zhaishuang
时间:
2012-4-19 01:14
构造函数的作用是在创建对象时对其进行初始化,当然对象要基于类才能创建;
构造代码块是对所有对象进行初始化,也就是说只要创建了对象,就会运行构造代码块中的内容;
静态代码块,只要是静态的都是优先于对象存在,随着类的加载而加载,可以想象成是把他和类绑在了一起;同生共死的。静态代码块的作用一般是初始化静态成员变量的。还有就是静态代码块里可以持有某一类的引用而使用一般的方法。
作者:
韩新凯
时间:
2012-4-19 08:51
本帖最后由 韩新凯 于 2012-4-19 08:53 编辑
被JVM装载->先以后面描述的方式之后执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行->如果有静态代码块(以与静态初始化一样的方式执行)->如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉其他代码,
构造代码块总是会执行的
作者:
张超超
时间:
2012-4-19 09:13
Java初始化顺序:
1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4,装载子类B后,完成静态动作
类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化(非静态代码)
3,父类A的构造方法
4,子类B的成员实例化(非静态代码)
5,子类B的构造方法
先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
测试代码:
abstract class base
{
public int age=getNumber(100);
static{
System.out.println("base static block");
}
{
System.out.println("base nonstatic block");
}
static int sage=getNumber(50);
base(){
System.out.println(age);
System.out.println("base start");
draw();//会调用子类覆盖后的方法,这儿是0!(方法的重载)
System.out.println("base end");
}
static int getNumber(int base){
System.out.println("base.getNumber int"+base);
return base;
}
public void draw(){
System.out.println("base.draw");
}
}
public class initializeOrder extends base{
public int age=getNumber(1001);
private int _radius=getNumber(10);
static int sage=getNumber(250);
static{
System.out.println("subclass static block");
}
{
System.out.println("subclass nonstatic block");
}
initializeOrder(int radius){
_radius=radius;
System.out.println(age);
draw();//这儿是1000
System.out.println("initializeOrder initialized");
}
public void draw(){
System.out.println("initializeOrder.draw "+_radius);
}
public static void main(String[] args) { // TODO Auto-generated method stub
new initializeOrder(1000);
}
}
输出为:
base static block
base.getNumber int50
base.getNumb
er int250
subclass static block
base.getNumber int100
base nonstatic block
100
base start
initializeOrder.draw 0
base end
base.getNumber int1001
base.getNumber int10
subclass nonstatic block
1001
initializeOrder.draw 1000
initializeOrder initialized
希望对你有帮助
作者:
王德升
时间:
2012-4-19 13:08
本帖最后由 王德升 于 2012-4-19 13:09 编辑
1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4,装载子类B后,完成静态动作
类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化(非静态代码)
3,父类A的构造方法
4,子类B的成员实例化(非静态代码)
5,子类B的构造方法
先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
测试代码:
abstract class base
{
public int age=getNumber(100);
static{
System.out.println("base static block");
}
{
System.out.println("base nonstatic block");
}
static int sage=getNumber(50);
base(){
System.out.println(age);
System.out.println("base start");
draw();//会调用子类覆盖后的方法,这儿是0!(方法的重载)
System.out.println("base end");
}
static int getNumber(int base){
System.out.println("base.getNumber int"+base);
return base;
}
public void draw(){
System.out.println("base.draw");
}
}
public class initializeOrder extends base{
public int age=getNumber(1001);
private int _radius=getNumber(10);
static int sage=getNumber(250);
static{
System.out.println("subclass static block");
}
{
System.out.println("subclass nonstatic block");
}
initializeOrder(int radius){
_radius=radius;
System.out.println(age);
draw();//这儿是1000
System.out.println("initializeOrder initialized");
}
public void draw(){
System.out.println("initializeOrder.draw "+_radius);
}
public static void main(String[] args) { // TODO Auto-generated method stub
new initializeOrder(1000);
}
}
作者:
余耀明
时间:
2012-4-19 14:11
liuyang 发表于 2012-4-17 22:46
构造函数
特点:
清楚了!!:)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2