1 static关键字
1.1 static概述
static
关键字它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。被static修饰的成员由该类的所有实例(对象)共享;
Java中的static关键字用于声明静态变量、静态方法和静态代码块。下面分别介绍一下它们的作用:
- 静态变量(static variable):使用static关键字声明的变量称为静态变量,也叫类变量。静态变量属于类而不是对象,它在类加载时初始化,并且所有对象共享相同的静态变量。静态变量可以直接通过类名访问,无需创建对象。
- 静态方法(static method):使用static关键字声明的方法称为静态方法,也叫类方法。静态方法没有this指针,无法访问实例成员变量和非静态成员方法,只能调用其他静态方法或访问静态变量。可以通过类名直接调用静态方法。
- 静态代码块(static block):使用static关键字定义的代码块称为静态代码块。静态代码块在类加载时被执行,用于对静态变量进行初始化或进行一些静态操作。静态代码块只会执行一次
1.2 定义和使用格式
类变量
当 static
修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作,因为该变量属于类,而不是某个对象。
- 类变量: 使用 static关键字修饰的成员变量。
定义格式:
static 数据类型 变量名;
举例:
static int numberID;
现在想为每一位新来报到的同学编学号(sid),从第一名同学开始,sid为1,以此类推。学号必须是唯一的,连续的,这样以便知道,要分配给下一名新同学的学号是多少。这样我们就需要一个变量,与单独的每一个学生对象无关,而是与整个班级同学数量有关。
所以,我们可以这样定义一个静态变量numberID,代码如下:
public class demo01 {
public static void main(String[] args) {
Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("王五", 25);
Student s4 = new Student("赵六", 26);
s1.show(); // Student : name=张三, age=23, sid=1
s2.show(); // Student : name=李四, age=24, sid=2
s3.show(); // Student : name=王五, age=25, sid=3
s4.show(); // Student : name=赵六, age=26, sid=4
}
}
class Student {
// 存储到底创建了多少个学生
static int numberID = 0;
int sid;
String name;
int age;
public Student() {
// 每次创建一个学生,id都自增1
numberID++;
sid=numberID;
}
public Student(String name, int age) {
// 每次创建一个学生,id都自增1
numberID++;
sid=numberID;
this.name = name;
this.age = age;
}
public void show() {
System.out.println("sid: " + sid + "-name: " + name + "-age: " + age);
}
}
静态方法
当 static
修饰成员方法时,该方法称为类方法。静态方法在声明中有 static ,建议使用类名来调用,而不需要创建类的对象。调用方式非常简单。
- 类方法:使用 static关键字修饰的成员方法,习惯称为静态方法。
定义格式:
修饰符 static 返回值类型 方法名 (参数列表) {
// 执行语句
}
举例:在Student类中定义静态方法
public static void showNum() {
System.out.println("numberID:" + numberID);
}
- 静态方法调用的注意事项:
- 静态方法可以直接访问类变量(被static修饰的变量)和静态方法。(静态方法能够访问静态资源)
- 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。
- 静态方法中,不能使用this关键字。
tips:静态方法只能访问静态成员。
调用格式
被static修饰的成员可以并且建议通过类名直接访问。虽然也可以通过对象名访问静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息。
格式:
// 访问类变量
类名.类变量名;
// 调用静态方法
类名.静态方法名(参数);
调用演示,代码如下:
public static void main(String[] args) {
// 访问类变量
System.out.println(Student.numberID);
// 调用静态方法
Student.showNum();
}
2 final关键字
2.1 final介绍
fianl是Java中的一个关键字,中文含义是"最终的",fianl可以修饰类、方法、变量等;
在Java中,final关键字可以用来修饰类、方法和变量,具有不同的含义和用法。
- final类:使用final关键字修饰的类称为final类。final类是最终的类,不能被继承。通常情况下,final类是为了安全和性能考虑而设计的,例如Java标准库中的String类就是一个final类。
- final方法:使用final关键字修饰的方法称为final方法。final方法不能被子类重写或覆盖。通常情况下,final方法是为了避免子类对其进行修改,保证方法的行为一致性。
- final变量:使用final关键字修饰的变量称为final变量。final变量是一个常量,只能被赋值一次,赋值后不能再改变。通常情况下,final变量用大写字母命名,用于表示常量或不可变的值。
使用final关键字可以带来以下好处:
- 增加安全性:final类、方法和变量可以避免被修改或继承,保护代码的安全性。
- 提高性能:对于final变量和方法,JVM可以进行优化,提高程序的执行效率。
- 提供清晰的语义:final关键字可以明确表示某个类、方法或变量的用途和行为,提高代码的可读性和可理解性。
2.2 fianl关键字的特点
修饰类:
- final修饰的类不能被继承。提高安全性,提高程序的可读性;
final class A{
}
class B extends A{ // 错误,被final修饰的类不能被继承。
}
修饰方法:
- final修饰的方法不能被子类重写
class A{
public final void method(){
System.out.println("hello");
}
}
class B extends A{
public void method(){ // 错误,被final修饰的方法不能被重写
System.out.println("Hi");
}
}
修饰变量:
-
final修饰的变量(成员变量或局部变量)只能被赋值一次;因此被final修饰的变量我们称为常量,通常全大写命名;
class A{ private final double PI = 3.14; // 声明常量 public void print(){ PI = 3.15; // 错误,被final修饰的变量是常量(不可更改值) } }
注意事项:
需要注意的是,final关键字并不会使对象或变量本身不可变,它只是确保引用不能改变。如果引用的对象是可变的,那么对象的状态仍然可以改变。若要实现不可变对象,可以通过其他方式,如使用不可变类或不可变字段等。