首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java构造函数没有返回值,怎么赋值

众所周知,在java不能给构造函数写返回值,如果在低版本编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通方法。...可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象时候怎么赋值呢?...我在书里找到这样一段话: 在 Java 虚拟机层面上,Java 语言中构造函数是以一个名为init特殊实例初始化方法形式出现,init这个方法名称是由编译器命名,因为它并非一个合法 Java...实例初始化方法只能在实例初始化期间,通过 Java 虚拟机 invokespecial 指令来调用, 只有在实例正在构造时候,实例初始化方法才可以调用访问。...init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型void,那么它究竟是怎么赋值呢?

2K00

构造函数没有返回值怎么赋值

众所周知,在java不能给构造函数写返回值,如果在低版本编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通方法。...可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象时候怎么赋值呢?...我在书里找到这样一段话: 在 Java 虚拟机层面上,Java 语言中构造函数是以一个名为init特殊实例初始化方法形式出现,init这个方法名称是由编译器命名,因为它并非一个合法 Java...实例初始化方法只能在实例初始化期间,通过 Java 虚拟机 invokespecial 指令来调用, 只有在实例正在构造时候,实例初始化方法才可以调用访问。...init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型void,那么它究竟是怎么赋值呢?

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

构造函数没有返回值怎么赋值

个人原创100W+访问量博客:点击前往,查看更多 转自:艾小仙 众所周知,在java不能给构造函数写返回值,如果在低版本编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通方法。...可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象时候怎么赋值呢?...我在书里找到这样一段话: 在 Java 虚拟机层面上,Java 语言中构造函数是以一个名为init特殊实例初始化方法形式出现,init这个方法名称是由编译器命名,因为它并非一个合法 Java...实例初始化方法只能在实例初始化期间,通过 Java 虚拟机 invokespecial 指令来调用, 只有在实例正在构造时候,实例初始化方法才可以调用访问。...init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型void,那么它究竟是怎么赋值呢?

1.6K20

计算机程序思维逻辑 (13) - 类

p.x = 2; p.y = 3; 对象变量赋值,语法形式:对象变量名.成员名。...没有返回值,也不能有返回值。这个规定大概是因为返回值没用吧。 与普通方法一样,构造方法也可以重载。第二个构造方法比较容易理解,使用this对实例变量赋值。...为什么Java有时候帮助自动生成,有时候不生成呢?...你在没有定义任何构造方法时候,Java认为你不需要,所以就生成一个空new过程调用,你定义了构造方法时候,Java认为你知道自己在干什么,认为你有意不想要不带参数构造方法,所以不会帮你生成...堆中内存垃圾回收机制管理,当没有活跃变量指向对象时候,对应堆空间就可能释放,具体释放时间Java虚拟机自己决定。活跃变量,具体说,就是已加载变量,和栈中所有的变量

563100

聊聊并发编程:final关键字

扩展思考,为什么String类为什么final?先看下源码 final修饰String,代表了String不可继承性,final修饰char[]代表了存储数据不可更改性。...在构造函数内对一个final域写入,与随后把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序。...我们先假设线程B读对象引用与读对象成员域之间没有重排序,那以下一种可能执行时序: 这里可以看出, 写普通域操作编译器重排序到了构造函数之外,读线程B错误地读取了普通变量i初始化之前值。...对于引用类型,写final域重排序规则对编译器和处理器增加了如下约束:在构造函数内对一个final引用对象成员域写入,与随后在构造函数外把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序...那下面就可能一种时序: 1对final域写入,2对这个final域引用对象成员域写入,3构造对象引用赋值某个引用变量

14730

一文了解 final 关键字特性、使用方法以及实现原理

final变量一旦初始化后不能再次赋值。 本地变量必须在声明时赋值。因为没有初始化过程 在匿名类中所有变量都必须final变量。...对于 final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个 final 域写入,与随后把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序。...这行代码包含两个步骤: 构造一个 FinalExample 类型对象; 把这个对象引用赋值引用变量 obj。...对于引用类型,写 final 域重排序规则对编译器和处理器增加了如下约束: 在构造函数内对一个 final 引用对象成员域写入,与随后在构造函数外把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序...下面一种可能线程执行时序: ? 在上图中,1 对 final 域写入,2 对这个 final 域引用对象成员域写入,3 构造对象引用赋值某个引用变量

1.3K20

