6.java-Static和final关键字

Static

static表示 “静态的” ,它也是一种修饰符,可以修饰属性、方法、代码块和内部类

static修饰符具有如下特性:

  • 被static修饰的属性(成员变量)称为静态变量,也叫做类变量;
  • 被static修饰的常量称为静态常量;
  • 被static修饰的方法称为静态方法,也叫做类方法;
  • 被static修饰的代码块叫做静态代码块;
  • 被static修饰符的内部类,叫做静态内部类。

静态变量、静态方法、静态常量统称为类的静态成员,归整个类所有,不属于某个单一的对象,所以,静态成员不需要通过对象来进行访问,而是直接通过类来访问。我们调用静态成员的语法格式如下:类名.静态成员

注意事项
  • static关键词修饰的成员变量和方法都属于类,不属于某个对象;
  • 普通变量和方法属于某个对象,每个对象都有自己的变量和方法,彼此之间是隔离的;
  • 静态方法不能调用非静态的变量和非静态的方法,否则编译时就会报错。

类变量应用场景

在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。

规律

对于成员变量,要通过 “对象.变量名” 的形式调用;

成员变量属于某个对象,属于对象自己的“私有财产”,不能被整个类共享,对象之间不能共享这些成员变量;

静态变量和静态常量属于整个类 ,可以被类的所有对象共享,属于公共财产 ;

在同一个类中,我们可以在静态方法中 直接调用静态成员,也可以通过 “类名.静态成员”,或 “对象.静态成员” 的方式进行调用;

虽然语法支持通过“对象.静态变量”或“对象.静态常量”的方式进行调用,但不建议这样做;

对于静态成员,一般都是要通过 ”类名.静态成员” 的方式调用,否则在编译时会有“静态属性应该通过静态方式来访问”的提示;

静态方法

被static修饰的方法叫做类方法,也叫做静态方法。

类方法最常见的应用场景是做工具类,工具类中的方法都是一些类方法, 每个方法都是用来完成一个功能的, 工具类是给开发人员共同使用的。使用类方法来设计工具类提高了代码复用;调用方便,提高了开发效率。工具类没有创建对象的需求,建议将工具类的构造器进行私有。

静态方法具有以下特性:

  • 静态方法中只能调用静态成员和静态方法;(静态只能访问静态,不能直接访问非静态
    非静态既可以访问静态,也可以访问非静态
    **原因:**静态的内容在内存中出现的更早,随着类的加载而存在
    非静态的内容在内存中出现的更晚,因为早出现的不能使用晚出现的,
    所以静态调用非静态编译无法通过
  • 静态方法中不能使用this和super关键字;
  • 抽象方法不能使用static进行修饰;
  • 静态方法不能被重写,但可以被继承!

对于静态方法,我们可以通过如下格式调用:类名.方法名

类方法与实例方法的区别
  • 类方法可以直接通过“类名.方法名”的形式调用;
  • 类方法中不能使用this和super关键字;
  • 类方法中不能直接访问非静态的成员;(通过对象调用)
  • 实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。
代码块

由static修饰的代码块称为静态代码块,每个类中可以有多个静态代码块,每个静态代码块都只会在类加载时执行一次。对那些只需要进行一次操作的初始化代码,就可以放在静态代码块中执行

静态代码块的特性
  • 静态代码块类似于是一个方法,但它不可以在方法中调用,也不能存在于任何方法体中;
  • 静态代码块可以写在类中的任何地方,一个类中也可以有多个静态代码块;
  • 静态代码块在类加载时执行;
  • 静态代码块优先于动态代码块执行;
  • 如果类中包含多个静态代码块,则JVM虚拟机会按它们在类中出现的先后顺序依次执行,每个静态代码块只会被执行一次;
  • 静态代码块与静态方法一样,不能直接访问类的实例变量和实例方法,需要通过类的实例对象来访问。

静态代码块,在类被加载时就会自动调用,且只会被调用一次。

非静态代码块,在对象被创建时自动调用,每次创建对象时都会执行。

而构造方法,每创建一个对象就会执行一次。

(代码块一般用于初始化)

单例设计模式

确保一个类只有一个对象

饿汉式单例(拿对象时,对象已经创建好了)写法:

1.把类的构造器私有

2.定义一个类变量记住类的一个对象

3.定义一个类方法,返回对象

public class A{
	//定义一个类变量记住类的一个对象
	private static A a = new A();
	//私有构造器
	private A(){
	}
	//定义一个类方法返回对象
	public static A getObject(){
		return a;
	}
}

懒汉式单例(拿对象时,才开始创建对象)写法:

1.把类的构造器私有

2.定义一个类变量用于存储对象

3.提供一个类方法,保证返回的是同一个对象

pubic class B(){
	//定义一个类变量用于存储这个类的一个对象
	private static B b;
	//把类的构造器私有
	private B(){
	}
	//定义一个类方法,这个方法要保证第一次调用时才创建一个对象,后面调用时都会返回这同一个对象
	public static B getInstance(){
		if(b == null){
			b = new B();
		}
		return b;
	}
}

6.java-Static和final关键字_第1张图片

protected修饰的方法是在子类里面可以访问,不是子类的对象可以访问(外部创建的对象)

静态内部类

我们可以在一个类的内部定义另一个类,也就是A类里面可以嵌套一个B类,这个内部的B类就叫做内部类。而内部类根据是否带有static关键词,可以分为静态内部类和非静态内部类。

特点:

  • 静态内部类访问外部类的成员变量时,需要先创建外部类对象;
  • 非静态内部类可以直接访问使用外部类的成员变量,如同使用本类中的变量;
  • 所有的内部类访问外部类的静态变量时,可以直接通过"外部类.静态变量"的形式访问。

final关键字

final的介绍
  • final表示 “最终的、不可改变的、完结的”

  • final关键字,可以修饰方法,类,变量

  • 在使用final声明变量时,一般会要求变量名的单词全部大写,且变量名由多个单词组成时,多个单词之间用下划线“_”分隔开,比如“SCHOOL_NAME”。

final关键字的特点
  • 方法: finaL修饰的方法, 不能被重写

被final修饰的方法称为常量方法,该方法可以被重载,也可以被子类继承,但却不能被重写

  • 类: finaL修饰的类,不能被继承
  • 变量: finaL修饰的变量, 只能赋值一 次,不可改变

基本数据类型变量:数据值不可改变

引用数据类型变量:地址值不可改变**(但这个对象本身的成员和数据是完全可以发生改变的。)**

常量

**定义:**使用了static final修饰的成员变量就被称为常量;使用了静态最终修饰的成员变量就被称为常量;

**作用:**通常用于记录系统的配置信息。作用:通常用于记录系统的配置信息.

使用常量记录系统配置信息的优势、执行原理

●代码可读性更好,可维护性也更好。代码可读性更好,可维护性也更好.
●程序编译后,常量会被“宏替换" :出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是-样的.

饰的成员变量就被称为常量;

**作用:**通常用于记录系统的配置信息。作用:通常用于记录系统的配置信息.

使用常量记录系统配置信息的优势、执行原理

●代码可读性更好,可维护性也更好。代码可读性更好,可维护性也更好.
●程序编译后,常量会被“宏替换" :出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是-样的.

你可能感兴趣的:(java,开发语言)