精华内容
下载资源
问答
  • 构造函数总结概念: 创建对象时由JVM自动调用的函数作用: 在创建对象的时候给对象的成员变量赋值;写法:修饰符:可以用访问权限修饰符(public、private等)修饰;不能用static修饰;返回值类型:没有返回值类型,连...

    构造函数总结

    概念:    创建对象时由JVM自动调用的函数

    作用:    在创建对象的时候给对象的成员变量赋值;

    写法:

    修饰符:可以用访问权限修饰符(public、private等)修饰;不能用static修饰;

    返回值类型:没有返回值类型,连void都没有;

    函数名:必须和类名完全一样;

    参数列表:可以重载,具体根据要求而定;

    return语句:有,但是一般都不需要写;

    执行过程:

    创建对象时,JVM遇到new关键字,首先要到堆内存中开辟对象空间;然后在对象空间中为成员变量分配空间,赋默认值;

    然后再根据new关键字后面的内容,调用相应的构造函数进栈执行;等到构造函数执行结束,对象创建完成;

    默认构造函数:

    所有类中都至少有一个构造函数,如果一个类中没有书写构造函数,编译器就会帮我们添加一个无参的构造函数,这个构造函数就是默认构造函数;

    一旦类中书写了构造函数,就不会再有默认构造函数;

    使用细节:

    构造函数可以调用一般函数;

    一般函数不能调用构造函数;

    构造函数可以调用构造函数,不能通过函数名调用,必须通过this关键字调用;

    在构造函数中使用this语句调用其他构造函数,this语句必须写在构造函数的第一行;

    构造函数之间相互调用,不能出现交叉调用(递归调用);

    1、什么时候需要使用构造函数?

    只要创建对象,都要使用构造函数;

    2、什么时候需要自定义构造函数?

    如果希望在创建对象时就给成员变量赋值,就需要自定义构造函数;

    3、使用构造函数,可以在创建对象的时候就给对象的成员变量赋初始值,那么,有了构造函数,还需要提供get和set方法吗?

    需要;因为构造函数只能在创建对象的时候赋值一次;如果以后想要改变这个值,就需要用到set函数;如果需要获取被封装的值,就需要用到get函数;

    构造函数和一般函数的区别

    1、从书写格式上看:

    a)         构造函数:没有返回值类型,连void都不能写;构造函数的函数名必须和类名一样;不能用static关键字修饰;

    b)        一般函数:必须有一个返回值类型(是和构造函数最主要的区别);一般函数名不要和类名一样;可以用static修饰,也可以不要;

    如果一个函数函数名和类名一样,是否是构造函数,就要看有没有返回值类型;没有,就是构造函数;

    2、从调用方式上看:

    a)         构造函数:创建对象时由JVM调用的;一般函数不能调用构造函数;

    b)        一般函数:哪里需要哪里就可以调用;构造函数里面也可以调用一般函数;

    3、从作用上看:

    a)         构造函数:主要用来在创建对象的时候,给对象的成员变量赋值用的;

    b)        一般函数:实现某个具体功能;

    4、从一个对象可以调用次数上看:

    a)         构造函数:只有创建对象时会调用一次;

    b)        一般函数:没有次数限制;

    展开全文
  • Java 构造函数没有返回值,连void也不行,但下面代码没提示错误,怎么回事?把Test2()当成一般函数了? 一般函数能与类同名吗? public class Test2{ public void Test2(){ System.out.print(...
  • [Java教程]构造函数返回值 学习心得0 2016-01-05 15:00:11目的:本文记录了我对于构造函数不同类型返回值对实例的影响的学习心得。前言:我们知道构造函数用new操作符创建实例一般是函数体内是不需要返回值的。但是...

    [Java教程]构造函数返回值 学习心得

    0 2016-01-05 15:00:11

    目的:本文记录了我对于 构造函数不同类型返回值对实例的影响 的学习心得。

    前言:我们知道构造函数用new操作符创建实例一般是函数体内是不需要返回值的。但是构造函数的本质首先还是个函数,作为函数就能有返回值,而且在某些情况下(比如使用parasitic构造函数的设计模式)会用到构造函数的返回值。本文写作目的在于记录不同类型(基本类型、引用类型)返回值对实例的影响。

    正文:

    part1:基本类型1 function Person (name) {2 this.name=name;3 return 123;4 }5 var a=new Person("Su");6 console.dir(a); //Person

    结果:基本类型的返回值被忽略。

    part2:引用类型1 function Person (name) {2 var arr=[];3 this.name=name;4 return arr;5 }6 var a=new Person("Su");7 console.dir(a) //Array[0]

    结果:a没有成为Person的实例而是如返回值一样成为了数组。

    分析:

    为了了解这种差异的原因,我首先去研究了new 这个过程,在用new操作符创造实例时,会经历如下4个阶段:

    1.创建一个新对象,此时该对象为空对象。

    2.将构造函数的作用域赋给这个空对象(因此构造函数中的this就指向了该空对象)

    3.执行构造函数内的代码(由于this指向了该空对象,此步骤为新对象添加属性)

    4.返回新对象(这里针对构造函数没有返回值或返回值为基本类型时。如果构造函数内有引用类型的返回值,那么该返回值会替代第一步创建的对象作为构造函数的返回值。)function Person (name) { var arr=[]; this.name=name; return arr; } var a=new Person("Su");console.dir(a.constructor); //function Array()

    还是这段代码,a作为Person的实例被创造,结果他的构造函数却不是Person而是Array,可见返回值被覆盖了。

    结论:

    构造函数的返回值会影响实例。

    1.不设置返回值或返回值为基本类型时返回值为构造函数在构造实例过程中创建的对象。

    2.设置返回值为引用类型时返回值会覆盖构造函数在构造实例过程中创建的对象,此时实例其实已经与构造函数没有关系了,而是作为该引用类型的实例。

    本文网址:http://www.shaoqun.com/a/175408.html

    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

    函数

    0

    展开全文
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个...

    众所周知,在java里是不能给构造函数写返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。

    可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象的时候是怎么赋值的呢?

    构造函数有返回值吗

    写一段代码测试一下:public class Test {

    public Test() {

    }

    public static void main(String[] args) {

    Test t = new Test();

    }

    }

    反编译一下看看:Code:

    0: new           #5 // class com/irving/utils/baidu/Test

    3: dup

    4: invokespecial #6 // Method "":()V

    7: astore_1

    8: return

    从反编译的结果看 4: invokespecial #7 // Method "init": ()V,调用构造函数,V代表void无返回值,那么init代表什么含义?

    我在书里找到这样一段话:在 Java 虚拟机层面上,Java 语言中的构造函数是以一个名为init的特殊实例初始化方法的形式出现的,init这个方法名称是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令来调用, 只有在实例正在构造的时候,实例初始化方法才可以被调用访问。

    一个类或者接口最多可以包含不超过一个类或接口的初始化方法,类或者接口就是通过这个方法完成初始化的。这个方法是一个不包含参数的静态方法,名为clinit。这个名字也是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。类或接口的初始化方法由 Java 虚拟机自身隐式调用,没有任何虚拟机字节码指令可以调用这个方法,只有在类的初始化阶段中会被虚拟机自身调用。

    init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型是void,那么它究竟是怎么赋值的呢?

    赋值探究

    我们明白一点,方法的调用过程就是栈帧入栈和出栈的过程,栈帧随着方法的调用创建,方法结束销毁。栈帧的内部包含局部变量表、操作数栈、动态链接等。

    局部变量表表示方法调用时候的参数传递,当一个实例方法被调用的时候,第0个局部变量存储了当前实例方法所在对象的引用(this),后续的其他参数传递至1到N的连续位置。

    操作数栈用来准备方法调用的参数和返回结果。

    82294704930c54c739eb73d73e758113.png

    以上面测试代码的方法来看Test t = new Test() 的调用过程:new 创建Test对象,并将其引用值压入操作数栈顶

    dup 复制栈顶数值并将复制值压入栈顶

    invokespecial 使用dup复制的引用并用来初始化,此时栈顶应该只有new创建的原始引用

    astore_1 将new创建的引用存入局部变量表索引为1的位置

    return 方法正常返回

    e453c50b9ff9f488aba9d019adf2969c.png

    从这个过程我们已经看出来了,整个过程最后我们最终拿到了new之后创建的对象引用,并且保存到局部变量表中,可以供我们继续使用。关注公众号:java宝典

    52f2d48be04ead4894aaf9e8e73d89d1.png

    展开全文
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。 可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一...

    众所周知,在java里是不能给构造函数写返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。 可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象的时候是怎么赋值的呢?

    构造函数有返回值吗

    写一段代码测试一下:

    public class Test {
        public Test() {
           
        }
    
        public static void main(String[] args) {
            Test t = new Test();
        }
    }

    反编译一下看看:

     Code:
           0: new           #5 // class com/irving/utils/baidu/Test
           3: dup
           4: invokespecial #6 // Method "<init>":()V
           7: astore_1
           8: return

    从反编译的结果看 4: invokespecial #7 // Method "init": ()V,调用构造函数,V代表void无返回值,那么init代表什么含义?

    我在书里找到这样一段话:

    在 Java 虚拟机层面上,Java 语言中的构造函数是以一个名为init的特殊实例初始化方法的形式出现的,init这个方法名称是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令来调用, 只有在实例正在构造的时候,实例初始化方法才可以被调用访问。

    一个类或者接口最多可以包含不超过一个类或接口的初始化方法,类或者接口就是通过这个方法完成初始化的。这个方法是一个不包含参数的静态方法,名为clinit。这个名字也是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。类或接口的初始化方法由 Java 虚拟机自身隐式调用,没有任何虚拟机字节码指令可以调用这个方法,只有在类的初始化阶段中会被虚拟机自身调用。

    init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型是void,那么它究竟是怎么赋值的呢?

    赋值探究

    我们明白一点,方法的调用过程就是栈帧入栈和出栈的过程,栈帧随着方法的调用创建,方法结束销毁。栈帧的内部包含局部变量表、操作数栈、动态链接等。

    局部变量表表示方法调用时候的参数传递,当一个实例方法被调用的时候,第0个局部变量存储了当前实例方法所在对象的引用(this),后续的其他参数传递至1到N的连续位置。

    操作数栈用来准备方法调用的参数和返回结果。

    1568ff3d1b1fa31116d3237946d83910.png

    以上面测试代码的方法来看Test t = new Test() 的调用过程:

    1. new 创建Test对象,并将其引用值压入操作数栈顶
    2. dup 复制栈顶数值并将复制值压入栈顶
    3. invokespecial 使用dup复制的引用并用来初始化,此时栈顶应该只有new创建的原始引用
    4. astore_1 将new创建的引用存入局部变量表索引为1的位置
    5. return 方法正常返回

    undefined_b.jpg

    从这个过程我们已经看出来了,整个过程最后我们最终拿到了new之后创建的对象引用,并且保存到局部变量表中,可以供我们继续使用。

    关注公众号:java宝典

    4f6ff87ba923ac09eba93e45a02e6001.png
    展开全文
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个...
  • 首先,先说结论,按照最简单的方式理解就行了:构造方法没有 return 任何东西,所以没有返回值。// 构造方法的声明,就像是一个没有返回值的方法声明。a constructor declaration looks just like a method ...
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个...
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。 可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一...
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个...
  • 前言众所周知,在Java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new...
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t...
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。 可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一...
  • 众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个...
  • 自定义构造函数(Custom Constructor Functions) 除了对象字面量模式和内置的构造函数,你可以用你自己的构造函数创建对象; var adam = new Person("Adam"); adam.say(); // "I am Adam"这种新模式和Java里用Person...
  • 曾经遇到一个面试题——构造函数有没有返回值?今天调查一番后,给出确切的答案:构造函数没有返回值。我们使用构造函数构造一个String字符串str:String str = new String("abc");这里的new 是调用构造函数,在堆里...
  • 个人原创100W+访问量博客:点击前往,查看更多转自:艾小仙众所周知,在java里是不能给构造函数返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。...
  • Java构造函数到底有没有返回值

    万次阅读 2016-03-11 09:37:27
    Java构造函数到底有没有返回值
  • 构造函数处提示 This method has a constructor name 这个方法(函数)具有(用了)构造函数名称 调用构造函数时提示 The constructor StuGroup(int...不容易看出来的是,构造函数不能有返回值,即便是空也不行 .
  • JAVA构造函数(方法)

    万次阅读 多人点赞 2019-06-03 21:56:24
    java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与相同,无返回值。 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 在现实生活中,很多事物一出现,就...
  • java构造函数有没有返回值的总结

    千次阅读 2014-08-04 16:29:17
    这个问题已经有人讨论过,最近在...从语法上讲,构造函数不允许有返回值,就算是 void 也不行。 这里的new 是调用构造函数,在堆里分配了一个String对象,并让str指向这个对象。实际上是那个 new 在起作用,而不是()在
  • CSDN论坛上很多人在讨论Java构造函数是否有返回值这个问题,这里我说说我对构造函数的理解 String str = new String("123"); 这句话中有一个new指令,String类中有构造函数。 首先要确定类对象是由谁创建的,...
  • Java构造函数

    千次阅读 多人点赞 2018-11-22 13:06:46
    Java构造函数创建java构造函数的规则Java构造函数的类型没参数的构造函数 (默认函数的构造类型)Java参数化构造函数Java 构造函数重载java的构造函数和方法之间的区别Q)构造函数没有返回值 ?Q)可以构造函数执行...
  • 构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过...
  • 构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有);⑵没有返回值;⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数;如果我们手动的创建了其他构造函数,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,743
精华内容 697
关键字:

java构造函数返回值

java 订阅