​JMM中final关键字解析

对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域写入,与随后把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序。...这行代码包含两个步骤: 构造一个FinalExample类型对象; 把这个对象引用赋值引用变量obj。...对于引用类型,写final域重排序规则对编译器和处理器增加了如下约束: 在构造函数内对一个final引用对象成员域写入,与随后在构造函数外把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序...下面一种可能线程执行时序: ? 在上图中,1对final域写入,2对这个final域引用对象成员域写入,3构造对象引用赋值某个引用变量。...通过为final域增加写和读重排序规则,可以为java程序员提供初始化安全保证:只要对象是正确构造构造对象引用在构造函数没有“逸出”),那么不需要使用同步(指lock和volatile使用)

60720

夯实Java基础系列4:一文了解final关键字特性、使用方法,以及实现原理

final变量一旦初始化后不能再次赋值。 本地变量必须在声明时赋值。 因为没有初始化过程 在匿名类中所有变量都必须final变量。...对于 final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个 final 域写入,与随后把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序。...这行代码包含两个步骤: 构造一个 FinalExample 类型对象; 把这个对象引用赋值引用变量 obj。...对于引用类型,写 final 域重排序规则对编译器和处理器增加了如下约束: 在构造函数内对一个 final 引用对象成员域写入,与随后在构造函数外把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序...,3 构造对象引用赋值某个引用变量

37100

php面向对象第二篇

