【javase复习】## day3 构造函数的深入认识、this、static ##

构造函数的深入认识

复习到构造函数,之前的看的也算蛮详细,但是这次复习看视频看到一些之前没有了解到的东西,比如构造代码块反编译的运用。这里完完全全的写一下构造函数的认知。




首先知道构造函数和普通函数(方法)的区别

1 构造函数没有返回值
2 构造函数的函数名必须与类名一致
3 重点:构造函数不是手动调用,而是创建对象的时候,jvm主动调用

疑问: 没有定义构造函数,那还有构造函数吗?

当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。

这里写图片描述

javap 是jdk自带的反编译工具,将class文件反编译出来,但是不完全是java代码文件,还有一些看不懂的东西。



一个类创建的时候,他的属性由三部分组成,
1 自定义的成员变量
2 构造函数
3 构造代码块

与构造函数区别**
1:构造代码块和构造函数的区别,构造代码块是给所有对象进行统一初始化, 构造函数给对应的对象初始化。
2:构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。

其实就是在类中,方法外,用{}括起来。

注意的难点,在反编译后我们发现:

jvm是将这三部分都糅合进构造函数里面。 并且自定义变量是先定义,然后在实际的构造函数中赋值,另外构造代码块也是优于构造函数的代码先运行。
构造代码块和自定义成员变量赋值的顺序就是代码的前后自然顺序

所以实际的构造函数中其实是最后执行构造函数部分,而按自然顺序对成员变量进行赋值和执行构造代码块。




代码块的类别:
1. 构造代码块。
2. 局部代码块. 大括号位于方法之内。 作用:缩短局部 变量 的生命周期,节省一点点内存。
3. 静态代码块 static // class文件加载到内存的时候就执行



This关键字

本质上是为了构造函数的互相调用。

this 和指向对象的变量一样, 是指向堆内存中的对象的地址

this 是所在函数所属对象的引用

Student() {

}

Student(String name) {
    this();
    this.name = name;
}

Student(String name, String gender, int age) {
    this(name);
    System.out.println(this); // Student@c17164

    this.gender = gender;
    this.age = age;
}

注意:
1、this 只能在非静态函数中使用( 显然,因为static只要加载class文件就可以用)
而this是需要借助对象的引用的,这时如果没有对象就不存在this这个东西,所以显然不能用。实际上,所有的非静态函数的形参列表中都有this super两个隐含的形参,其中this指向调用该函数的对象,super指向该对象中所维护的父类的成员的入口

2、 构造函数相互调用,this必须放在构造函数的第一句

3、 顺带解决方法中的形参和成员变量同名问题

this关键字要注意事项:
1. 存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是“就近原则”的机制访问的。)
2. 如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面添加this关键字。



这里写图片描述

方法运行的时候,jvm在栈内存开辟属于方法的空间,方法在这块内存中运行。如果需要的变量在这个方法里面有同名的的局部变量,则由于java的就近原则使用该局部变量,如果没有同名局部变量,就用堆内存中的成员变量,因为编译器会自动的在这里加一个this.






static

一般有三个部分

①静态变量
②静态函数
③静态代码块  static{  xxx}

如果把一个类公共的成员变量属性值都放在堆内存中,即维护了多个相同的成员属性,会浪费内存,所以要用static把公共的成员变量变成静态,放在公共数据区,(也是堆) ,即可以减少相同数据的副本个数。
这里写图片描述

静态的成员变量和方法随着类文件的加载直接进入内存,首先执行静态代码块,并且只在加载类文件的时候执行一次,之后可以直接用 类名调用,而不需要调用对象。随着类文件的消失而消失
因为这些数据在共享区(方法区)



这里写图片描述

分析上面的Demo2的执行情况:

1、 Demo2的class文件加载进方法区,并且执行静态代码块,初始化类
方法区主要维护三类数据
①类代码,包括属性和函数的代码,静态函数
②static变量
③常量池
这些数据直接加载进入内存,不需要创建对象就已经存在,所以之后可以直接通过类名访问

2、 虚拟机找到main方法的入口,在栈内存开辟一块内存空间让main方法开始运行。 所以静态代码块是优先于main方法执行的

3、main方法运行,发现需要Student类, 加载Student类文件加载进方法区

4、 在栈内存开辟一块空间供sleep方法运行

5、 在栈内存的main方法运行的内存块里声明一个Stundent类型局部变量s。在堆内存创建一个Student对象并赋值,将地址赋予s变量。

6、堆和栈建立联系。

静态函数:
①用static修饰,可以访问静态成员,
②因为没有对象 ,不能直接访问非静态成员但是如果在静态函数里面创建了对象,也可以再访问这个对象的非静态成员。
③不能出现this或者super关键字,因为可能没有一个对象是函数调用者。

一般用于工具类方法, 比如Arrays类,里面都是静态方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值