java的构造方法

第六章 面向对象编程基础总结 6.1 面向对象概述 6.1.1 对象 6.1.2 类 6.1.3 面向对象程序设计的特点 1,封装 2,继承 3,多态 6.2 类与对象 阅读详情

  关于java的构造方法有几个简单的问题:

1.构造方法有返回值吗?

     没有。构造方法没有任何返回类型,也不允许是void。比如:

Java代码   收藏代码
  1. public class Test {   
  2.  //这不是构造函数!   
  3. public void Test() {   
  4. System.out.println("void Test()");   
  5. }   
  6. public static void main(String[] args) {   
  7. Test test = new Test();   
  8. test.Test();   
  9. }   
  10. }   

 

 

 

 

      这里我们定义了一个返回类型为void的Test()方法,有了返回类型void,它就不是构造方法了。

 

     Test test = new Test();

     有人用上面的表达式来说明构造方法返回对象引用,这是明显错误的。new关键字有两个作用。一是分配内存,

创建对象。二是调用构造方法,完成对象的初始化工作。完成这两步之后,才算创建了一个完整的Java对象。我们

可以用Test test = new Test();的反编译代码来说明这个问题:

0:    new    #5; //class Test

3:    dup

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

7:    astore_1

      原表达式被编译成四条bytecode指令。

new指令负责根据参数分配内存并创建Test对象,然后将新创建对象的引用置于栈顶。

dup指令复制栈顶的内容,记住,此时栈最顶端的两个单元都是新创建对象的引用。

接着是调用初始化方法,该方法是由构造方法编译而来,栈顶的引用作为此方法的参数消耗了。通过调用初始化方法完成

对象的创建过程。这里注意一下初始化方法Method "":()V,它是void类型的。

最后的astore_1指令将栈顶的对象引用赋给局部变量(前面说了,dup之后栈顶两个引用,一个给初始化方法吃掉了,一个留给astore_1操作用),也就是执行赋值操作。

     因此,得到的引用是new指令的结果,不是构造方法的返回值。

     有一点需要注意:new指令创建对象,同时使对象的各个字段得到其默认值,比如整数为0,浮点数为0.0,引用为null,boolean为false等。也就是说在构造方法执行之前,各个字段都有默认值了。这一点我们在第三条继续说明。

     通过上面说明,我们明确了构造方法的职能(初始化new指令创建的对象,得到一个状态合法的对象,完成对象的

创建过程)。任何类都有构造方法,但是new指令只能创建非抽象类的对象。理解了这一点,也就不要再问"抽象类也有构造方法,为什么不能创建对象"之类的问题了。

 

2.构造方法是静态的?

      错误。

      这是《Thinking In Java》中的一个观点。书里有一段:

Even though it doesn't explicitly use the static keyword, the constructor is actually a static method. So the first time an object of type Dog is created, or the first time a static method or static field of class Dog is accessed, the Java interpreter must locate Dog.class, which it does by searching through the classpath.

《java编程思想》中文第四版96页:

总结一下对象的创建过程,假设有个名为Dog的类:

1.即使没有显示地使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可以看成

是静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。

 

     这里我并没有看明白作者为什么说构造器实际上是静态方法。但是我们知道,静态方法是不能使用this的。因此,"构造器实际上也是静态方法"这点很好否定。看下面例子:

 

Java代码   收藏代码
  1. public class Test {   
  2. public Test() {   
  3. this.test2();   
  4. }   
  5. public static void test(){   
  6. this.test2();   
  7. }   
  8. public static void test2(){   
  9. }  
  10. }   

 

 

   test方法编译错误,因为静态方法中不能使用非静态的this,而构造方法使用this是没有问题的。

 

      如果有C++经验的话,可以类比一下。C++里的new操作符有两个作用,调用operator new()来分配内存,然后调用构造函数来完成初始化。

     而这里的operator new()是隐式静态的。参考《C++程序设计语言(特别版)》中文版的374页:

比如这个例子:

Cpp代码   收藏代码
  1. class Employee{  
  2. //...   
  3. public:   
  4. //....   
  5. void* operator new(size_t);   
  6. void operator delete(void* ,size_t);   
  7. }   

 

     成员operator new()和operator delete()默认为static成员,因为它们没有this指针,也不会修改任何对象。它们将提供一些存储,供构造函数去初始化,而后由析构函数去清理。

  类比可知,静态的是负责分配内存的工具,而不是构造函数。 不知道《Thinking In Java》的作者是不是把这点弄混了?

 

