韩顺平Java学习笔记P245对象创建流程分析P246this关键字-P250
P245对象创建流程分析
- //1.先在方法区加载方法类
- //2.在堆里开空间一个存放age,一个存放name
- //3.(先默认初始化有默认值age=0,name=null,再显示初始化age=90,name=null)
- //4.这个时候调用构造器(name=小钱,注意String指向方法区的常量池,堆的name空间是地址,age=20)
- //5.将堆的开辟的空间地址传给P,P本质是对象的引用
- 代码如下
public class Test245 {public static void main (String[] args) {Person p = new Person("小钱",20);//1.先在方法区加载方法类//2.在堆里开空间一个存放age,一个存放name//3.(先默认初始化有默认值age=0,name=null,再显示初始化age=90,name=null)//4.这个时候调用构造器(name=小钱,注意String指向方法区的常量池,堆的name空间是地址,age=20)//5.将堆的开辟的空间地址传给P,P本质是对象的引用}} class Person{//类int age=90;String name;Person(String n,int a){name=n;age=a;} }
总结:
- 1.加载Person类信息(Person.class),只会加载一次
- 2.在堆里分配空间(地址)
- 3.在堆里完成对象吃时候[3.1默认初始化age=0,name=null,3.2显示初始化 age =90,
- name=null,3.3构造器初始化 age=20,name=“小钱"]
- 4.在对象在堆中的地址返回给p,(p是对象名,也可以理解成对象的引用总结:
P246this关键字
- //如果我们构造器的形参直接写成属性名更好了
- //但是出现一个问题,根据变量的作用域规则
- //构造器name是局部变量,而不是属性
- //构造器age是局部变量,而不是属性
- //=>1引出this关键字
public class Test246this01 {public static void main (String[] args) {Dog dog1 = new Dog("keai",3);dog1.info();//输出的是属性,所以结果就是null和0 } } class Dog{//类public int age;public String name;public Dog(String name,int age){//构造器//如果我们构造器的形参直接写成属性名更好了//但是出现一个问题,根据变量的作用域规则//构造器name是局部变量,而不是属性//构造器age是局部变量,而不是属性//=>1引出this关键字age=age;name=name;}public void info(){//成员方法System.out.println(name+"\t"+age+"\t");} }
this关键字P247
this java虚拟机会给每个对象分配this,代表当前对象,用this解决前面的问题
public Dog(String name,int age){//构造器//=>1引出this关键字this.age=age;//this,name就是当前对象的属性name,this.name=name;//当前对象就是指new出来的当前对象,谁调用就是谁
- //this,name就是当前对象的属性name,
- //当前对象就是指new出来的当前对象,谁调用就是谁
- 此时输出keai
- 内存分析法理解thisP248
- Dog dog1 = new Dog("keai",3);
dog1.info();- main栈中dog1[地址1] 堆里对象dog1地址1[age:3,name:指向方法区常量池地址2,隐藏属性this地址1(可以看成指向对象dog1) 方法区常量池[name:keai 地址2]
- 实际上因为地址存在是java虚拟机,我们可以用hashCode来演示(把对象地址转换成整数)
public class Test246this01 {public static void main (String[] args) {Dog dog1 = new Dog("keai",3);System.out.println("dog1的hashCode"+dog1.hashCode());dog1.info();Dog dog2 = new Dog("ki",2);dog2.info();System.out.println("dog2的hashCode"+dog2.hashCode());}} class Dog{//类public int age;public String name;public Dog(String name,int age){//构造器this.age=age;//this,name就是当前对象的属性name,this.name=name;//当前对象就是指new出来的当前对象,谁调用就是谁System.out.println("this.hashCode="+this.hashCode());}public void info(){//成员方法} }
输出结果如下
this.hashCode=2104457164
dog1的hashCode2104457164
this.hashCode=1500056228
dog2的hashCode1500056228P250this关键字细节
1.//this关键字可以用来访问本类的属性、方法、构造器
2.//this可以用于区分当前类的属性和局部变量
3.//访问成员方法的语法:this.方法名(参数列表);
4.//访问构造器语法:this(参数列表);注意只能在构造器中使用 访问构造器的语法,this()必须放置再第一条语句
5.//this不能再类定义的外部使用,只能再类定义的方法中使用
具体代码.//访问本来属性的语法:this.属性名;P250
public class Test250ThisDetial {public static void main (String[] args) {T t2=new T();t2.f();} }//访问成员方法的语法:this.方法名(参数列表;class T{String name ="smith";int age=99;public void f(){//this关键字访问本类的属性String name="jiujin";//传统方法(就近原则)System.out.println("name"+name+"age="+age);//输出就近name//也可以使用this方法System.out.println("name"+this.name+"age="+this.age);//输出simith}}
输出 namejiujinage=99 namesmithage=99
3.//访问成员方法的语法:this.方法名(参数列表);
public class Test250ThisDetial {public static void main (String[] args) {T t1=new T();t1.f2();} }//访问成员方法的语法:this.方法名(参数列表;class T{String name ="smith";int age=99;public void f1(){System.out.println("f1()方法...");}public void f2(){System.out.println("f2()方法...");//调用本类的f1方法//第一种方式f1();//第二种方式this.f1();//访问成员方法的语法:this.方法名(参数列表);}}
输出:f2()方法...
f1()方法...
f1()方法...4.//访问构造器语法:this(参数列表);注意只能在构造器中使用 访问构造器的语法,this()必须放置再第一条语句
public class Test250ThisDetial {public static void main (String[] args) {T t2=new T();} }//访问构造器语法:this(参数列表);注意只能在构造器中使用 访问构造器的语法,this()必须放置再第一条语句 //this不能再类定义的外部使用,只能再类定义的方法中使用 class T{String name ="smith";int age=99;public T(){//构造器this("jack",100);//第一条System.out.println("T()构造器被调用...");}public T(String name,int age){//构造器System.out.println("T(String name,int age)构造器被调用...");} }
输出
T(String name,int age)构造器被调用...
T()构造器被调用..
韩顺平Java学习笔记P245对象创建流程分析P246this关键字-P250相关推荐
- B站韩顺平java学习笔记(六)--面向对象编程章节
目录 一.类和对象 1.定义及区别 2.对象内存布局 3.属性/成员变量 (1)基本介绍 (2)注意事项和细节说明 (3)访问属性 4.对象 (1)创建对象 (2)对象分配机制 (3)Java创建对 ...
- B站韩顺平java学习笔记(三)--运算符章节
目录 一.算术运算符 1. 表格 2. 练习题: 二. 关系运算符 1. 表格 三.逻辑运算符 1. 表格 2. 练习题 四.赋值运算符 1. 介绍 2.细节特点 五.三元运算符 1. ...
- 韩顺平Java学习笔记_IO流专题
目录 一 文件 1.文件的概念: 文件是保存数据的地方 2.文件流:文件在程序中是以流的形式来操作的 2.1.输入流指数据从数据源(文件)到程序(内存)的路径 2.2.输出流指数据从程序(内存)到数据 ...
- B站韩顺平java学习笔记(十六)-- 多线程基础章节
目录 一 线程介绍 1 线程相关概念 (1)程序 (2)进程 (3)什么是线程 (4)其他相关概念 (5)查看电脑有多少个cpu核 二 线程的使用 1 线程的创建 (1)继承Thread类,重 ...
- B站韩顺平java学习笔记(八)-- 房屋出租系统(项目)章节
目录 一 项目需求说明 1 项目界面 二 房屋租赁程序框架图 三 系统实现 1 完成House类 2 显示主菜单和完成退出软件的功能 3 完成显示房屋列表的功能 4 添加房屋信息的功能 ...
- B站韩顺平java学习笔记(二十三)-- MYSQL基础篇 章节
目录 一 数据库 1 数据库简单原理图 2 使用命令行窗口连接MYSQL数据库 3 MySQL三层结构 4 数据在数据库中的存储方式 5 SQL语句分类 6 创建数据库 7 查看.删除 ...
- B站韩顺平java学习笔记(二十五)-- 正则表达式章节
目录 一 正则表达式入门 1 极速体验正则表达式威力 二 为什么要学正则表达式 三 正则表达式基本介绍 1 介绍 2 正则表达式底层实现
- 韩顺平Java自学笔记 反射
一.反射入门案例 目录 一.反射入门案例 二.反射的机制 1.反射的原理 2.反射相关的类 3.反射的优点和缺点 三.Class类详解 1.Class类的特征 2.Class的常用方法 3.获取Cla ...
- 韩顺平Java学习 泛型
目录 一.泛型的语法 1.传统的方法遍历集合存在的问题 2.使用泛型来解决传统集合添加元素带来的问题 3.泛型使用介绍 4.泛型的使用细节 5.泛型课堂练习 二.自定义泛型 1.自定义泛型类的规范 ...
最新文章
- python复数类型的虚部通过什么表示_python复数,python中复数怎么表示
- Solr配置与简单Demo[转]
- linux命令:返回上一次目录
- jsp:include和%@include%的区别
- PAT甲级1002 A+B for Polynomials:[C++题解]字符串、多项式加法或高精度加法
- args和kwargs以及argv用法
- Spring Security 案例实现和执行流程剖析
- 数字系统设计学习之QuartusII9的安装
- 【Maclean Liu技术分享】拨开Oracle优化器迷雾探究Histogram之秘
- 使用GDAL对HDF数据进行校正
- 文件与文件系统的压缩与打包
- 高中计算机教师学期论文,高中信息技术论文选题
- JAVA基础,输入/输出(I/O)流
- python使用pip安装openxml_Word文件的OpenXML解析(以Python3为例)
- 昔日的百度“太子”为何因经济问题走上穷途
- 互联网商业化中,广告策略到底有哪些?(一)
- 浙江大学计算机考研2020,浙江大学计算机考研经验分享
- 可持续时尚分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
- 快速将彩色照片变成黑白照片(仅适用于jpg格式)
- PythonStudy——列表与字典推导式 List and dictionary derivation