欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 JavaSE第十一章 this 与 static

程序员文章站 2022-06-28 18:48:55
Java自我学习路线一、this1. this概述2. this 不能出现在带有 static 的方法当中3. this 可以出现在实例方法当中4. this使用在构造方法中二、static1. static概述2. 静态变量3.静态代码块4. 静态方法一、this1. this概述this 可以看做一个变量,它是一个引用,存储在 Java 虚拟机堆内存的对象内部,this 这个引用保存了当前对象的内存地址指向自身,任何一个堆内存的 Java 对象都有一个 this语法格式:this....

一、this

1. this 概述

  • this 是一个关键字,全部小写,可以看做一个变量,它是一个引用,存储在 Java 虚拟机堆内存的对象内部,this 这个引用保存了当前对象的内存地址指向自身,任何一个堆内存的 Java 对象都有一个 this,严格意义上来说,this 代表的就是“当前对象”
  • 语法格式:
this.    //实例方法,代表当前对象
this(实际参数列表)    //构造方法(通过当前的构造方法去调用另一个本类的构造方法)
  • 语法说明:
    如:this.name 等号左边表示实例变量 name,等号右边的 name 是局部变量 name,即区*部变量与实例变量
    this() 使用在构造方法第一行,且只能出现在第一行,通过当前构造方法调用本类当中其它的构造方法,其目的是为了代码复用,即在同一个类中无参数构造方法中使用“this(实际参数列表)”来调用有参数的构造方法
  • this 什么时候可以省略,什么时候不能省略?
    this 大部分情况下可以省略,省略的话,还是默认访问“当前对象”的属性;在实例方法或构造方法中为了区*部变量和实例变量,这种情况下 this. 不能省略

2. this 的应用

  • this 使用在实例方法中,谁调用这个实例方法,this 就是谁,因为实例方法在执行的时候由对象调用与触发,而 this 代表“当前对象”,即指向当前正在执行这个动作的对象
  • this 使用在构造方法中,通过当前的构造方法去调用另一个本类的构造方法,且只能出现在第一行,其目的是为了代码复用,即在同一个类中无参数构造方法中使用“this(实际参数列表)”来调用有参数的构造方法
  • this 不能使用在静态方法中
    因为 static 在调用的时候是不需要创建对象的,直接采用“类名”的方式调用,即不需要“当前对象”参与,所以 static 的方法中不能使用 this,因为 this 代表的就是“当前对象”
  • 引:只要负责调用的方法 a 和被调用的方法 b 在同一个类中,this. 可以省略,类名. 可以省略

二、static

1. static 概述

  • static 是Java语言中的一个关键字,也是一个修饰符,用于修饰成员,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块
  • 在Java中凡是使用 static 关键字修饰的都是类相关的,不需要创建对象,直接通过“类名.”即可访问,即使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关
  • 变量根据声明的位置进行划分为:局部变量、成员变量
    成员变量可以划分为:实例变量、静态变量
    链接:Java 变量严格分类及汇总
class Test{
	//以下实例的,都是对象相关的,访问时采用“引用.”的方式访问,需要先new对象
	//可能出现空指针异常
	//成员变量中的实例变量
	int a;
	//实例方法
	public void m2() {
		//局部变量
		int n1 = 1;
	}
	 
	//以下静态的,都是类相关的,访问时采用“类名.”的方式访问,不需要new对象
	//没有空指针异常
	//成员变量中的静态变量
	static int b;
	//静态方法
	public static void m1() {
		//局部变量
		int n2 = 2;
	}
}
  • static 关键字特点
    所有的 static 关键字修饰的都是类相关的,类级别的;
    static 优先于对象存在,因为static的成员随着类的加载就已经存在了;
    static 被所有对象共享
    修饰的属性叫类(静态)属性(变量);
    修饰的方法叫类方法(静态方法);
    修饰的属性和方法不使用对象调用,而直接使用”类名.“调用;
    修饰的属性和方法只初始化一次;

2. 静态变量

  • 什么时候声明静态变量:
    当一个类的所有对象的某个“属性值”不会随着对象的改变而变化的时候(某个成员变量是被所有对象共享的),节省内存开销
  • 静态变量在类加载的时候初始化,位于方法区当中的静态区,属于类级别的,不需要创建对象,直接通过“类名.”来访问
  • 可以使用“引用”访问静态变量吗
    静态变量也可以使用“引用”去访问,但不建议这样做,因为在实际执行过程中,“引用”所指向的对象并没有参与,如果是”空引用“,程序不会发生空指针异常;我们常使用“引用”来访问实例变量,即创建好实例对象后,通过 引用.实例变量名 的方式对实例变量进行访问,如果是”空引用“,程序会发生空指针异常
    所以,可以联想之前的知识,只有“空引用”访问“实例”相关的,才会出现空指针异常
    链接:对象的创建和使用
  • 静态变量与非静态变量的区别:
    静态变量被类中所有的对象所共享随着类的定义而被分配和装载入内存中,它将变量值存储在一个公共的内存地址,因为地址公共,所以任何一个对象对静态数据成员的修改,都会影响其它对象
    非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响

3.静态代码块

  • 语法格式:
static{
        Java 语句;
        Java 语句;
        ......
}
  • 静态代码块在类加载时执行,并且只执行一次,所以如果我们要在类加载的时候解析某个文件,并且要求该文件只解析一次,那么此时就可以把解析该文件的代码写到静态代码块当中(可以通过 Class.forName(“classPath”) 的方式唤醒代码的 static 代码块,但是也执行一次)
  • 一个类当中可以编写多个静态代码块;
  • 静态代码块遵循自上而下的顺序依次执行
  • 静态代码块当中的代码在 main 方法执行之前执行,这是因为静态代码块在类加载时执行,并且只执行一次
  • 附:大部分情况下类体当中的代码没有顺序要求,方法体当中的代码必须遵守自上而下的顺序依次逐行执行;静态变量以及静态代码块都是在类加载时执行

3.1 实例代码块

{
	Java语句;
	Java语句;
	......
}
  • 实例代码块在类加载时没有执行
  • 只要是构造方法执行,必然在构造方法执行之前自动执行实例代码块(SUN提供的对象构建时机)

3.2 代码执行顺序

  • 执行顺序:(优先级从高到低)静态代码块>main方法>实例代码块>构造方法
    其中静态代码块只执行一次,实例代码块在每次创建对象都执行

4. 静态方法

  • 什么时候定义为实例方法?什么时候定义为静态方法?
    类=属性+方法;属性描述的是状态,方法描述的是行为动作;如果说该行为必须由对象去触发,那么该方法定义为实例方法(如果方法中直接访问了实例变量,该方法必须是实例方法)
  • 静态方法与非静态方法:
    静态方法只能访问静态数据成员;非静态方法既可以访问静态数据成员,又可以访问非静态数据成员
    静态方法只能访问静态数据方法;非静态方法既可以访问静态方法,又可以访问非静态方法
    原因:
    因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象的内存中才有这个方法的代码段
  • 只要是方法,不管是静态方法、实例方法、构造方法,它们在运行的时候都需要压栈,方法的代码片段放在方法区,但是方法执行过程中需要的内存在栈中
  • 工具类中的方法一般都是静态的(不需要new对象,直接采用类名.调用)

本文地址:https://blog.csdn.net/LvJzzZ/article/details/107342348