当前位置:首页 » 编程软件 » 调用构造器是编译器的责任

调用构造器是编译器的责任

发布时间: 2022-07-29 18:27:00

java构造器:什么是构造器它的作用是什么

java类中,如果用户没有一个类创建构造器,java编译器就会自动识别,在jvm中为这个类创建一个默认构造器,这个构造器没有参数。当用户为类创建一个构造器时,不管这个构造器是否有参数,jvm就不再为该类创建一个无参的构造器了,为了防止这个类被其他类继承,所以我们要强调,在为类创建构造器时就要创建一个无参的构造器,以防止子类初始化时,调用父类的默认构造器。所以我们创建的这个无参构造器,也是默认构造器。

㈡ C++类的构造函数调用问题

默认构造函数:
声明类的对象的时候
声明类的数组的时候(每个元素会单独调用一次)
调用等号运算符的时候(等号左边的变量会先调用一次)================================================
最后一句是不对的。上两句是对的

如果等号左边的变量还没有实例化的话,只会调用拷贝构造函数,不会调用默认构造函数的,也不会调用=运算符。 即
CTest aa; //调用默认构造函数
CTest bb = aa; //只会调用拷贝构造函数,不会调用默认构造函数的,也不会调用=运算符。就相当于 CTest bb(aa);
但是如果 aa = bb; //这只会调用=运算符,因为aa已经实例化了
要弄明白拷贝构造函数的意思,就是拷贝一个对象来构造另外一个对象,重点是“构造”这个词,如果说aa已经被构造了(实例化),那下面还要构造什么呢,也就不会再调用拷贝构造函数了,能进行的操作只能是重新赋值而已,就是=运算符。但是像CTest bb = aa; 因为bb还没有构造,那只能调用拷贝构造函数了

拷贝构造函数:
类的对象作为参数传递给函数的时候
类的对象作为返还值的时候
====================================
第一句是对的,第二句是不对的。比如
假如有个函数是这样(返回类型不管是不是引用类型,下面的结果都是一样):
CTest getTest() { return m_myTest; }

那么,
CTest aa; //实例化aa,调用默认构造函数
aa = getTest(); //只会调用 = 运算符,不会调用任何构造函数,因为aa已经实例化了。
CTest bb = getTest(); //此时返回值后只会调用拷贝构造函数,不会调用其他的函数,包括=运算符也不会被调用。

所以不论是赋值还是调用,只要看赋值左边的变量是否已经被实例化了,如果实例化了,只会调用=运算符, 如果没有,只会调用拷贝构造函数。类的对象作为参数传递给函数的时候(不是引用类型),就是把一个对象给一个没有实例化的变量赋值,所以这时只会触发拷贝构造函数,而不是其它函数。

这些都是硬道理,没什么再深入讲的,如果实在不明白,就死记着吧。

㈢ 关于java构造器的几点学习笔记

1.构造器: 一个创建对象时被自动调用的特殊方法,为的是初始化。构造器的名称应与类的名称一致。
例如:public class Person {

private String name;

private String password;

public Person() {
super();
// TODO Auto-generated constructor stub
}

public Person(String name, String password) {
super();
this.name = name;
this.password = password;
}

}
public static void main(String[] args) {
//初始化

Person person = new Person("张三","123");

}
2.创建一个对象时,系统会该对象的属性 默认初始化,数值类型属性的值为0,布尔类型false,引用类型设置为null.
3在子类中调用父类的构造器来初始化父类,那就用合适的参数来调用super(),你用没有参数的super()来调用父类的构造器(注:同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
4. this

4.1构造器中调用this只能放在第一位;
4.2构造器中调用this只能调用一次;
4.3普通方法中不能使用this()调用构造器;
5. 构造器的作用
5.1:创建对象,凡是必须和 new 一起使用
5.2:完成对象的初始化操作
6.注意事项
6.1:构造器的名称和当前所在类的名称相同
6.2:禁止定义返回类型,千万不要使用 void 作为返回类型(这属于普通方法)
6.3:在构造器中,不需要使用 return 语句(其实构造器是有返回值的,返回的是当前创建对象的引用)

㈣ JAVA构造函数的名字为什么跟类名一样

调用构造器是编译器的责任,所以就需要让编译器知道应该调用哪一个方法。把构造函数的名称设置成和类名一样的话,那编译器在加载类的时候就知道了构造函数的方法,因初始化期间(在java中,“初始化”和“创建对象”是捆绑在一起的额,不能分离开来)要自动调用构造器,所以这种做法就比较好了。如果不一样的情况下,你还得告诉编译器构造函数的名称是什么

㈤ JAVA 构造器

您好楼主。构造器在java中是必须有的。你说“我看见很多代码中好像没有啊”。是啊,确实是这样,但是如果你不显示的写出构造器,系统会提供一个默认的无参数的构造器。
构造器,顾名思义就是构造某种东西的,这里是构造对象的。楼主应该看到调用方法是怎么用的吧,就是实例名加上“.”方法名,例如a.getSize()。其实你创造对象,比如Test test=new Test();这个new关键字,其实就是调用的Test这个对象,然后赋值给“test”。
构造器另一个用途是初始化代码的。您说“不就是赋个初值吗?就直接赋值不就行了?难道初始化不是赋初值吗?”这个我认为,应该是一种编程习惯吧。将需要赋值的变量在构造器中初始化,这样可能防止忘记赋初值吧。可能是这样!我看到的很多例子中,大部分都是在构造器中进行初始化的,除了静态的,或者最终的变量。
楼上的建议不错,看看《thinking in java》,这里是深入的,我也正在研究。

㈥ c# 构造函数的调用

下面是我学过C#的一点理解,希望对你有帮助!

很简单的,构造函数实际就是在主类和其他类之间传递参数用的,看看这两段代码,

关于自动调用,构造函数的自动调用是根据参数的数量进行区分的,比如下面第一段代码,CoOrds类中有两个构造函数,到底调用哪一个,就看主类中对象实例化的时候,类名里写了几个参数: p1是CoOrds(),没有参数,所以自动调用第一个构造函数,同理,p2调用第二个

至于为什么要new, new的意思不是调用,而是实例化,初始化一个类,这个概念我是这样理解的, 已经写好的CoOrds类好比一个工具模具,你要在主类中使用的时候,不可能用模板来操作吧,这时候,你需要用模具来复制一个崭新的工具供你使用,new就好比是把模具拿来制造新工具的过程。
phblic class CoOrds
{
public CoOrds()
{
x = 0;
y = 0;
}
public CoOrds(int x, int y)
{

this.x = x;
this.y = y;
}
}
……
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
……

㈦ 关于java构造器的详细解释,谢谢。

首先要注意的是Java的构造器并不是函数,所以他并不能被继承,这在我们extends的时候写子类的构造器时比较的常见,即使子类构造器参数和父类的完全一样,我们也要写super就是因为这个原因。
构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象、同步、静态等等访问限制以外的形式。
因为构造器不是函数,所以它是没有返回值的,也不允许有返回值。但是这里要说明一下,构造器中允许存在return语句,但是return什么都不返回,如果你指定了返回值,虽然编译器不会报出任何错误,但是JVM会认为他是一个与构造器同名的函数罢了,这样就会出现一些莫名其妙的无法找到构造器的错误,这里是要加倍注意的。

在我们extends一个子类的时候经常会出现一些意想不到的问题,我在这里说一些和构造器有关的。
首先说一下Java在构造实例时的顺序(不讨论装载类的过程)
构造的粗略过程如下
1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
2、执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)
3、执行构造器
4、将变量关联到堆中的对象上

