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的hashCode1500056228

  • P250this关键字细节

  • 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相关推荐

  1. B站韩顺平java学习笔记(六)--面向对象编程章节

    目录 一.类和对象 1.定义及区别 2.对象内存布局 3.属性/成员变量 (1)基本介绍 (2)注意事项和细节说明 (3)访问属性 4.对象 (1)创建对象 (2)对象分配机制 ​(3)Java创建对 ...

  2. B站韩顺平java学习笔记(三)--运算符章节

    目录 一.算术运算符 1.  表格 2.  练习题: 二. 关系运算符 1.  表格 三.逻辑运算符 1.  表格 2.  练习题 四.赋值运算符 1.  介绍 2.细节特点 五.三元运算符 1.  ...

  3. 韩顺平Java学习笔记_IO流专题

    目录 一 文件 1.文件的概念: 文件是保存数据的地方 2.文件流:文件在程序中是以流的形式来操作的 2.1.输入流指数据从数据源(文件)到程序(内存)的路径 2.2.输出流指数据从程序(内存)到数据 ...

  4. B站韩顺平java学习笔记(十六)-- 多线程基础章节

    目录 一  线程介绍 1  线程相关概念 (1)程序 (2)进程 (3)什么是线程 (4)其他相关概念 (5)查看电脑有多少个cpu核 二  线程的使用 1  线程的创建 (1)继承Thread类,重 ...

  5. B站韩顺平java学习笔记(八)-- 房屋出租系统(项目)章节

    目录 一 项目需求说明 1 项目界面 二  房屋租赁程序框架图 ​三  系统实现 1  完成House类 2  显示主菜单和完成退出软件的功能 3  完成显示房屋列表的功能 4  添加房屋信息的功能 ...

  6. B站韩顺平java学习笔记(二十三)-- MYSQL基础篇 章节

    目录 一  数据库 1  数据库简单原理图 2  使用命令行窗口连接MYSQL数据库 3  MySQL三层结构 4  数据在数据库中的存储方式 5  SQL语句分类 6  创建数据库 7  查看.删除 ...

  7. B站韩顺平java学习笔记(二十五)-- 正则表达式章节

    目录 一  正则表达式入门 1  极速体验正则表达式威力 二  为什么要学正则表达式 三  正则表达式基本介绍 1  介绍 2  正则表达式底层实现

  8. 韩顺平Java自学笔记 反射

    一.反射入门案例 目录 一.反射入门案例 二.反射的机制 1.反射的原理 2.反射相关的类 3.反射的优点和缺点 三.Class类详解 1.Class类的特征 2.Class的常用方法 3.获取Cla ...

  9. 韩顺平Java学习 泛型

    目录 一.泛型的语法 1.传统的方法遍历集合存在的问题 2.使用泛型来解决传统集合添加元素带来的问题 3.泛型使用介绍 4.泛型的使用细节 5.泛型课堂练习 二.自定义泛型 1.自定义泛型类的规范 ​ ...

最新文章

  1. python复数类型的虚部通过什么表示_python复数,python中复数怎么表示
  2. Solr配置与简单Demo[转]
  3. linux命令:返回上一次目录
  4. jsp:include和%@include%的区别
  5. PAT甲级1002 A+B for Polynomials:[C++题解]字符串、多项式加法或高精度加法
  6. args和kwargs以及argv用法
  7. Spring Security 案例实现和执行流程剖析
  8. 数字系统设计学习之QuartusII9的安装
  9. 【Maclean Liu技术分享】拨开Oracle优化器迷雾探究Histogram之秘
  10. 使用GDAL对HDF数据进行校正
  11. 文件与文件系统的压缩与打包
  12. 高中计算机教师学期论文,高中信息技术论文选题
  13. JAVA基础,输入/输出(I/O)流
  14. python使用pip安装openxml_Word文件的OpenXML解析(以Python3为例)
  15. 昔日的百度“太子”为何因经济问题走上穷途
  16. 互联网商业化中,广告策略到底有哪些?(一)
  17. 浙江大学计算机考研2020,浙江大学计算机考研经验分享
  18. 可持续时尚分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
  19. 快速将彩色照片变成黑白照片(仅适用于jpg格式)
  20. PythonStudy——列表与字典推导式 List and dictionary derivation

热门文章

  1. 隆昌二中2021高考成绩查询,寻根与创新的隆昌二中①|让每个学生享受适合自己的教育...
  2. 苹果 M2 芯片要来了?
  3. MVC5的AuthorizeAttribute详解
  4. 【实现一套爬虫数据抓取平台】[0-0] 序篇
  5. IP地址如何用十六进制表示
  6. js——promise用法
  7. Python Numpy基础教程
  8. java输出特殊符号
  9. Hive 压缩和存储
  10. 又一家网盘,宣布凉凉了!