类的普通方法里面为什么不能调用类的构造方法?(给你权威点的说法)

hawaii_wx 2005-09-30 12:14:43
如题,希望大家都来讨论下。
我先发表我自己的看法,我认为这应该和构造方法的声明周期有关,因为,在你调用类的普通方法时,可以说该对象以及存在了吧(静态方法除外),既然对象已经存在肯定已经调用过了构造方法,
所以你再次调用构造方法,当然不行的,不过把这个普通方法想成是静态方法,虽然也不能调用构造方法,但是用我上面的角度考虑这个问题,就不行了!

欢迎大家继续发表自己的看法!
...全文
953 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
holy_phoenix 2005-10-03
  • 打赏
  • 举报
回复
constructor 不是 method,它只能由 new 关键字调用(invoke),而不能在 method 中被调用。
rumlee 2005-10-03
  • 打赏
  • 举报
回复
楼主说的是这个意思,我来帮他补充一下

public class test{
test(){
}

test(int i){
test(); //在构造里调用其它构造,可以
}

void method1(){
test(); //在其它函数里调用构造,不可以,也没有意义
}
}
holy_phoenix 2005-10-03
  • 打赏
  • 举报
回复
调用构造器只有两条途径,一条是使用 new 关键字;另外一条是使用 this()。
this() 只能在构造器中使用,用来调用其它构造器,且只能作为构造器代码体的第一条语句。
fankobe 2005-10-02
  • 打赏
  • 举报
回复
对于this关键字的理解是:当前对象的引用。逻辑上,显然如果你想要用this关键字,你就需要创建这样一个类的对象。如果你没有创建对象就调用this是不可能的,因为this指的是当前对象的引用。如果你有一个静态方法,你在里面用this调用构造器就不行了,因为this不知道指向哪个对象,因为根本就不存在这个对象。
fankobe 2005-10-02
  • 打赏
  • 举报
回复
其实是可以的,你看看这个程序;


class Example{
Example(){
System.out.println("Example");
}

void f(){
new Example();
}

public static void main(String[] args){
Example e=new Example();
e.f();
}
}

TIJ 里面说的不可以调用 ,是因为它调用时使用的时this关键字,书中说的是,当你用this调用构造器时,你只能在构造器里面这样调用,而不能在方法里面用this关键字调用构造器。你在看看TIJ里面this这些内容,看看是不是这样,这是我的理解。
fankobe 2005-10-02
  • 打赏
  • 举报
回复
应该具体给个你发现此问题的程序来看看。
你的文字表达不是很清楚
林中漫步1982 2005-10-02
  • 打赏
  • 举报
回复
我一路看下来, 还是不知楼主所云。

谁说“类的普通方法里面不能调用类的构造方法”? 自己写个程序测一下嘛, 弄得大家为你瞎忙。
rumlee 2005-10-01
  • 打赏
  • 举报
回复
只有在构造方法中调用其它的构造方法才有意义。其实你说是构造器,我很赞同,但我说构造方法也没有错啊。如果在其它方法中调用就失去了意义了。
taoyuming(松松) 并没有明白楼主的意思,你所说的只是创建了一个对象,而不是调用构造方法。你创建对象的同时虽然调用了构造方法,但那是另一个对象的构造方法。
tanghuan 2005-10-01
  • 打赏
  • 举报
回复
构造方法不但不能被你直接调用,而且他不能定义返回类型,连void都不定义,

说通过new来调用构造方法,既对也不对,因为他其实是有分工的,程序中new一个对象,这个调用时期不是他来完成的,是他的外部进程完成的,通过new告诉他要帮他分配一个对象,于是这个外部进程先根据提供的参数决定使用哪个构造方法,分配一个内存空间,不管这个空间是在栈还是堆中,并立即调用这个类的构造方法,进行一些处理,并有这个外部进程返回这个构造好的对象给你的应用进程。在这个过程中构造方法没有必要返回一个类型,因为外部进程知道他正在构造的对象是什么样的对象。
特别说明的是,在构造方法执行有意义的语句前,所有这些必须是内存空间,正因为这样,所以,如果你要引用父类的构造方法或本类的其他构造方法,必须要把这个super()或this()放在第一句上。

public class TestConstructor {
public TestConstructor() {
this("args is null");
this.print(this+"--------------------------------------");
this.print(this+"---this constructor args count :0");
}
public TestConstructor(String constuctorInfo){
this.print(this+"--------------------------------------");
this.print(this+"--this constructor args count :1");
}
public void print(String info){
System.out.println(info);
}
public static void main(String[] args){
new TestConstructor();
new TestConstructor("test ---------------1");
new Test1();
}
}

