构造器的返回值?构造器有什么作用?

1、构造器为什么不能用void修饰?

简单地说,这是java的语法规定。构造器不能定义返回值类型声明,也不能使用void定义构造器没有返回值。如果为构造器定义了返回值类型,或使用void定义构造器没有返回值,编译时不会报错,但java会把这个所谓的构造器当成方法来处理。

复制代码
// JDK 8
public class Constructor {

    public static void main(String[] args) {
        Constructor c = new Constructor();
        System.out.println(c.Constructor());
    }

    public Constructor() {
        System.out.println("this is constructor!");
    }
    // This method has a constructor name
    public int Constructor() {
        System.out.println("this is method!");
        return 520;
    }
    // This method has a constructor name
    public void Constructor() {
         System.out.println("this is method!");
         return ;
    }
}
复制代码

输出:

this is constructor!
this is method!
520

2、构造器有返回值吗?

实际上,类的构造器有返回值,返回的是该类的实例,因此类的构造器返回值类型是当前类,因此无需定义返回值类型。但注意:不能在构造器里显示使用return来返回当前类的对象,因为构造器的返回值是隐式的。只写return;不会报错。

复制代码
// JDK 8
public class Constructor {

    public static void main(String[] args) {
        Constructor c = new Constructor();
    }

    public Constructor() {
        System.out.println("this is constructor!");
        return this; // Void methods cannot return a value
     // return;  // 不会报错
    }
}
复制代码

3、构造器是创建java对象的途径,是不是说构造器完全负责创建java对象?

答:不是!构造器是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的。实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了——这些操作都在构造器执行之前就完成了。也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能被外部程序访问,只能在该构造器中通过this来引用它。当构造器的执行体结束后,这对象作为构造器的返回值返回,通常还会赋给另一个引用类型的变量,从而让外部程序可以访问该对象。

自己总结:之所以会存在系统提供的空构造器,是因为在执行构造器之前对象已经存在,但是不能直接返给程序,需要借助中间体拿到这个对象的地址,而这个中间体刚好就是构造器,所以空构造器只是完成最重要的事,就是拿到这个对象的地址。而非空构造器刚好可以给该对象初始化。

4、static、final、synchronized、native可否修饰构造器?

static不能修饰构造器:static方法只能访问static变量,类中全部变量设为static?

final不能修饰构造器:final方法可以继承但不能重写,构造器不能被继承。

synchronized不能修饰构造器:没有实际的需要把构造器定义成同步的,因为它将会在构造的时候锁住该对象,直到所有的构造器完成它们的工作,这个构造的过程对其它线程来说,通常是不可访问的。

native不能修饰构造器:没有本地的构造器是任意一种语言的设计选择,这样会使得在创建对象的过程中JVM实现很容易去校验父类的构造器是否总是被正确地调用了。
(本地化的方法情况特别复杂,所以JVM调用起来非常麻烦,需要考虑很多种情况,没有native关键字的情况下,JVM实现起来比较容易。)

posted @   dedication  阅读(1430)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示