1.静态字段
1.1定义:用static修饰的字段称为静态字段
- 普通字段在每个实例中都有自己的一个独立的空间
- 静态字段只有1个共享空间,所有实例都共享该字段。
public class Person{
public String name;
public int age;
public static int number = 100;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Hello{
public static void main(String[] args){
Person ming = new Person("小明", 12);
Person hong = new Person("小红", 18);
}
}
public class Person{
public String name;
public int age;
public static int number = 100;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Hello{
public static void main(String[] args){
Person ming = new Person("小明", 12);
Person hong = new Person("小红", 18);
}
}
ming和hong都有各自的name和age,但number都指向了Person类的number。即所有实例共享一个静态字段。
1.2静态字段的属性
- 所有实例共享一个静态字段
- 不推荐用实例变量访问静态字段
- 推荐用类名访问静态字段
- 可以把静态字段理解为描述class本身的字段(非实例字段)
Person.java
public class Person {
public String name;
public int age;
public static int number = 100;
public Person(String name){
this.name = name;
number++;
}
public static int getNumber(){
return number;
}
}
public class Person {
public String name;
public int age;
public static int number = 100;
public Person(String name){
this.name = name;
number++;
}
public static int getNumber(){
return number;
}
}
Hello.java
public class Hello {
public static void main(String[] args){
Person ming = new Person("小明");
Person hong = new Person("小红");
/*
所有的实例共享一个静态字段,可以通过实例变量访问静态字段,但不推荐。
Java中实例对象并没有静态字段,实例对象能够访问静态字段只是编译器能够根据类型实例自动转换为类名来访问静态字段。
*/
ming.number = 99;
System.out.println(ming.number);
//推荐用类名访问静态字段
Person.number = 88;
System.out.println(Person.number);
}
}
public class Hello {
public static void main(String[] args){
Person ming = new Person("小明");
Person hong = new Person("小红");
/*
所有的实例共享一个静态字段,可以通过实例变量访问静态字段,但不推荐。
Java中实例对象并没有静态字段,实例对象能够访问静态字段只是编译器能够根据类型实例自动转换为类名来访问静态字段。
*/
ming.number = 99;
System.out.println(ming.number);
//推荐用类名访问静态字段
Person.number = 88;
System.out.println(Person.number);
}
}
2.静态方法
2.1定义:用static修饰的方法称为静态方法
静态方法不需要通过实例调用
- 调用实例方法必须通过实例变量
- 调用静态方法不需要实例变量
- 静态方法类似其他编程语言的函数,如python的类的方法,直接调用
2.2限制:
- 静态方法不能访问this变量
- 静态方法不能访问实例字段,实例字段都是通过this访问的
- 静态方法可以访问静态字段
Person.java
public class Person {
public String name;
public int age;
public static int number ;
public Person(String name){
this.name = name;
number++;
}
public static int getNumber(){
return number;
}
}
public class Person {
public String name;
public int age;
public static int number ;
public Person(String name){
this.name = name;
number++;
}
public static int getNumber(){
return number;
}
}
public class Hello {
public static void main(String[] args){
Person ming = new Person("小明");
System.out.println(Person.getNumber());
Person hong = new Person("小红");
System.out.println(Person.getNumber());
Person hua = new Person("小花");
System.out.println(Person.getNumber());
}
}
public class Hello {
public static void main(String[] args){
Person ming = new Person("小明");
System.out.println(Person.getNumber());
Person hong = new Person("小红");
System.out.println(Person.getNumber());
Person hua = new Person("小花");
System.out.println(Person.getNumber());
}
}
静态方法的作用:
静态方法经常用于工具类
Arrays.sort()
Math.random()
静态方法经常用于辅助方法
Java程序入口main()也是静态方法
实例
总结:
静态字段属于所有实例共享的字段,实际上是属于class的字段
调用静态方法不需要实例,因此无法访问this
静态方法可以访问静态字段和其他静态方法
静态方法常用语工具类和辅助方法。