class Test1 extends TestConstructor{
public Test1(){
super("Test1................");
this.print("Test1------------------------");
}
}
sghys 2005-10-01
  • 打赏
  • 举报
回复
非静态方法可以调用静态方法或属性变量,反之不行
eureka0891 2005-09-30
  • 打赏
  • 举报
回复
不知楼主所云?
不能这样写:
public class EntWebTest {

public void prop(){
EntWebTest test= new EntWebTest();
System.out.println("--------");
}

public static void main(String[] args) {
new EntWebTest().prop();}
}
这样写没问题啊

还是楼主的意思是下面的这种不能写?
public static void main(String[] args) {
EntWebTest();}
EntWebTest()不能直接写是因为构造函数必须用new来调用
wlmmlw 2005-09-30
  • 打赏
  • 举报
回复
听课

---初学者
hawaii_wx 2005-09-30
  • 打赏
  • 举报
回复
to: rumlee(rum-lee) ( ) 信誉:100
你的回答有道理,但是没有从根本上解决我提出来的问题,呵呵,希望继续发表自己的观点

to: taoyuming(松松) ( ) 信誉:100
我很赞同你说的:
“其实我觉得不应该把构造函数看作方法,也不应该说是“调用”构造方法.
构造方法只是在生成对象时所要做的基本工作(可以说是初始化),它不应该是方法,更恰当的说它是“构造器”.”
但是从你给的例子上没有显示的调用构造方法。

说明下:关于这个问题,我是看的thinking in java第三版中this这个知识点上,提到的一句话,但是书中没有说为什么不可以,所以我也是一时好奇,才发贴问的!
ZFL_progress 2005-09-30
  • 打赏
  • 举报
回复
这是java、c++、c#语言的规定,发明这些语言的人都认为这样比较好,所以就用了这种语法
就像c语言中没有类,vb中声明变量用dim一样
大家可不能死记硬背,不要被发明者所统治!
加油吧,同志们,为振兴中国的软件事业而奋斗!!!
taoyuming 2005-09-30
  • 打赏
  • 举报
回复
public class Test
{
Test()
{
System.out.println("class Test");
}
Test t1 = new Test();
public static void main(String[] args)
{
System.out.println("Starting...");
TestMethod();
}

public static void TestMethod()
{
Test t = new Test();
}
}
结果:Starting...
Exception in thread “main” java.lang.StackOverflowError
taoyuming 2005-09-30
  • 打赏
  • 举报
回复
public class Test
{
Test()
{
System.out.println("class Test");
}

public static void main(String[] args)
{
System.out.println("Start...");
}

public void TestMethod()
{
Test t = new Test();
}

}

这个就是在普通方法里调用构造函数,但是这样有意义吗?
//
//
//
//
class Aaa
{
Aaa()
{
System.out.println("this class is Aaa");
}
public static void main(String[] args)
{
System.out.println("AAAAA");
}
}



public class Bbb
{
Bbb()
{
System.out.println("this class is Bbb");
}


public static void main(String[] args)
{
Bbb bbb = new Bbb();
bbb.Bmethod();
}

public void Bmethod()
{
System.out.println("this method is B");
Aaa aaa = new Aaa();
}
}

这个是在普通方法里调用其他类的构造函数.
//
//
//
其实我觉得不应该把构造函数看作方法,也不应该说是“调用”构造方法.
构造方法只是在生成对象时所要做的基本工作(可以说是初始化),它不应该是方法,更恰当的说它是“构造器”.

rumlee 2005-09-30
  • 打赏
  • 举报
回复
楼主说的很对,为什么不能在静态函数里调用构造函数,我来回答你,那是因为在静态函数里不仅不可以调用构造函数,连其他的非静态函数都不可以调用,因为静态函数里没有this指针,所以如果在静态函数里调用非静态对象或者函数,将调用的是哪一个对象的呢????
hawaii_wx 2005-09-30
  • 打赏
  • 举报
回复
to: eureka0891(迷茫中...) ( ) 信誉:97
你没有看懂俺说滴意思。

to:flyingghost(游魂) ( ) 信誉:97
虽然你说俺的逻辑思维有问题,俺也小吐了下血,但是你看懂了俺说的问题,请大家看清楚我的问题,我问的是为什么不能在普通方法里面调用构造方法,我也只是提出了我的观点,虽然有可能是错的。
cai_yb 2005-09-30
  • 打赏
  • 举报
回复
不太明白楼主的意思
咖啡 2005-09-30
  • 打赏
  • 举报
回复
学习
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