我们接着来: 构造函数什么时候产生:创建对象过程中产生哈 当new people();过程中调用构造函数然后才能算得上一个对象哈 何为构造,就是构想创造嘛吧,创造一个对象出来吧 同学们...为什么构造函数__contruct()子为什么不像java那样构造函数名与类名一致呢? ?...php这样目的: 好处:如果类名发生改变不需要改构造函数,麻烦把,简洁一点把,构造函数名独立于类名把。 缺点;不好记把. 记住,一个类中只能有一个构造函数,只服务于他类所创建实例哈。...php class person { private $name; function __set($a,$name)//第一个为要赋值变量,第二个为要赋值变量$name为李文,$a为新定义变量...{ $this->$a=$name;//语法这样哈 } function __get($a)//获取赋值变量,获取新定义并赋值变量 { return $this->$a;/

48620

深入理解Java内存模型(六)——final

对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域写入,与随后把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序。...这行代码包含两个步骤: 构造一个FinalExample类型对象; 把这个对象引用赋值引用变量obj。...假设线程B读对象引用与读对象成员域之间没有重排序(马上会说明为什么需要这个假设),下图一种可能执行时序: 在上图中,写普通域操作编译器重排序到了构造函数之外,读线程B错误读取了普通变量i初始化之前值...对于引用类型,写final域重排序规则对编译器和处理器增加了如下约束: 在构造函数内对一个final引用对象成员域写入,与随后在构造函数外把这个构造对象引用赋值一个引用变量,这两个操作之间不能重排序...下面一种可能线程执行时序: 在上图中,1对final域写入,2对这个final域引用对象成员域写入,3构造对象引用赋值某个引用变量

71830

一次活见鬼调试经历

结果:第一句赋值成功,第二句没有效果。 我不再在构造函数赋值,而是另开一个方法单独赋值。问题依然存在。 ? ? 我开始怀疑是不是注解问题。...我把attestationType类型修改为byte[]和int[]。赋值问题不再出现!于是我现在得到结论注解short[]类型会出现赋值问题。 为什么偏偏是short[]类型呢?...步骤6问题,是因为我刚好把步骤22所说断电移动了,导致了这个现象,其实和值并没有关系。...如果我只是用打印方法查询该变量值而不是debug,在运行时构造函数中该值不会被改变。 所以表面看起来只是单步调试了一个赋值语句,而值就被变化了。...深层结果调试器调用了toString()导致修改值行为。 本次经历给我经验: 对数组赋值和操作,尤其构造函数时,应当进行拷贝而不是直接引用(数组直接clone()就可以了)。

42620

【C++】C++11常用特性总结

wyn命名空间中移动构造和移动赋值也实现了,实际移动构造和移动赋值原理很简单,就是因为右值将亡值嘛,那既然你都是将亡值了,何不直接把资源转移拷贝或是赋值对象呢?...把重新拷贝资源拷贝对象或赋值对象,这当然一点问题都没有。...此时就需要移动拷贝和移动赋值来提高这样场景下效率,怎么提高呢?很简单,我们不再拷贝资源,而是直接将右值资源移动拷贝对象或赋值对象,省去一次深拷贝。...但对于Date这样不涉及资源申请日期类,就没有必要实现移动构造和移动赋值了,因为你没有资源啊,压根不会出现深拷贝场景,你所有资源拷贝都是浅拷贝,移动语义接口和拷贝构造、拷贝赋值这些接口没有区别,...对于右边场景来说,编译器不能优化,因为赋值对象是已经存在,编译器不能直接构造ret,必须以赋值重载方式来拷贝ret,那就必须需要一个临时变量将str资源保存下来,然后将临时变量赋值ret

77540

java基础知识总结(绝对经典)

构造函数:用于对象进行初始化,给与之对应对象进行初始化,它具有针对性,函数一种。 特点: 1:该函数名称和所在类名称相同。 2:不需要定义返回值类型。 3:该函数没有具体返回值。...() 8:将首地址赋值p ,p变量就引用了该实体。...发现子类构造函数运行时,先运行了父类构造函数为什么呢?...而super():在调用父类中空参数构造函数为什么子类对象初始化时,都需要调用父类中函数?(为什么要在子类构造函数第一行加入这个super()?)...4:final修饰变量一个常量,只能赋值一次。 其实这样原因就是一些固定数据起个阅读性较强名称。 不加final修饰不是也可以使用吗?那么这个值一个变量可以更改

64200

Java基础知识大全(二)

构造函数用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相对应构造函数, (3)构造方法注意事项: A:如果一个自定义类没有构造方法,系统会默认给出一个无参构造方法。...C:调用区别 构造方法在创建对象时调用,一个对象建立,只调用一次相应构造函数 普通成员方法由创建好对象调用,可以调用多次8、构造代码块: (1)作用:对象进行初始化,对象一建立就执行,...而且优先于构造函数执行 (2)构造代码块和构造函数区别: 构造代码块所有不同对象共性进行统一初始化 构造函数对应对象进行初始化 9、this关键字...(6)调用构造代码块对对象进行初始化。(如果没有就不执行) (7)调用构造方法对对象进行初始化。对象初始化完毕。 (8)将对象内存地址赋值p变量,让p变量指向该对象。...String[]:字符串数组 args:数组名在运行时候,通过java命令args数组赋值

61151

C++之类和对象

注意这里一定还要带分号 类主体一般由成员变量和成员函数组成,但是,把成员变量放在前面还是把成员函数放在前面这个并没有影响,因为C++认为一个类就是一个整体,并没有什么前后之分。...,就没有必要再显示定义拷贝构造函数了,比如日期类: 可以看到,我没有写拷贝构造,但是编译器生成默认拷贝构造将d1变量成功拷贝了d2。...因为在进行赋值操作时候我们经常会连续赋值如(a=b=c)这样操作,其实这个连续赋值从右往左进行,也就是说其实是先将c赋值b,在将b=c这个赋值表达式返回值赋值a,所以还是需要返回值。...将临时变量赋值d3时候又要调用一次d3构造函数,所以这个过程其实是拷贝构造+构造得到,不过编译器做了优化跳过了拷贝构造过程。但是如果你使用一些较老编译器就可能没有优化。...,在Java中使用频繁,所以大家只需要了解有这个东西即可 匿名对象 所谓匿名对象就是在定义时不给它取名字,这样对象生命周期只有定义那一行,因为没有名字所以无法别人使用,一旦出了那一行就没有人能记得它了

1.1K00

Java并发关键字-final

final域为引用类型 final实现原理 为什么final引用不能从构造函数中“溢出” final简介 final可以修饰变量,方法和类,用于表示所修饰内容一旦赋值之后就不会再被改变,比如String...由于a,b之间没有数据依赖性,普通域(普通变量)a可能会被重排序到构造函数之外,线程B就有可能读到普通变量a初始化之前值(零值),这样就可能出现错误。...对final修饰对象成员域写操作 针对引用数据类型,final域写针对编译器和处理器重排序增加了这样约束:在构造函数内对一个final修饰对象成员域写入,与随后在构造函数之外把这个构造对象引用赋一个引用变量...引用数据类型: 额外增加约束:禁止在构造函数对一个final修饰对象成员域写入与随后将这个构造对象引用赋值引用变量 重排序 final实现原理 上面我们提到过,写final域会要求编译器在...具体是否插入还是得看是什么处理器 为什么final引用不能从构造函数中“溢出” 这里还有一个比较有意思问题:上面对final域写重排序规则可以确保我们在使用一个对象引用时候该对象final域已经在构造函数初始化过了

65930

java从入门到精通四(面向对象上,类与对象实现,代码块执行顺序)

2:方法内部类 顾名思义,该类定义在方法中,只能本方法所使用,所以就不可以public,static权限了。和局部变量一下,方法外部无法访问。...接口中不可以有具体方法和成员变量没有构造方法,而且不能示例话,只能实现。接口之间也具有继承关系,并且,接口只能继承接口。一个类可以实现多个接口,且若实现,必须实现接口中方法。...两种方法private赋值 1、 在原来类里定义一个方法,直接调用这个方法给它赋值 缺点:只能实现对私有属性赋值,但是没有办法取值。 2、 在原类里重载一个还有private参数方法。...至于机理,我们这样去理解,非静态方法/变量只有实例化之后才存放入堆没有实例化只会在栈内存,静态方法与变量在堆里。我这样理解,但其实你看网上会说有关方法区相关。...我们这样来做 普通方法需要通过对象来调用,静态方法可以直接调用。当然,你也可以通过对象调用。如下: 非静态成员方法/变量都是必须依赖具体对象才能够调用。

73120

第二阶段-Java面向对象:【第一章 面向对象】

关于初始化问题我们在下面详细讲解,但是我现在还有一个问题,在我们学习java中内存分配时候,有这样一句话,“堆内存用来存放new创建对象和数组” 换句话说对象存在于堆中,而成员变量存在于类中而且对象是类个体...,提供公共方法对其访问 思考过程: 通过对象去成员变量赋值,可以赋值一些非法数据 这是不合理。...所以在Student类中提供一个方法来对数据进行校验 但是如果偏偏不调用方法来赋值,还是直接赋值 这样我们方法就没有起作用 所以我们必须强制要求使用我方法,而不能直接调用成员变量 针对这种情况 Java...1.2 构造方法 构造方法和它所在类名字相同,但构造方法没有返回值。 通常会使用构造方法一个类实例变量赋初值,或者执行其它必要步骤来创建一个完整对象 怎么理解呢?...成员变量赋值两种方法: A:setXxx() ? B:构造方法 ?

52220

一起学JAVA 反射学习(超详细)

我们前面学习都有一个概念,private封装资源只能类内部访问,外部不行,但这个规定反射赤裸裸打破了。...反射就像一面镜子,它可以在运行时获取一个类所有信息,可以获取到任何定义信息(包括成员变量,成员方法,构造器等),并且可以操纵类字段、方法、构造器等部分。 2 为什么需要反射?...);//使私有成员允许访问 f.set(实例,值);//为指定实例变量赋值,静态变量,第一参数给null f.get(实例);//访问指定实例变量值,静态变量,第一参数给null 反射调用成员方法...* 思路: * 1.先获取指定构造函数对象,注意需要指定构造函数参数,传入.class字节码对象 * 2.通过刚刚获取到构造函数对象创建Student目标类对象,并且对象属性赋值 *...//4.设置属性值 //4.1 需要指定到底哪个对象name属性设置值,没有对象就创建对象 Object obj = clazz.newInstance

27820

java学习---new对象怎么内存回收

User u = new User(); 如上面代码,简单说就是new User()时候,会返回一个地址,并且将地址赋值引用u,当这个引用u持有的时候,java会认为这个对象时有用,不会回收对象...,如果你之后执行了好比说: 1 2 3 u = null; //或 u = new User(); 这样代码,那么这个u就不在持有之前对象地址了,变成了空或者新地址,这个时候如果没有其他引用持有了之前对象地址...一句话:如果这个对象没有   任何人  引用 它  ,就会被回收   注意回收new 那个对象, 来自  百度贴吧  String a ; 与String a = new String ()...类似于String source=“”这样对象赋值,不一定创建了一个对象(在已有的栈中查找是否已存在。),而new String()一定是在堆中新建了一个对象。...String ()构造函数 new在堆内存中开辟一个空间,String ()完成构造函数初始化动作后,把空间地 址值赋值a a一个引用类型,通过a可以引用String类中成员变量和成员方法

2.7K30
领券