java面向对象三个关键字_Java_面向对象_this关键字
面向对象_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关键字相关推荐
- Python基础学习——面向对象编程(第一讲:面向对象概述、面向对象三个基本特征(封装性、继承性、多态性)、类和对象(定义类、创建和使用对象、实例变量、类变量、构造方法、实例方法、类方法、静态方法))
面向对象是Python最重要的特性,在Python中一切数据类型都是面向对象的. 1.面向对象概述 面向对象的编程思想是,按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建软件系 ...
- 学习JAVA面向对象——JAVA的三个特征
Java的三个特征:①封装 ②继承 ③多态 封装(Encapsulation)是面向对象的基本特征之一.为实现封装有两个步骤:其一是将成员变量私有化,目的是为了将不能暴露的 ...
- Java第三次作业——面向对象基础(封装)
Java第三次作业--面向对象基础(封装) (一)学习总结 1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明. 封装性就是指对外部不可见,用对象直接访问类中的属性,在面向对象法则中 ...
- 黑马毕向东Java课程笔记(day07):面向对象(第三部分)继承+抽象类+模板方法设计模式+接口+final+继承补充(就业班)
在这一部分中,我们将讲解有关继承的相关内容,包括继承的概述.继承的特点.super关键字.函数覆盖.子类的实例化过程.final关键字这几个部分的内容. 1.继承的概述以及特点 1.1.概述 ...
- 第三章:Java_面向对象编程(一)
目录: 类及对象 方法的重载 可变个数的形参的方法 java的值传递机制 面对对象的特征之一:封装性 构造器 this关键字 package/import JAVA 知识图解 面向对象 Q:如何理解面 ...
- java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象
Java是面向对象的高级编程语言,面向对象的特征如下: 面向对象具有抽象.封装.继承.多态等特性: 面向对象可以将复杂的业务逻辑简单化,增强代码复用性: 面向对象是一种常见的思想,比较符合人们的思考习 ...
- 【JAVA SE】第六章 面向对象、对象和类以及封装
第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...
- Java小白进阶笔记(5)-进阶面向对象
继续学习: 7.偏头痛杨的Java入门教学系列之进阶面向对象篇 上Java课的时候没弄明白接口,今天终于明白了(但没使用过,还停在理论的程度,可能理解也不准确,以后学通了会回来补充:)如果你刚学Jav ...
- java面向对象程序设计题库_java面向对象程序设计习题集.doc
java面向对象程序设计习题集.doc 1JAVA 面向对象程序设计习题集 23目 录引 言 .6第一章 JAVA 基础 7一.填空题 7二.判断题 9三.选择题 9四.程序阅读题 26第二章 控制结 ...
最新文章
- C++ 各种构造函数
- [转]HDR渲染器的实现(基于OpenGL)
- 线性筛选素数法(O(n)复杂度)
- [编程笔记] UNICODE和UTF-8和ASCII互转
- java 打包zip下载_java web 将文件打包成 .zip后 肿么自动弹出下载框提示并下载?
- 小程序 自定义组件报错[“usingComponents“][“my-list“] 未找到
- 微信小程序继续入坑指南
- 创业冲突的五种解决方法是_不会说话,不懂处理人际冲突怎么办?《沟通的艺术》5步教会你...
- MySQL管理工具:mysql、mysqladmin、mysqldump
- 20180209-sys模块
- 防盗报警器c语言程序,基于AT89C2051设计的无线防盗报警器 附程序
- adb 查看浏览器内核
- Dism++: 好用的Windows 系统优化工具
- 字节跳动后端日常实习一二+hr面面经(已OC)
- 为什么使用对象指针而不是使用对象本身?
- 打开jsp文件出现error错误,不能查看文件内容的解决方法,亲测有效
- 什么?你的口腔竟然只有一边长牙结石!!!
- 最新·前端的工资分布情况 - 你拖后腿了吗?
- IP地址的划分(A/B/C/D/E)类
- 如何选择直流微电机1