嗯,说到了构造函数,先说他是个什么东西。

构造函数,就是定义在类中,用于​对成员变量进行初始化的函数(这里说得并不算准确,因为构造函数体中也可以不包含初始化语句)。构造函数没有返回值,可以有形参,前面的修饰符为public,可加可不加。

下面举个例子,比如有一个Person类

class Person

{

private String name; private  int age;​

Person(){}//这是Person类中的构造函数

void Person(){}//这仅仅是一个名字为Person的函数,返回值为空!注意,构造函数无返回值!​

}​

需要强调的是,构造函数的函数名必须与类名相同。

当然,构造函数也可以接受参数,比如Person(String name){this.name=name;}

形参name通过主函数在创建Person类成员时(如Person p = new Person("小明");)传递。创建过程简单分析如下:(进栈也叫压栈,出栈也叫弹栈)

​首先主函数进栈,创建出一个变量p。

接着在堆中创建区域用来存放Person类​(new关键字创建的区域存放在堆中)。Person类中有name、age两个变量,分别初始化为null、0(堆里的成员可以进行自动初始化,栈中则不行)。

然后调用构造函数Person()。即Person()函数进栈。进栈时​字符串"小明"传递给Person函数的形参name,Person中出现this关键字,将之前堆中创建的对象的地址赋值给它(不太清楚这里的专有名词叫什么,望大神指正)。

注:此时穿插讲了this关键字的含义,即代表调用对象的地址

​this关键字的出现,解决了一个变量重名的问题。(如果传递给构造函数的参数名字叫 n,则代码可读性差,但要是叫name,则会重名,虽然编译不会出错,但是彼此赋值的时候,其实指的是自身赋值给自身,接下来会详细讲到)。

在语句this.name=name;这条语句中,this.name,代表的是已经在堆中创建的对象中的name(那个已经初始化为NULL的实例),而后面的name ,则仅仅是Person函数的形参。

因为this.name具有指向性,所以也就代表被赋值的其实是堆中的name。

构造函数完成后,就会弹栈,同时会将之前创建在堆中的对象的地址赋值给p。((-。-;)嗯,这是最后一步)

需要注意的是

1、给this赋地址值是隐形操作,即这一步不用在代码中显性地表达出来。我们只要明白,正是有了这一步,所以this.name才能准确地指向确定的调用对象(毕竟堆中很可能存在多个Person实例)。

2、给对象中实例初始化(即NULL,0)这一步看似毫无用处,但是它确实是存在的,并且是在调用构造函数之前就已经完成了的。

​​构造函数的出现,方便了我们对类成员变量的初始化。毕竟不能老用堆来初始化一些数据(因为某些数据在第一次出现时就应该是有意义的)。

构造函数也也已避免用户对类成员进行一些非法赋值。

为了程序的安全性,成员变量通常用private修饰,它们是不可被外部类访问的,此时,就需要在中间架上一座桥梁(即Person()函数中所需要的参数)​,对这个参数进行限制后,再将此参数的值赋值给类中的变量。

这样既保证了良好的封装性,也保证了安全性。​​

顺便说明一下,如果程序员在类中没有定义构造函数,java是会自动给我们加上一个极简构造函数的。(例:Person(){})

转载于:https://www.cnblogs.com/sjbas/p/5338613.html

构造函数(包含this关键字的简单应用)相关推荐

  1. 在整个数据库中查找包含某关键字的所有存储过程

    当我们对数据表进行修改时,比如删除某个字段.我们必须保证所有用到该字段的存储过程都必须做相应的修改.因此我们如果能用一条SQL语句来查找出所有包含该字段名称的存储过程,那将是非常方便的: --查找包含 ...

  2. 查找包含指定关键字的BDOC

    Created by Jerry Wang, last modified on Apr 27, 2015 假设需要查找指定时间段内,包含指定关键字的BDOC列表. 执行report,指定时间间隔和关键 ...

  3. 在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项

    #!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : zwy24 ...

  4. SQL SERVER 查看所有存储过程或视图里包含某个关键字的查询语句

    SQL SERVER 查看所有存储过程或视图里包含某个关键字的查询语句 select [name],[xtype] from sysobjects o,syscomments s where o.id ...

  5. 批量提取excel中包含特定关键字的单元格内容

    批量提取excel中包含特定关键字的单元格内容 链接:https://pan.baidu.com/s/1uTnkYXh8jBcaeda-JoQDuQ 提取码:jbkv class get_xls_da ...

  6. python docx 合并文档 图片_Python检查Word文件中包含特定关键字的所有页码

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系 ...

  7. Python检查Word文件中包含特定关键字的所有页码

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...

  8. python批量处理excel提取包含指定关键字的行

    python批量处理excel提取包含指定关键字的行 当我们有大量excel表格需要批处理,目标为提取包含指定关键字的行,可用本文代码,环境为windows python依赖安装 安装好python后 ...

  9. C# 面向对象编程 1 面向对象类,静态和非静态的区别,构造函数,new关键字 ,析构函数

    C# 面向对象编程 1 文章目录 C# 面向对象编程 1 1.面向过程-----> 面向对象 2.类 3.静态和非静态的区别 4.构造函数 5.new关键字 6. 析构函数 1.面向过程---- ...

最新文章

  1. 算法实现太难了?机器学习也需要开源软件
  2. 拆位 ---- C. Johnny and Another Rating Drop[位运算,计算每一位的贡献+推导过程]
  3. 如何修改word中的单位信息、用户信息及文档属性
  4. mysql事务概念_MySQL事务的概念
  5. 【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )
  6. intel的linux证书过期,数据库镜像中证书过期的解决方案
  7. powershell 文件/文件夹操作
  8. java 去掉 t_[Java教程]LocalDateTime去掉T
  9. 5G网络出现打乱传统网络范式,AI驱动+区块链能搞出啥新花样?
  10. Flink:动态表上的连续查询
  11. 0-1总体分布下的参数假设检验示例一(SPSS实现)
  12. 开课吧:适合开发人工智能应用的编程语言有哪些?
  13. 网吧服务器ip地址修改,BXP服务器下的网吧ip地址怎么更改
  14. 【计算机视觉】人脸识别--人脸识别技术综述
  15. 【Opencontrail】对接k8s基本原理
  16. Java发送邮件,优美html邮件模板分享
  17. OpenCV 之 角点检测
  18. 安全邮箱怎么注册?邮箱地址是什么?怎么写?快速了解tomvip邮箱
  19. 魔与道java版本_魔与道360版下载
  20. Java用Jsoup开发爬虫获取双色球开奖信息

热门文章

  1. 迁移学习——入门笔记
  2. 1.gcForest 包安装和集成学习方法的 Python 实现2.minepy安装方法(Windows版本)
  3. Wannafly挑战赛21 E 未来城市规划
  4. beego学习笔记(4):开发文档阅读(3)
  5. GO语言Windows下Liteide
  6. dede 二次开发系统迁移到 IIS 时会出现的问题及解决方案
  7. 测试数据库sql声明效率
  8. 解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”(转贴)...
  9. VC++2005 CString和char*的相互转换
  10. 支付宝支付 第四集:配置类的定义和注入