介绍一下准备知识,以备一会来详细说明这个的流程
this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行, 在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误,注意此处,我们经常在继承父类的时候构造器中并不写和父类有关的内容,此时如果父类没有缺省构造器,就会出现编译器添加的缺省构造器给你添麻烦的问题了哦。例如:Class b extends a{public b(){}}就没有任何有关父类构造器的信息,这时父类的缺省构造器就会被调用。你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器
使用构造器中的注意事项。

一、构造器中一定不要创建自身的实例,否则会造成调用栈溢出错误。这个规则也适用于对象的实例变量,如果对象中有自身的引用,这个引用一定不能在定义中或者构造器中初始化。

class a
{
a _a = new a();

public a()
{
_a = new a();
a _b = new a();
}
}

以上三种情况都会造成栈溢出,呵呵,这样会造成一个无穷递归的调用栈。

二、如果父类是一个抽象类,那通过调用父类的构造器,也可以将它初始化,并且初始化其中的数据。
三、如果你要在构造器中调用一个方法时,将该方法声明为private。
对于这个规则是需要一些说明的,假使你的父类构造器中要调用一个非静态方法,而这个方法不是private的又被子类所重载,这样在实际创建子类的过程中递归调用到了父类的构造器时,父类构造器对这个方法的调用就会由于多态而实际上调用了子类的方法,当这个子类方法需要用到子类中实例变量的时候,就会由于变量没有初始化而出现异常(至于为什么子类中的实例变量没有初始化可以参考上边的实例初始化过程),这是Java不想看到的情况。而当父类构造器中调用的方法是一个private方法时,多态就不会出现,也就不会出现父类构造器调用子类方法的情况,这样可以保证父类始终调用自己的方法,即使这个方法中调用了父类中的实例变量也不会出现变量未初始化的情况(变量初始化总是在当前类构造器主体执行之前进行)。

㈧ JAVA里面子类调用父类的构造器有什么意思

因为如果父类有私有成员变量的话,一般在父类的构造器中初始化,因为子类构造器无法访问·父类的私有成员。也就是说继承来的父类的部分就应该由父类构造方法来构造,子类构造方法就只构造属于子类的那部分。所以即时你没有显式调用父类的无参构造方法,编译器也会帮你加上,如果父类没有无参构造方法,你又没有显式调用有参构造方法,就会报错。

热点内容
解压包手机安装 发布:2025-02-08 00:49:29 浏览:953
詹雯婷访问 发布:2025-02-08 00:42:02 浏览:308
php无限分类树 发布:2025-02-08 00:42:01 浏览:814
clang编译命令 发布:2025-02-08 00:41:24 浏览:127
数据结构c语言版算法 发布:2025-02-08 00:28:19 浏览:663
python环境管理 发布:2025-02-08 00:26:51 浏览:999
个人简历源码 发布:2025-02-08 00:26:43 浏览:14
html5canvas上传图片 发布:2025-02-08 00:20:44 浏览:169
安卓输入法哪个词库好 发布:2025-02-08 00:03:47 浏览:92
c存储过程数据集 发布:2025-02-08 00:03:42 浏览:925