【学习笔记】--final、static、访问控制符

it2026-06-13  1

静态字段

在一个class中定义的字段,我们称之为实例字段。实例字段的特点是,每个实例都有其独立的字段,各个实例的同名字段互不影响。

还有一种字段,是用static修饰的静态字段:static field。

实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。例子如下:

class Person { public String name; public int age; // 定义静态字段number: public static int number; } //static field public class Main { public static void main(String[] args) { Person ming = new Person("Xiao Ming", 12); Person hong = new Person("Xiao Hong", 15); ming.number = 88; System.out.println(hong.number);/*运行结果为88。对于静态字段,无论修改哪个实例的静态字段,所有实例的 静态字段都被修改了,原因是静态字段并不属于实例*/ hong.number = 99; System.out.println(ming.number);//运行结果我99 } } class Person { public String name; public int age; public static int number; public Person(String name, int age) { this.name = name; this.age = age; } }

运行结果为88 99

对于静态字段,无论修改哪个实力的静态字段,所有实例(对象)的静态字段都被修改了,原因是静态字段不属于某个实例的,是可共享的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SzxEiK5k-1603363177696)(C:\Users\Administrator.USER-20190611ED\AppData\Roaming\Typora\typora-user-images\image-20201009165447730.png)]

虽然实例(Ming.number)可以访问静态字段,但是他们指向的都是Person class的静态字段。所以,所有实例共享一个静态字段。

因此,不推荐 实例变量.静态字段去访问静态字段,因为在java程序中,实例对象并没有静态字段。在代码中,实例对象能访问静态字段只是因为编辑器可以根据实例类型自动转换为 类名.静态字段 来访问今天对象。

可以用类名来访问静态字段。可以吧静态字段理解为描述class本身的字段(非实例字段)。对于上面访问静态字段的代码,更好的写法是:

Person.number = 99; System.out.println(Person.number);

接口的静态字段

因为interfere是一个纯抽象类,所以它不能定义实例字段,但是可以定义静态字段的,并且静态字段必须为final类型:

public interface Person { public static final int MALE = 1; public static final int FEMALE = 2; }

实际上,因为interface的字段只能是public static final类型,所以我们可以吧 public static final修饰符都去掉,简写如下:

public interface Person { // 编译器会自动加上public statc final: int MALE = 1; int FEMALE = 2; }

编译器会自动把该字段变为public static final类型。

静态方法

有静态字段,就有静态方法。用static修饰的方法称为静态方法。

调用实力方法必须通过一个实例变量,而静态方法则只需通过类名就可以调用,这样就可以省去实例化语句。静态方法类似其他编程语言的函数。例如:

//static method public class Main { public static void main(String[] args) { Person.setNumber(99); System.out.println(Person.number); } } class Person { public static int number; public static void setNumber(int value) { number = value; } }

因为*静态方法属于class而不属于某个实例,因此静态方法内部无法访问this变量,也无法访问实例字段,只能访问静态字段*。

通过实例变量也可以调用静态方法,但这只是编译器自动帮我们把实例改写成类名而已。

通常情况下,通过实例变量访问静态字段和静态方法,会得到一个编译警告。

静态方法经常用于工具类,例如:

Arrays.sort()Math.random()

静态方法也经常用于辅助方法。注意到java程序的入口main()也是静态方法。

静态方法中无法直接调用本类中其他实例方法(非构造),但是可以通过实例对象去调用。

**实例方法中可以;直接调用本类的静态方法。

final

经final修饰方法,类时无法被继承经final修饰的成员变量时,不可被修改值

java中的final类

包装类(8种)系统类:System Class数学类

经static修饰的方法里边无法通过super调用父类的属性和方法。

访问控制符

最新回复(0)