首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

再论构造函数有没有返回值?该如何解决

2012-03-30 
再论构造函数有没有返回值??我告诉他说:构造函数没有返回值。他举了个反例:String str new String(conte

再论构造函数有没有返回值??
我告诉他说:构造函数没有返回值。
他举了个反例:
  String str = new String("content");

new 的时候调用构造函数,返回给str;

再问:有没有方法确定知道构造函数有没有返回??

[解决办法]
语法上没有
[解决办法]
你咋这么固执呢 呵呵
就是没有返回任何类型 但是构造函数确实创建了一个新的对象
[解决办法]
没有,但我不知怎么反驳你这个反例
[解决办法]
String str=new String("content");
这里不是说new的时候调用构造函数,返回给str,而是在堆里new一个String对象,并让str指向这个对象。
构造方法没有返回值。
[解决办法]
看书吧,反正见过的书上都是说构造方法没有返回值。
这是<The Java Programming Language>上的说法:
For purposes other than simple initialization, classes can have constructors. Constructors are blocks of statements that can be used to initialize an object before the reference to the object is returned by new. Constructors have the same name as the class they initialize. Like methods, they take zero or more arguments, but constructors are not methods and thus have no return type. Arguments, if any, are provided between the parentheses that follow the type name when the object is created with new. Constructors are invoked after the instance variables of a newly created object of the class have been assigned their default initial values and after their explicit initializers are executed.
看最后一句话,构造方法是新创建的对象的实例变量缺省初始化以及显式初始化之后才执行的,也就是说在构造方法调用之前这个对象已经存在了,更谈不上你例子中的构造方法返回一个对象引用了。
[解决办法]
为构造函数加上返回值后,也没有错,但是此时该函数已经变成类的成员方法,而不是构造函数
[解决办法]
We create the object sun refers to using new. The new construct is by far the most common way to create objects (we cover the other ways in Chapter 16). When you create an object with new, you specify the type of object you want to create and any arguments for its construction. The runtime system allocates enough space to store the fields of the object and initializes it in ways you will soon see. When initialization is complete, the runtime system returns a reference to the new object.
[解决办法]
构造方法是一种特殊的方法,具有以下特点。
(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
(4)构造方法不能由编程人员调用,而要系统调用。
(5)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构 造器,这个构造器不执行任何代码。
(6)构造方法可以重载,以参数的个数,类型,或排列顺序区分。 

我个人认为规定是没有返回的,但实际是隐式返回的类的对象。

[解决办法]
还是那句话..

既然名字叫 构造函数. 他就是函数..函数有没有返回值 就看有没有return.这个大家没意见吧.

如果他还是坚持它的..让他自己给 构造函数里面 加 return吧.

能加上的话. 我给他100分..加不上给我分.

o(∩_∩)o....
[解决办法]
这就像1+1=2,知道就行了.没有必要去怀疑他,有那时间还不如看看JAVA的源码呢.
[解决办法]
构造函数是没返回值的 ,但是返回引用 你可以在这上找出路
[解决办法]

探讨
可我真想搞清楚。。。期待大侠

[解决办法]
本人的理解是,构造函数,就是java中一个特殊的方法,只需要按照本本上的说明来用就是了,就象你吃感冒清一样,不需要去做化学分析,吃下去就够了,不能以常规的,指定了类型的普通方法来与之相提并论,如果一定要说个子丑寅卯,那就打电话去sun吧
[解决办法]
探讨
构造方法是一种特殊的方法,具有以下特点。


(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
(4)构造方法不能由编程人员调用,而要系统调用。
(5)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认…


[解决办法]
String是一个特殊的例子,他即有值类型的特点又有引用类型的特点!
String str="abc",这就像一个值类型,String str=new String("abc")就像引用类型!
[解决办法]
语法上来说是没有。
但实际使用过程中我认为是有返回值的。
这里面应该是有一些jvm级别的东西
[解决办法]
其实,我个人觉得可以这样理解

public String String(){
}

构造方法返回了自己。 而且这个是必须返回自己。否则就会出现

public Long String(){
}

这种莫名其妙的构造方法。

所以为了避免这种情况,规范里规定了,构造方法没有返回值,连void都不允许。


个人观点;
[解决办法]
我来解释一下

类的实例化其实就是分配一块内存空间,包括所有变量和方法,
并且把整个这个内存空间的地址(引用)返回给str,
而并不仅仅是返回构造函数构造的一些变量的值。

希望你能理解
[解决办法]
B *a = new B;
===>
B *a = (B *)malloc(sizeof(B));
a->B();
................................


[解决办法]
其实返回了一个地址,只是对java不可见吧。
[解决办法]
探讨
引用:
语法上来说是没有。
但实际使用过程中我认为是有返回值的。
这里面应该是有一些jvm级别的东西

[解决办法]
探讨
我来解释一下

类的实例化其实就是分配一块内存空间,包括所有变量和方法,
并且把整个这个内存空间的地址(引用)返回给str,
而并不仅仅是返回构造函数构造的一些变量的值。

希望你能理解

[解决办法]
构造方法确实没有返回值。。。。

你说的那个是
对象下面的 TOSTRING方法。。。
如果一个对象赋值给STRING变量是,默认调用该对象的TOSTRING方法。
TOSTRING方法是OBJECT一个公共方法。。。其他对象都继承了这个方法。。。。。
[解决办法]
补充。。。
尼可以试试,定义一个类。。。然后实例化一个类的对象,让一个字符串=对象的TOSTRING方法。。。
这个结果和你的例子结果一样。
[解决办法]
大哥,你眼花了吧??

你这个反例一点也不成为反例啊,你这个例子恰恰证明了构造函数是没有返回值的呀!!!....如果要说反例,也应该是这个样子的呀...:

String str = String("content"); 

现在的句子是这样的,String str = new String("content"); 你哪里可以看出来这个构造函数有返回值啦?如果有返回值,根本没有变量来接收呀!!!

你不要把人家new当不存在好不好,这个句子应该从new的语法来考虑,String("content")的确调用了构造函数,并且正因为没有返回值,所以没有直接跟str.

下次看清楚点....这种问题......还这么多人讨论.......
[解决办法]
探讨
class A
{
public static void main(String []args)
{
A xx = new A();
}
}
A的构造函数返回自身对象。。。。。

[解决办法]
。。。。很明显啊。。。new 方法是在内存中创建一个类实体。。。。

前面的 = 是把等号前面的东西指向创建的类实体。。。。。 

换句话说,可以理解为,new方法默认返回一个当前类的实体。

new方法返回的类型是固定的,所以你不能在new方法里面再写其它的return,最多就能catch错误而已
[解决办法]
晕倒了我,构造函数不是返回,
就像孙悟空身上的毛,孙悟空一吹就又变出个孙悟空去打架,
那个毛就是构造函数,构造函数只是为类在内存中在复制出一个类来去执行一些程序操作
这不是返回!
[解决办法]
构造函数没有返回值,String是一个特殊的类和其他的类不同,所以String s = new String("sfg");和方法的返回值不是一回事。
------解决方案--------------------


JAVA没研究过
C++按道理说是有返回的,返回值是this指针,只不过没写出来。
一个简单的默认构造函数
class A
{
A::A() {}
...

OD调试的如下
00401000 /$ 55 push ebp
00401001 |. 8BEC mov ebp, esp
00401003 |. 51 push ecx //thiscall调用约定,先前call之前传递给ecx的类的this指针
00401004 |. 894D FC mov dword ptr [ebp-4], ecx
00401007 |. 8B45 FC mov eax, dword ptr [ebp-4] //返回值放入eax,可见是this指针
0040100A |. 8BE5 mov esp, ebp
0040100C |? 5D pop ebp
0040100D |? C3 retn



[解决办法]
new 运算符返回的对象引用或者指针 
new负责在堆上分配对象所需的内存空间
构造函数负责在此位置构造对象


[解决办法]

探讨
Constructors are invoked after the instance variables of a newly created object of the class have been assigned their default initial values and after their explicit initializers are executed.
6楼说的这么清楚了,楼主还不明白,我看学习不该是这么学的。原理才是王道


[解决办法]
其实是有返回类型的
其实是静态函数
首先证明是一个静态的公开函数.没有实际的对象实例就可以调用的类成员函数,一定是static函数,在被类加载器载入后就可以调用了。但构造函数可以在没创建实例就可以调用,所以一定是static函数。
静态函数为什么不用static声明呢?这与构造函数没有声明返回类型是一样的答案。反正是人为确定的规则,特殊的函数特殊的规则,没什么特别的。
[解决办法]
构造函数是JVM规定的,它是一个自动隐含在程序的东东,其实编译器隐含的东西很多的,那为什么就能知道有个构造函数?因为构造函数还提供了显示调用,意思是用户还可以根据自己的需要来主动调用构造函数,但如果因为你不需要而忘记写了构造函数,系统就隐含自动插入,这个程序员是没有感觉的。也就是说如果你的程序都没有必要用用到构造函数,那你完全可当这东西不存在。
[解决办法]
我有一个认为可帮楼主理解构造函数的方法:
就是从理解基本数据类型开始。首先必须明白类也是数据类型,不过是一种可综合各种基本数据类型于一身的复合型数据类型,但总之它也不过是数据类型,就好比头脑简单和头脑复杂的人都是人一样。其次既然是数据类型,那它就跟基本数据类型是一样的,那从编译其的角度来看,你程序员既然要我为你开辟一块内存空间,你总得有个跟我沟通的方法吧,那就是通常我们所说的定义变量,如:int A;但这时编译器虽然知道了你的意图,也可以为你开辟一块空间,但A里到底要存什么数呢,你没告诉它对吧,但这也没关系,通常你没告诉它之前编译器会做一些缺省处理,比如暂时放入0,或者不管它,原来是什么就是什么,这就是所谓编译器的自动初始化,但如果你想主动给A放入什么那当然是可以的,比如你可以这样定义:int A=5;或者你在别的地方需要用到时你再给它赋值也一样。说到此就可以用这个基本数据类型的定义过程跟类的构造函数过程相比较了:在你只定义int A,而没有给它赋值时,就当你忘记写了构造函数,这时编译器会自动给你做,而当你主动这么写时:int A=5,就相当于你主动写了构造函数,给了它赋了初始值。
[解决办法]
楼主,你可以反正,用数学归纳法或者别的。
看看离散数学就晓得了。
[解决办法]
[b][color=#000000]我不知道JAVA,也不会用java,但是我可以明确的告诉你在c++中的用法,
同时也证明了我们c++版的基础比你们好:
C/C++ code
String str = new String("content");
[解决办法]
构造函数只是把对象的地址给了一个变量了,他返回的不是值,而是地址的引用
不知我这样理解是否能接受?
[解决办法]
这个问题有什么好讨论,说来说去都是基本概念。
首先连起码的写法都不一样,真是不动脑子
如果有人问我这个问题,我会直接要求他回去好好看看书再来讨论这个问题。
基本概念都没有搞清楚就出来讨论讨论,现在的小孩子怎么这么不学无术呢!
[解决办法]
C++构造器在C++语言级没有返回值(其实是不能通过编译)。在汇编语言级有个返回值对象的地址,保存在堆栈内部,用于检测创建对象是否成功的标志,防止无效操作(如delete对象 ),不过不能被C++程序员所使用。
[解决办法]
String str = new String("123");
这并不算返回值,你可以这样想:什么是返回值? 返回值,可以自己任意定义返回的类型,可以自己任意定义返回的大小甚至是null. 但是new就不可以。

new 会创建一个对象,并且返回对象的地址,也可以认为是引用。这不是返回值,而是new关键字本来的功能

热点排行