是不是因为构造函数名和类名相同所以它才在new 创建对象的时候就被调用了啊!


我来试试看,看楼主能不能理解我下面说的话。下面可都是重点哦。
构造器可以当友念成一个特殊的方法,它在程序中的主要作用就是负责java的实例变量执行初始化操作,也就是赋初始值,而创建java实例对象这个工作,在执行构造器代码之前就已经完成了。
构造器在执行之前,该实例对象所占用的内存空间就已经被分配了。这些内存中的值,都是空值---对于基本类型变量来说就是默认0或者false,引用类型变量则是null。
验证我上面的话是否可靠。可以用一个例子来证明。 有一个父类,父类中有一个私有的实例变量i并赋初始值为2.父类中有一个无返回值无参数的普通方法比如public void display(){}; 方法体内就是输出一个i;父类中就有一个无参的构造器,构造器中就是用this.display()调用这个方法。
然后一个子类来继承该父类,子类中的也定义一个和父类名称相同的实例变量i并赋值为22,子类中也定义一个和父类一模好肆困一样的方法public void display(){}; 方法体中也是输出i.子类的构造器也是无参的,构造器里面给i赋值222.
然后在main函数中,我们直接就是new 子类。如果父类叫做Base,子类就叫做Derived.
main函数就写一句话,就是new Derived();
这个时候,你认为结果是输出什么?是2,还是22,还是222?是输出一个数,还是输出2个数?
呵呵,如果对于java的类的初始化时机以及构造器和this关键字的理解深刻和扎实的话,自然而然知道结果就是只输出一个值,这个值就是0,也就是验证我上面说的话。
我们来分析程序,首先我们要知道,当我们初始化一个类的实例对象之时,程序首先会找到该类的最顶层父类,首先初始化最顶层的父类,然后逐级向雹早下初始化,最终才会初始化本类。java的最原始最顶层的基类也就是Object类。所以我们初始化也就是new子类的时候首先会new出Object然后再去new父类。
看前面的程序,首先父类定义的实例变量i赋了初始值也就是2,这个赋值的操作时在构造器中执行的。构造器看起来好像只有一句话就是this.display().其实呢,实际中是在该方法之前会i=2;然后才是this.display();那么此时,很明显父类的实例变量i的值是2,然后就会调用display方法。可是问题又出来了。如果按照我们平常思维display方法中是输出i,那么肯定程序的结果有一个一定是输出2,为什么结果是0呢?
这就是当前this这个关键字的威力了。因为this在普通的方法中和在构造器中的意义是不一样的。
this在普通的方法中,this指向正在执行方法的类的实例,而在构造器之中,this却是代表了当前正在执行初始化的java实例对象。我们程序中的main函数只是初始化子类,如上所说。this虽然处在父类构造器之中,但是this引用的却是子类的对象,但是!!!注意,因为this处在父类构造器中,所以this的编译类型还是父类类型,但是它实际的引用类型却是子类类型。这就是关键。
因为this表示的是子类,所以程序调用display方法就是在调用子类的方法而不是调用父类的disp方法。而此时因为我们知道先要初始化父类才能初始化子类,所以子类的构造器还没有被执行的。这样输出子类的实例变量结果就是为0.
因为我最开头说过了,创建对象和分配内存空间以及默认空值的操作在执行构造器之前已经完成了,i是基本类型变量自然在内存中的默认值就是0.
不是这样理解的,java在创造出来的时候就已经规定好了,就拿你自己的代码简单的说吧,如果你要new一个对象的时候,如:
public class xscj2
{
public static int a1(int a[])
{
int result=0,i=0;
while (i<a.length)
result+=a[i++];
return result/a.length;
}
xscj2 xs = new xscj2();
new关键词后面的方法xscj2()就是系统已经帮你绝祥创建好的构造函数,但是当你觉得这个构造达不到并唤搏你自己的要求时,链迹那么就要自己重写一个构造方法了,当然,这时你就得自己写出空构造了,重写自己的构造时,往往我们都在里面加一个或多个参数,比如:
public class xscj2
{
int a;
int b;
String c;
public xscj2(){
}
public xscj2(int a,int b,String c)
{
this.a = a;
this.b = b;
this.c = c;
}
}
现在明白了吗?如果还有疑问,你直接加我的Hi百度就可以了。
恩,你说的是对的,不过不光是这些原因:
1.构造函数定义的时候不能有返回值,方法名称必须和类名一样
2.可以有多个构造函数,也就是重载
3.new的时候是根据参数指核燃类型来选择使用哪个构造函数氏祥
例如:
class AAA{
public AAA(){}
public AAA(int a){}
}
如果AAA a = new AAA();调用的就唯虚是那个没有参数的构造方法
如果AAA a = new AAA(10);调用的就是那个有一个int型参数的构造方法
可以这么理解。构造函数纤租是一种特殊的方法,主要是为了给初始化对象赋初值。
C++允许同名函数,也就允许在一个类中有多个构造函数。如果一个都没有,编译器将为该类产生一个默认的构造函数。
构造毁族兆函数上惟一的语法限制是它不能指定返回类型,甚至穗并void 也不行。
A a=new A();
这个A()就是构造函数~~~
构造函数其实是有返回值的 它返回一个对象的实例
你问的说反了 应该是在用庆袭new调用凳差带了构造枣芦函数以后 构造函数会返回一个对象的实例(也就是创建一个对象)