1.final的用法和特点
final:的英文意思是最终的,在Java中也可以理解为:最终的不可变的。
final是一个修饰符, 可以用来修饰类、方法、成员变量、局部变量。
特点:
-
类:被修饰的类,不能被继承。
-
方法:被修饰的方法,不能被重写。
-
变量:被修饰的变量,不能被重新赋值
1.1基础使用创建方式如下:
/*
(1)final修饰变量
变量:被修饰的变量,不能被重新赋值,只能被赋值一次,再次赋值会报错。
*/
final int a=1;
a=2;//此时会报错
/*
(2)static修饰类
类:被修饰的类,不能被继承。
*/
final class 类名 {
}
/*
(3)final修饰方法:被修饰的方法,不能被重写。
*/
修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
1.2 修饰变量
1.2.1局部变量——基本类型
基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。
使用如下:
public class FinalTest1 {
public static void main(String[] args) {
// 声明变量,使用final修饰
final int a;
// 第一次赋值
a = 10;
// 第二次赋值
a = 20; // 报错,不可重新赋值
// 声明变量,直接赋值,使用final修饰
final int b = 10;
// 第二次赋值
b = 20; // 报错,不可重新赋值
}
}
1.3.2局部变量——引用类型
引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下:
public class FinalTest2 {
public static void main(String[] args) {
// 创建 User 对象
final User u = new User();
// 创建 另一个 User对象
u = new User(); // 报错,指向了新的对象,地址值改变。
// 调用setName方法
u.setName("张三"); // 可以修改
}
}
1.3.3成员变量
被final修饰的常量名称,一般都有书写规范,所有字母都大写。
public class User {
final String USERNAME = "张三";
//被final修饰的常量名称,一般都有书写规范,所有字母都大写。
private int age;
public User(String username, int age) {
this.USERNAME = username;
this.age = age;
}
2.static的特点及使用
2.1static的特点
它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有 static ,可以使用类名来调用,而不需要创建类的对象。调用方式非常简单。 因此我们平常所用的工具类都是通过此方式来实现的。
调用格式:
// 访问类变量
类名.类变量名;
// 调用静态方法
类名.静态方法名(参数);
代码演示:
学生类:
public class Student {
String name;
int age;
static String class_banji="一年级3班";
public static void show(){
System.out.println("我是学生类中的静态方法");
}
}
测试类;
//测试类
public class Test {
public static void main(String[] args) {
//在不创建student实例的情况下,调用类中的静态变量
System.out.println(Student.class_banji);
//在不创建student实例的情况下,可以直接调用类中的静态方法
Student.show();
}
}
static的知识点小结:
-
静态变量:静态变量是在类加载时创建的,它的生命周期和类一样长。静态变量可以通过类名直接访问,而不需要创建对象。静态变量被所有类的对象共享,因此如果一个对象修改了静态变量的值,那么这个值会被所有对象共享。
-
静态方法:静态方法也是在类加载时创建的,它不需要对象就可以被调用。静态方法只能访问静态变量和其他静态方法,它不能访问非静态变量和非静态方法。静态方法通常用于实用方法,例如Math类中的静态方法。
-
静态块:静态块是在类加载时执行的,它可以用来初始化静态变量。静态块只会执行一次,无论创建多少个对象。
- 。。。
被static修饰的内容:
-
是随着类的加载而加载的,且只加载一次。
-
存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。
-
它优先于对象存在,所以,可以被所有对象共享。
在Java程序运行时,类的静态成员(被static修饰,包括静态变量和静态方法)会在类加载时被初始化,并且会被存储在方法区中的静态存储区域中。
当程序第一次使用某个类时,JVM会加载该类的字节码文件,并将该类的静态成员加载到内存中。这个过程包括以下几个步骤:
加载:将类的字节码文件加载到内存中。
验证:验证字节码文件的正确性和安全性。
准备:为静态变量分配内存,并设置默认值。
解析:将符号引用转换为直接引用。
初始化:执行静态变量赋值和静态代码块中的代码。
在这个过程中,静态变量会被赋予默认值,比如int类型的默认值为0,boolean类型的默认值为false。如果在静态变量声明时已经赋值,那么会使用该赋值作为默认值。
需要注意的是,静态成员只会被加载一次,而且是在类加载时被加载,而不是在创建对象时被加载。因此,无论创建多少个对象,静态成员只会被加载一次。
总的来说,使用了static关键字的静态成员会在类加载时被初始化,并且会被存储在方法区中的静态存储区域中。这个过程是在程序运行时进行的,而不是在编译时进行的。
可以简单理解为static修饰的静态成员在程序运行时优先加载程序中,且只加载一次。
注意:
-
静态方法可以直接访问类变量和静态方法。
-
静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。
-
静态方法中,不能使用this关键字。