面向对象_this关键字

1.1 this调用构造方法

在之前学习方法之间调用时,可以通过方法名进行调用。可是针对构造方法,无法通过构造方法名来相互调用。

构造方法之间的调用,可以通过this关键字来完成。

构造方法调用格式

this(参数列表)

构造方法的调用

class Person {

// Person的成员属性

private int age;

private String name;

// 无参数的构造方法

Person() {

}

// 给姓名初始化的构造方法

Person(String nm) {

name = nm;

}

// 给姓名和年龄初始化的构造方法

Person(String nm, int a) {

// 由于已经存在给姓名进行初始化的构造方法 name = nm;因此只需要调用即可

// 调用其他构造方法,需要通过this关键字来调用

this(nm);

// 给年龄初始化

age = a;

}

}

1.2 this的原理图解

了解了构造方法之间是可以相互调用,那为什么他们之间通过this就可以调用呢?

通过上面的学习,简单知道使用this可以实现构造方法之间的调用,但是为什么就会知道this调用哪一个构造方法呢?接下来需要图解完成。

class Person {

private int age;

private String name;

Person() {

}

Person(String nm) {

name = nm;

}

Person(String nm, int a) {

this(nm);

age = a;

}

}

class PersonDemo {

public static void main(String[] args) {

Person p = new Person("张三", 23);

}

}

图列说明

1、先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);

2、堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null age = 0);

3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。

4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。

5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。

6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。

注意

this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。

调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。

1.3 成员成员变量和局部变量同名问题

通过上面学习,基本明确了对象初始化过程中的细节,也知道了构造方法之间的调用是通过this关键字完成的。但this也有另外一个用途,接下来我们就学习下。

当在方法中出现了局部变量和成员变量同名的时候,那么在方法中怎么区别局部变量成员变量呢?可以在成员变量名前面加上this.来区别成员变量和局部变量

class Person {

private int age;

private String name;

// 给姓名和年龄初始化的构造方法

Person(String name, int age) {

// 当需要访问成员变量是,只需要在成员变量前面加上this.即可

this.name = name;

this.age = age;

}

public void speak() {

System.out.println("name=" + this.name + ",age=" + this.age);

}

}

class PersonDemo {

public static void main(String[] args) {

Person p = new Person("张三", 23);

p.speak();

}

}

1.4 this的应用

学习完了构造方法、this的用法之后,现在做个小小的练习。

需求:在Person类中定义功能,判断两个人是否是同龄人

class Person {

private int age;

private String name;

// 给姓名和年龄初始化的构造方法

Person(String name, int age) {

// 当需要访问成员变量是,只需要在成员变量前面加上this.即可

this.name = name;

this.age = age;

}

public void speak() {

System.out.println("name=" + this.name + ",age=" + this.age);

}

// 判断是否为同龄人

public boolean equalsAge(Person p) {

// 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较

// 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替

/*

* if(this.age == p.age) { return true; } return false;

*/

return this.age = p.age;

}

}

标签:关键字,Java,name,构造方法,Person,age,面向对象,nm,String

来源: https://blog.csdn.net/kli184810/article/details/113775730

java面向对象三个关键字_Java_面向对象_this关键字相关推荐

  1. Python基础学习——面向对象编程(第一讲:面向对象概述、面向对象三个基本特征(封装性、继承性、多态性)、类和对象(定义类、创建和使用对象、实例变量、类变量、构造方法、实例方法、类方法、静态方法))

    面向对象是Python最重要的特性,在Python中一切数据类型都是面向对象的. 1.面向对象概述 面向对象的编程思想是,按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建软件系 ...

  2. 学习JAVA面向对象——JAVA的三个特征

    Java的三个特征:①封装        ②继承        ③多态 封装(Encapsulation)是面向对象的基本特征之一.为实现封装有两个步骤:其一是将成员变量私有化,目的是为了将不能暴露的 ...

  3. Java第三次作业——面向对象基础(封装)

    Java第三次作业--面向对象基础(封装) (一)学习总结 1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明. 封装性就是指对外部不可见,用对象直接访问类中的属性,在面向对象法则中 ...

  4. 黑马毕向东Java课程笔记(day07):面向对象(第三部分)继承+抽象类+模板方法设计模式+接口+final+继承补充(就业班)

      在这一部分中,我们将讲解有关继承的相关内容,包括继承的概述.继承的特点.super关键字.函数覆盖.子类的实例化过程.final关键字这几个部分的内容. 1.继承的概述以及特点 1.1.概述    ...

  5. 第三章:Java_面向对象编程(一)

    目录: 类及对象 方法的重载 可变个数的形参的方法 java的值传递机制 面对对象的特征之一:封装性 构造器 this关键字 package/import JAVA 知识图解 面向对象 Q:如何理解面 ...

  6. java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象

    Java是面向对象的高级编程语言,面向对象的特征如下: 面向对象具有抽象.封装.继承.多态等特性: 面向对象可以将复杂的业务逻辑简单化,增强代码复用性: 面向对象是一种常见的思想,比较符合人们的思考习 ...

  7. 【JAVA SE】第六章 面向对象、对象和类以及封装

    第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...

  8. Java小白进阶笔记(5)-进阶面向对象

    继续学习: 7.偏头痛杨的Java入门教学系列之进阶面向对象篇 上Java课的时候没弄明白接口,今天终于明白了(但没使用过,还停在理论的程度,可能理解也不准确,以后学通了会回来补充:)如果你刚学Jav ...

  9. java面向对象程序设计题库_java面向对象程序设计习题集.doc

    java面向对象程序设计习题集.doc 1JAVA 面向对象程序设计习题集 23目 录引 言 .6第一章 JAVA 基础 7一.填空题 7二.判断题 9三.选择题 9四.程序阅读题 26第二章 控制结 ...

最新文章

  1. C++ 各种构造函数
  2. [转]HDR渲染器的实现(基于OpenGL)
  3. 线性筛选素数法(O(n)复杂度)
  4. [编程笔记] UNICODE和UTF-8和ASCII互转
  5. java 打包zip下载_java web 将文件打包成 .zip后 肿么自动弹出下载框提示并下载?
  6. 小程序 自定义组件报错[“usingComponents“][“my-list“] 未找到
  7. 微信小程序继续入坑指南
  8. 创业冲突的五种解决方法是_不会说话,不懂处理人际冲突怎么办?《沟通的艺术》5步教会你...
  9. MySQL管理工具:mysql、mysqladmin、mysqldump
  10. 20180209-sys模块
  11. 防盗报警器c语言程序,基于AT89C2051设计的无线防盗报警器 附程序
  12. adb 查看浏览器内核
  13. Dism++: 好用的Windows 系统优化工具
  14. 字节跳动后端日常实习一二+hr面面经(已OC)
  15. 为什么使用对象指针而不是使用对象本身?
  16. 打开jsp文件出现error错误,不能查看文件内容的解决方法,亲测有效
  17. 什么?你的口腔竟然只有一边长牙结石!!!
  18. 最新·前端的工资分布情况 - 你拖后腿了吗?
  19. IP地址的划分(A/B/C/D/E)类
  20. 如何选择直流微电机1

热门文章

  1. linux下安装gcc
  2. HOJ——T 1867 经理的烦恼
  3. 基于 webdriver 的测试代码日常调试方python 篇
  4. 加载heat resource的代码分析
  5. Vue2.0实现1.0的搜索过滤器功能
  6. java lampo整车,lampo
  7. 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结
  8. [ZJOI2012]灾难(建图)
  9. Linux -chattr -隐藏权限(附加权限)
  10. DBUtils 学习使用