3.父类的构造方法中调用被子类重写的方法有多态现象。

     这句话很绕,直接看例子:

Java代码   收藏代码
  1. class Father{     
  2.     private int i = 5;     
  3.     public Father() {     
  4.         System.out.println("Father's i is " + this.i);     
  5.         test();     
  6.     }     
  7.     public void test(){     
  8.         System.out.println(this.i);     
  9.     }     
  10. }     
  11.     
  12. class Son extends Father{     
  13.     private int i = 55;     
  14.     
  15.     public Son() {     
  16.         System.out.println("Son's i is " + this.i);     
  17.     }     
  18.     
  19.     @Override    
  20.     public void test() {     
  21.         System.out.println(this.i);     
  22.     }     
  23.     
  24. }     
  25. public class Test {     
  26.     public static void main(String[] args) {     
  27.         new Son();     
  28.     }     
  29. }   

     

 

 

 结果是:

Father's i is 5
0
Son's i is 55

     结合第一点,构造方法调用之前,首先是new指令创建了一个对象,并将各个成员初始化为其默认值。下面看构造方法的调用过程。

     子类构造方法会调用父类构造方法,父类构造方法首先打印Father's i is 5。然后调用test()方法,注意,我们创建的是Son类的对象,所以test()方法调用的是Son类定义的test()方法,也就是说发生了多态。我们再去看Son类中test方法的实现,就是简单的输出this.i,为什么是0呢,别忘了我们还没有执行子类的构造方法啊,所以此时子类的i还是new指令初始化得到的0。好,test()方法执行完了,总算回到子类构造方法继续执行,先把i赋值为55,下面的输出语句Son's i is 55也就不难理解了。

    在构造方法中调用方法要特别注意这种多态现象。

ReelShort Android 逆向实战:Frida Hook 定位 sign 与 requestTime 算法 一个动态变化的 sign,如何从海量 so 逻辑中精准定位并完整复现?本文以海外短剧 App ReelShort 为例,实战拆解搜索、列表与详情接口的分析过程:从 Charles 抓包锁定关键参数,到 jadx 定位 native 函数,再借助 Frida Hook 验证加密结果;逐步还原 requestTime 的生成机制及 sign 的 HMAC-SHA256 签名逻辑。全文记录关键思路、踩坑与验证方法,带你建立一套可迁移的 Android 接口逆向分析流程。 阅读详情

相关推荐

Arm Neoverse CMN-700 QoS与PrefetchTarget架构解析

在现代多核处理器系统中,内存访问性能优化是提升整体效能的关键。QoS(服务质量)技术通过优先级调控机制,确保关键任务获得更高的缓存带宽和内存访问权限。PrefetchTarget作为预取技术的一种实现,能够显著降低内存访问延迟,特别适用于AI训练和数据库系统等高性能计算场景。Arm Neoverse CMN-700通过RN SAM模块实现了硬件级的地址范围检测和优先级调控,支持最多8个独立内存区域的QoS配置。测试数据显示,合理配置QoS可使关键任务延迟降低40%,而PrefetchTarget技术则能减少

weixin_36197669的博客 315

