目录
一、this
1.1.this.的使用
1.2.this()的使用
二、static
2.1.static修饰和非static修饰
2.1.1.static修饰
2.1.2.非static修饰
2.2.1.静态方法中调用静态变量
2.2.2.非静态方法中调用静态变量
2.2.3.注意事项
2.3.非静态内容被调用
2.3.1.静态方法中调用非静态变量
2.3.2.非静态方法中调用非静态变量
三、块block
3.1.局部代码块
3.1.1.基础概念
3.1.2.执行条件
3.1.3.作用
3.2.成员代码块(初始化块|构造块)
3.2.1.基础概念
3.2.2.执行条件
3.2.3.作用
3.2.2.初始化代码块的使用
3.3.静态代码块
3.3.1.概念
3.3.2.执行条件
3.3.3.作用
四、debug的使用
4.1.debug的作用
4.2.debug的使用步骤
4.2.1.设置断点
4.2.2.右击dubug运行
4.2.3.调试
4.2.常用命令
一、this 1.1.this.的使用
this.代表的是当前对象的
使用情况1:this.不可省略
1.上面我们自定义了一个带参数的构造器,但是当我们讲形参名和我们的成员变量名一致的时候,就会发生一个问题:因为就近原则,我们此时构造器中的代码所指向的是形参,不管是=号左边的还是右边的,都会指向形参,因此,我们需要告诉构造器,左边的name指的是成员变量,右边的name才是形参的name。
//成员变量中static修饰的成员变量(实例变量)是可以直接通过变量名来进行使用的。 pubilc Persion(String name) { this.name = name;//局部变量name赋值给成员变量name(谁调用了Persion,就是哪个对象的成员变量) }
使用情况2:this.可以省略
上面我们是在构造器中使用的this,这里的this是为了区分成员变量和局部变量,所以不可省略,但是我们在类中编写的其他方法就可以省略,因为我们调用方式是通过对象调用的,我们使用哪个对象调用该方法 ,那么该方法使用的当然就是这个对象中的变量了。但是,我们不建议省略。
1.2.this()的使用 对于构造器而言,如果需要互相调用,就需要使用this()
this()就是我们的默认构造器,当我们在this()中书写参数的时候,我们就可以通过这个this来在一个构造器中调用另外一个构造器。
注意事项:
1.this()必须放在构造器的第一行。
2.this()不能在多个构造器之间相互调用,形成一个环
3.this不能用在static修饰的方法中
成员修饰符,只能修饰成员、不能修饰局部
静态的、共享的、独一份
类字段|类变量|静态变量
static修饰的内容是属于类的,在类第一次被加载的时候被加载,有且只有一份。
实例字段|实例变量|非静态变量
非static修饰的内容是属于对象的,在创建类的实例对象的时候被加载到对象的堆内存空间中且一个类的所有的实例对象都会共享同一份static修饰的内容。
当我们想要调用静态内容的时候,我们可以通过类名来调用,也可以通过对象名来调用。
本质上,两者调用的静态内容在内存空间上是同一份。
直接使用静态变量名,实际上是省略了类名
静态变量存在于类中,而静态方法也存在于类中。当我们在静态方法中调用静态变量时,自己调用自己的东西,肯定是可以直接使用的。
直接使用静态变量名,实际上是省略了类名
非静态方法存在于对象中,静态变量是存在于类中,当我们在非静态方法中调用静态变量,本质上是在通过对象调用来调用类中的内容,但是对象是可以共享到类中的内容的,所以可以省略。
只有调用本类中的内容时,才可以省略类名。
2.3.非静态内容被调用 2.3.1.静态方法中调用非静态变量 需要创建实例,通过对象名来调用非静态变量
非静态变量存在于对象内存中,而静态方法存在于类中,对象可以共享类中的内容,但是类不可以共享对象中的内容。所以,当我们在静态方法中调用非静态变量,本质上是通过类调用对象中的内容,是不可以直接使用的,需要创建实例对象
直接使用非静态变量名,实际上是省略了this.
非静态方法存在于对象内存中,非静态变量也存在于对象内存中,当我们在非静态方法中调用非静态变量时,是调用自身的东西,当然是可以直接调用,省略this的
所谓的块,我们可以简单的理解为一个{},在一个{}中包含的内容就是一个代码块。
3.1.局部代码块 3.1.1.基础概念在一个方法中定义的一个块
3.1.2.执行条件这是在方法中定义的,跟随方法被使用而执行
3.1.3.作用为了确定某些变量的作用范围,且降低内存消耗。
3.2.成员代码块(初始化块|构造块) 3.2.1.基础概念在一个类中方法外定义一个块就被称为初始化块。
3.2.2.执行条件这个初始化块并没有被static修饰,因此,初始化块是跟随new关键字来执行的
3.2.3.作用1.当我们在类中定义了一个初始化块的时候,我们在使用new关键字创建类的实例化对象的时候,就会先执行初始化块中的代码。
分析:
本质上,所谓的初始化代码块在被编译生成class文件的时候就会把代码赋值一份添加到所有的构造器的最前面,因此,就会产生这样的效果。
联想:
我们看到的是初始化代码块中的内容编译后会在构造器中的最前面,但是我们的this()以及super()也需要在构造器的首行,会不会产生冲突?
this():如果,我们最开始的构造器中使用了this(),那么构造块中的内容编译后就不会出现在该构造器中,而是出现在this()所指向的那个构造器中。
super():super()在编译后是不存在的,如果super()和初始化块同时存在,编译后,super()会消失,初始化块中的内容会出现在super()的位置。
执行顺序:super() ----> this() -----> 初始化块
3.2.2.初始化代码块的使用 在知道了初始化代码块的特性之后,我们就可以把所有的构造器中的共有代码放入初始化代码块中执行。
需要注意的是在初始化代码块中的构造器的共有代码不能需要参数,也就是说,我们要保证它放到构造器的最开始的位置执行的时候,不会改变结果。
但是,我们也可以使用构造器相互调用来实现。
所谓的静态代码块就是使用了static修饰符修饰的初始化块
也是在类中方法外定义,但是使用了static修饰符
这种类型的代码块是被static修饰符修饰的,因此,他会在类被加载的时候执行
3.3.3.作用 1.当我们使用到某个类的时候,我们的静态代码块中的代码就会被执行
2.这里地使用,并不是说只有实例化,是只要使用到该类就会被执行(比如,调用类中的方法 )
3.静态代码块中地代码只会执行一次
1.追踪程序的执行流程。
2.定位异常出现异常的位置。
3.观察程序执行过程中变量变化的过程
4.根据追踪程序流程学习第三方框架的源码
断点的位置可以随机选择,但是必须是在错误未出现之前,且距离错误出现的执行环节不多
4.2.2.右击dubug运行 4.2.3.调试 4.2.常用命令Step Over F8:下一步跳过|略过
如果下一步是方法调用,不会跟随方法调用执行,而是直接进行下一步
Step Into F7:下一步进入
如果下一步是自定义的方法调用,则会跟随方法的执行而执行;如果是java本身提供的方法,则不会跟随方法的执行而执行
Force Step Into Alt+shift+F7:下一步强制进入
只要是方法,就会跟随方法的每一步执行而执行
Step Out:上一步跳出
在方法内部,则会直接跳出并回退到方法调用处,此时点击下一步,会调用该方法
Run to Cursor Alt+F9:直接运行到光标所在位置
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)