构造函数(包含this关键字的简单应用)
嗯,说到了构造函数,先说他是个什么东西。
构造函数,就是定义在类中,用于对成员变量进行初始化的函数(这里说得并不算准确,因为构造函数体中也可以不包含初始化语句)。构造函数没有返回值,可以有形参,前面的修饰符为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关键字的简单应用)相关推荐
- 在整个数据库中查找包含某关键字的所有存储过程
当我们对数据表进行修改时,比如删除某个字段.我们必须保证所有用到该字段的存储过程都必须做相应的修改.因此我们如果能用一条SQL语句来查找出所有包含该字段名称的存储过程,那将是非常方便的: --查找包含 ...
- 查找包含指定关键字的BDOC
Created by Jerry Wang, last modified on Apr 27, 2015 假设需要查找指定时间段内,包含指定关键字的BDOC列表. 执行report,指定时间间隔和关键 ...
- 在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项
#!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : zwy24 ...
- SQL SERVER 查看所有存储过程或视图里包含某个关键字的查询语句
SQL SERVER 查看所有存储过程或视图里包含某个关键字的查询语句 select [name],[xtype] from sysobjects o,syscomments s where o.id ...
- 批量提取excel中包含特定关键字的单元格内容
批量提取excel中包含特定关键字的单元格内容 链接:https://pan.baidu.com/s/1uTnkYXh8jBcaeda-JoQDuQ 提取码:jbkv class get_xls_da ...
- python docx 合并文档 图片_Python检查Word文件中包含特定关键字的所有页码
推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系 ...
- Python检查Word文件中包含特定关键字的所有页码
推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...
- python批量处理excel提取包含指定关键字的行
python批量处理excel提取包含指定关键字的行 当我们有大量excel表格需要批处理,目标为提取包含指定关键字的行,可用本文代码,环境为windows python依赖安装 安装好python后 ...
- C# 面向对象编程 1 面向对象类,静态和非静态的区别,构造函数,new关键字 ,析构函数
C# 面向对象编程 1 文章目录 C# 面向对象编程 1 1.面向过程-----> 面向对象 2.类 3.静态和非静态的区别 4.构造函数 5.new关键字 6. 析构函数 1.面向过程---- ...
最新文章
- 算法实现太难了?机器学习也需要开源软件
- 拆位 ---- C. Johnny and Another Rating Drop[位运算,计算每一位的贡献+推导过程]
- 如何修改word中的单位信息、用户信息及文档属性
- mysql事务概念_MySQL事务的概念
- 【Android 插件化】VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )
- intel的linux证书过期,数据库镜像中证书过期的解决方案
- powershell 文件/文件夹操作
- java 去掉 t_[Java教程]LocalDateTime去掉T
- 5G网络出现打乱传统网络范式,AI驱动+区块链能搞出啥新花样?
- Flink:动态表上的连续查询
- 0-1总体分布下的参数假设检验示例一(SPSS实现)
- 开课吧:适合开发人工智能应用的编程语言有哪些?
- 网吧服务器ip地址修改,BXP服务器下的网吧ip地址怎么更改
- 【计算机视觉】人脸识别--人脸识别技术综述
- 【Opencontrail】对接k8s基本原理
- Java发送邮件,优美html邮件模板分享
- OpenCV 之 角点检测
- 安全邮箱怎么注册?邮箱地址是什么?怎么写?快速了解tomvip邮箱
- 魔与道java版本_魔与道360版下载
- Java用Jsoup开发爬虫获取双色球开奖信息
热门文章
- 迁移学习——入门笔记
- 1.gcForest 包安装和集成学习方法的 Python 实现2.minepy安装方法(Windows版本)
- Wannafly挑战赛21 E 未来城市规划
- beego学习笔记(4):开发文档阅读(3)
- GO语言Windows下Liteide
- dede 二次开发系统迁移到 IIS 时会出现的问题及解决方案
- 测试数据库sql声明效率
- 解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”(转贴)...
- VC++2005 CString和char*的相互转换
- 支付宝支付 第四集:配置类的定义和注入