无聊:详解java的构造方法

      关于java的构造方法有几个简单的问题: 1.构造方法有返回值吗?      没有。构造方法没有任何返回类型,也不允许是void。比如: public class Test {  //这不是构造函数! public void Test() { System.out.println("void Test()"); } public static voi...

行走,思考 418

从2-RSS-1U并联踝关节到双足机器人动态行走:雅可比矩阵与力矩控制实践

本文深入探讨了2-RSS-1U并联踝关节在双足机器人动态行走中的关键作用,详细解析了其设计原理、雅可比矩阵的应用及力矩控制实践。通过优化几何参数和控制算法,实现了低转动惯量、高刚度和紧凑设计,显著提升了机器人的行走稳定性和能量效率。文章还分享了从仿真到实物的跨越经验及未来优化方向。

weixin_42641998的博客 597

大括号{}的意义与静态代码块与构造函数的加载关系

import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import java.util.TreeSet; import j

maylead的博客 583

su03t语音模块烧录识别不出问题解决方法

su03t语音sdk烧录无法识别问题

weixin_49387645的博客 6390

Modbus TCP 通信(C#)

【代码】Modbus TCP 通信(C#)

weixin_56229359的博客 1151

10.21 test()与 new test()不同

var a = 5; function test(){ a = 0; console.log(a); console.log(this.a); var a; console.log(a); } new test();

qq_44805237的博客 1299

YOLOv13:目标检测的全面攻略与实战指南

本文是关于 YOLOv13 的全攻略文章。先回顾 YOLO 系列发展,点明 YOLOv13 在该系列中的创新地位,阐述其基于 HyperACE、FullPAD 和轻量级卷积替换等技术的独特优势。深入剖析各核心技术原理,通过与其他版本及实际场景对比展现其性能优势。介绍项目结构与使用方式,分享数据增强、锚框优化等实用技巧,并列举安防监控、自动驾驶等领域应用案例。最后总结 YOLOv13 价值,展望目标检测技术未来发展趋势,为读者提供全面的 YOLOv13 学习与实践指导。

邓邓子的博客 3435

java的4种引用类型

StrongReference(强引用) 写法:Test test = new Test() 这是最常见的引用类型,也是最牢固的引用类型,当jvm发生gc时,对象被引用不会被gc回收,jvm内存满了将要发生OOM(out of memory)的时候,强引用类型也不会被回收 SoftReference(软引用) 写法:SoftReference<String> softRefer...

啊狸的Java的博客 1416

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)

内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li

大模型大数据攻城狮的专栏 2205

Java构造方法和子类构造方法

Java构造方法 构造方法是用于初始化一个新建的对象。 普通构造方法 方法名与类名相同 无返回类型 子类不能继承父类的构造方法 不能被static、final、abstract修饰(有final和abstract修饰的是不能被子类继承的,abstract修饰的是抽象类,抽象类是不能实例化的,也就是不能new) public class A{ int i=0; public A(){ ...

du_du1的博客 1万+

79、昇腾系列服务器/昇腾系列推理卡/昇腾系列嵌入式开发板+Dify+one api部署DeepSeek-R1-Distill-Qwen-32BW8A8+RAG本地模型知识库和负载均衡双实例

阶段,安装过程缺什么,,在docker外面git下源码,进入容器内部进行量化,这里的容器建议在创建个8卡的容器,双卡容器量化会显示npu显存不够,除非你用cpu转模型,我就懒得创建容器了,使用cpu量化吧,巨慢;创建容器,进入容器,计划使用两张昇腾NPU卡推理DeepSeek-R1-Distill-Qwen-32B的W8A8模型,所以构建的容器用两张卡,选6、7卡吧,0-6号卡可以跑文本嵌入模型、重排序模型;直接进入量化阶段,在容器外面操作即可,环境不用管,因为系统已经默认配置了环境,直接跳到。

sxj731533730 6123

Java构造方法

Java构造方法 当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。 Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。 Java不支持像C++中那样的复制构造方法,这个不同点...

weixin_41924879的博客 7579

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java中构造方法的作用

初学Java的构造方法时,根本不能理解构造方法有什么用,自己写程序的时候也从来没有用过。于是刚开始我写的程序是这样的: package test3; public class Student { private String name; private long ID; private double score; public String getName() { return na...

RedDream_的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JAVA 构造方法

构造方法是类当中的一种特殊方法,用来初始化一个类对象,在创建对象之后(new之后)自动调用。 Java中的每个类都有一个默认的构造方法,并且可以拥有一个以上的构造方法。 Java构造方法有以下特点: 1.方法名必须和类名相同。 2.可以有一个或多个参数,也可以没有参数。 3.无返回值,包括void。 4.默认返回类型就是对象类型本身。 5.只能与new运算符结合使用。 构造方法主要有无参和有参俩种 public class demo01Person { private int m; // 定义

shuyv的博客 1957

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JAVA构造方法

构造方法与类同名,没有返回类型,并且在创建对象时被调用。它用于初始化对象的状态,并在对象被创建后执行必要的初始化操作。访问修饰符 类名(参数列表) {// 构造方法的代码其中,访问修饰符可以是public、protected、private或默认(无修饰符),用于限制构造方法的访问范围。在上面的代码中,我们定义了一个名为Person的类,并包含了name和age两个属性。我们还定义了一个含有参数的构造方法,用于初始化这些属性值。

2401_85673892的博客 1584

JAVA的构造方法是什么

JAVA构造方法 1.在JAVA语言中,构造方法也叫做构造器,它是一种比较特殊的方法,主要用于创建实例(也就是对象)的时候进行初始化操作。 Person p=new Person(); 这里的Person就是一个构造方法,构造方法是默认不可见的。 在没有手动定义构造方法的时候,采用的是系统为操作类提供的一个无参数的默认的构造方式(这就是为什么new一个对象后面要加上()的原因就是要调用系统默认的无参的构造方法),它的形式就是public 类名()[]。 class Box{ //构造方法没有返回值

weixin_48377363的博客 5573

Java 构造方法

在 Java 中,构造方法(Constructor)是用于创建类的对象的特殊方法。当使用 new 关键字创建对象时,构造方法会自动调用,用来初始化对象的属性。:构造方法的名称必须与类名完全一致,包括大小写。这是构造方法的一个基本要求。:构造方法没有返回类型声明,即使是void也不写。这使得它与普通方法区分开来。:每次使用new创建对象时,构造方法会自动调用,以初始化对象的属性和状态。:构造方法只能通过new关键字在创建对象时调用,不能像普通方法那样直接调用。

m0_74825466的博客 792

java构造方法的返回值类型_Java构造方法

构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。Java 构造方法有以下特点:方法名必须与类名相同可以有 0 个、1 个或多个参数没有任何返回值,包括 void默认返回类型就是对象类型本身只能与 new 运算符结合使用值得注意的是,如果为构造方法定义了返回值类型或使...

weixin_30091863的博客 1万+

【java】构造方法

构造方法用于创建和初始化对象。构造方法的名字必须与类名相同,且没有返回值类型。构造方法可以重载,一个类可以有多个构造方法。如果没有定义构造方法,Java 会提供一个默认的无参构造方法。

m0_46692380的博客 915

Java——构造方法

关于Java类中的构造方法 1、构造方法又被称为构造函数/构造器/Constructor 2、构造方法语法结构: [修饰符列表] 构造方法名 (形式参数列表) { 构造方法体; } 3、回顾一下普通方法的语法结构: [修饰符列表] 返回值类型 方法名 (形式参数列表) { 方法体; } 4、对于构造方法来说,“返回值类型”不需要指定,并且也不能写void。只要写上void,这个方法就成为普通方法了。 5、对于构造方法来说,构造方法的方法名必须和类...

weixin_62838185的博客 6444

Java有参构造方法和无参构造方法

Java有参构造方法和无参构造方法 1、定义:**** 编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法;(如果自己添加构造函数,无论有参数或是没参数,默认构造函数都将无效) 编写时添加了有参构造方法而未添加无参构造方法,那么编译器只认有参构造方法而不会默认添加无参构造方法! 如果需要使用无参构造方法,一定要在类里面添加 2、举例: 定义四个类(说明四种情况): 类Person1 自己不手动添加任何无参或有参数构造方法 (实例化对象时:编译通过) 类Person2 自

你好,摆渡人的博客 4719

Java私有构造方法

提到私有构造方法之前,先来简单说明一下两个名词表示,一个是私有,一个是构造方法。私有用访问修饰符private表示。 Java 的访问修饰符是什么 访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法或者变量的访问权限。 它们包含: public: 所有类都可以访问。 protected: 同一个包内以及所有子类都可以访问。 private:...

cyjbdqn的博客 9460

无参构造方法_Java有参构造方法和无参构造方法详解

一:有参数构造方法在之前我们要为一个对象赋值,先要创建好对象之后然后“对象名.属性名”或者调用属性的setter为属性赋值。但是在很多时候觉得这样做很麻烦,最好的做法是在创建对象的时候完成属性的初始化操作,此时需要使用到有参数构造方法方能完成该功能(有人把构造方法叫做构造器)。DEMO:定义有参数构造方法上面定义了四个有参数构造方法,发现了构造方法可以重载,书写的习惯是重载的构造方法按...

weixin_39627201的博客 3784
上一篇: hibernate的回滚
下一篇: 验证码 getOutputStream() has already been called for this response异常的原因和解决方法
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值