Java 类和对象详解(二)——static关键字

文章目录

  • 1.static关键字
    • 为何会引入这个static 变量?
    • final 和 static 的区别
    • static 修饰方法

1.static关键字

看见static,本能反应,和对象无关

static可以修饰的类型:

  1. 修饰属性:类属性,类变量

  2. 修饰方法:类方法,工具方法

  3. static 修饰代码块,静态代码块

  4. static 修饰内部类,静态内部类

static 修饰的属性称为类属性,类变量,所有对象共享

为何会引入这个static 变量?

请先看如下代码:

public class ClassTest {
    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2 = new Person();
        person1.name = "老八";
        person1.country = "China";
        person2.name = "安倍";
        person2.country = "Japan";
        person1.print();
        person2.print();
    }
}
class Person {
    String name;
    int age;
    String sex;
    String country;
    void print() {
        System.out.println("name: " + name + ",country: " + country);
    }
}

比如Person类的成员变量country,所有对象都在堆中保有自己的country属性。

很多对象的这个值都是同一个值,比如中国人的所有对象属性 country = “China”。

假设有一天,咱们英勇的解放jun光复了某岛国,所有岛国人的 country 属性都得改为China。一个一个去改,就会很麻烦。所以有了解决办法,就是在 country 属性前面加上 static 关键字。

例如:

static String country;

对于country这个值来说,他应该是很多个对象共有的一个属性,使用static修饰这个属性,该属性就称为静态属性

当一个实例变量被 static关键字修饰时,他就表示类的属性,该类的所以对象共享这个属性,所有对象的这个属性都一样。static修饰的属性在JVM方法区中存储

static修饰的属性,直接通过类名就能访问,无需通过对象访问。

例:

class Person {
    String name;
    int age;
    String sex;
    static String country = "China";
    void print() {
        System.out.println("name: " + name + ",country: " + country);
    }
}
public class ClassTest {
    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2 = new Person();
        person1.name = "老八";
        System.out.println(person1.country);
        person2.name = "安倍";
        System.out.println(person2.country);
        person1.print();
        person2.print();
    }
}

​ 输出结果:

//China
//China
//name: 老八,country: China
//name: 安倍,country: China

调用new Person()来产生Person的对象,先要有Person类才能产生对象。
首先将Person类加载到内存中。Person中的所有static变量就会被加载到方法区中。

下面从程序内存图直观了解执行过程

Java 类和对象详解(二)——static关键字_第1张图片

Java 类和对象详解(二)——static关键字_第2张图片

在Java中,能否在方法内部定义一个static变量?

答案是不能!!!

因为方法中定义的变量是局部变量,局部变量在栈中存储,而static定义的变量在方法区中存储。不可能一个属性既在栈中存储,又在方法区中存储!!!

final 和 static 的区别

例如下列代码:

class Person{
final int age = 18;
static String country = "China";
}

final 是成员常量,在堆中存储,age这个属性,在类定义的时候就赋值为18了。

static 定义的是静态变量,在方法区中存储,所有Person类的对象共享这个country属性。

Person的所有对象都有age属性,且值都是18。

那么问题来了,为什么不把age定义为 static final,所有Person的对象都共享这个属性,且全局唯一?

答:

在类中定义常量,一般使用全局常量,由static final 共同修饰。

常量的命名规则:

所有单词全部大写,多个单词间使用下划线分隔。

static final String STUDENT_SCHOOL = “清华大学”;

总结:

a. static变量称为类属性,在方法区中存储该类的所有对象共享此变量

b. 若在类中定义了常量(定义式赋值),一般我们使用static final 共同修饰,称为全局常量。

c.要使用类属性(static属性称为类属性,通过类名称直接访问,此时没有对象也能调用,包含该类的null引用),我们通常使用 类名称.属性名称 ,不推荐使用对象来访问类属性,不规范。

static 修饰方法

static修饰的方法也是通过类名称直接访问,没有对象就能访问。

提出问题:

1.为啥主方法是个静态方法?

主方法是一个程序的入口,如果主方法是个成员方法,要通过对象调用。

入口都没有,从哪里产生对象???

程序从主方法开始执行,所以主方法要能直接调用起来,静态方法就能直接调用,无需产生对象~~

2.静态方法能否访问成员变量和成员方法?

在静态方法中只能调用静态方法或者静态属性,static家族之间可以相互调用,不能直接调用成员方法或者成员属性,必须通过对象来调用。

3.成员方法能否访问静态变量和静态方法?

在成员方法中既可以调用成员方法和成员变量,也可以调用静态方法(此时都已经产生了该类对象,一定可以访问静态域)。

4.普通的类能否用static关键字修饰?(不是内部类)

不能!!!

类定义出来就是要产生对象,若用static修饰,没有对象也能访问,那为什么还有要定义一个类呢???

总结:

看见static修饰的属性,都和对象无关,直接通过类名称就能访问静态属性和方法。

一般工具类的方法设计为 static 方法:

如 :

Arrays.sory();

Arrays.copyOf();

都是Arrays类提供的操作数组的方法,设计为 static 方法。

未完待续…

你可能感兴趣的