类变量(静态属性)
static关键字可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。既然属于类,就可以不用创建对象来调用。
static修饰的内容是随着类的加载而加载的,且只加载一次,存储于一块固定的内存区域(静态区),可以直接被类名调用,它优先于对象存在,可以被所有对象共享。
一、类变量-提出问题
有一群人在玩游戏,不时有新的人加入,请问如何知道现在有多少人解决
传统方法:
1、main方法定义一个count
2、有人加入就count++
package com.lmdedu.static_;
public class ChildGame {
public static void main(String[] args) {
//定义一个变量count,统计多少人加入
int count = 0;
Child child1 = new Child("白骨精");
child1.join();
count++;
Child child2 = new Child("狐狸精");
child2.join();
count++;
Child child3 = new Child("老鼠精");
child3.join();
count++;
System.out.println("共有" + count + "人加入游戏");
}
}
class Child{
private String name;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name + "加入游戏");
}
}
但问题是
1、count是一个独立于 对象 的变量,
2、以后在访问count很麻烦,没有用到OOP
3、所以引出 类变量/静态变量
二、类变量快速入门
package com.lmdedu.static_;
public class ChildGame {
public static void main(String[] args) {
//定义一个变量count,统计多少人加入
int count = 0;
Child child1 = new Child("白骨精");
child1.join();
child1.count++;
Child child2 = new Child("狐狸精");
child2.join();
child2.count++;
Child child3 = new Child("老鼠精");
child3.join();
child3.count++;
//类变量可以通过类名直接访问, 类.变量 不是传统的 对象.变量
System.out.println("共有" + Child.count + "人加入游戏");//3
//三个Child类对象共享 count变量
System.out.println("共有" + child1.count + "人加入游戏");//3
System.out.println("共有" + child2.count + "人加入游戏");//3
System.out.println("共有" + child3.count + "人加入游戏");//3
}
}
class Child{
private String name;
//定义一个变量count,是一个类变量(静态变量) static静态
//该变量最大的特点就是会被Child类的所有对象 共享
public static int count = 0;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name + "加入游戏");
}
}
三、类变量内存布局
当new了两次Child对象时内存布局:
不管static变量在哪里,static变量是同一个类的所有对象共享的
static是在类加载的时候就生成的
四、什么是类变量
当
static关键字
修饰成员变量时,该变量称为类变量,也叫做静态变量、静态属性。该类的每个对象都共享同一个类变量的值。任何一个该类的对象都可以访问到同一个值;修改该类变量值的时候,修改的也是同一个值;也可以在不创建该类的对象的情况下对类变量进行操作。
静态变量的访问修饰符的访问权限和范围和普通属性是一样的
// 定义语法:
访问修饰符 static 数据类型 变量名; // 推荐使用
static 访问修饰符 数据类型 变量名;
// 举例:
public static int count = 0;
// 访问语法:
类名.静态变量名 // 推荐使用
对象名.静态变量名
// 举例:
int childCount = Child.count;
五、类变量细节 (重点)
(1) 当需要让某个类都共享一个变量的时候,就可以考虑使用静态变量
.
(2) 静态变量是该类的所有对象共享的,而实例变量是每个对象独享的
.
(3) 加上static关联字的变量称为类变量/静态变量,否则称为实例变量/普通变量/非静态变量
.
(4) 类变量可以通过类名.类变量名或者对象名.类变量名来访问,但Java的设计者更推荐使用 类名.类变量名 来访问(5)实例变量不能通过 类名.类变量名 来访问
(6)类变量是在类加载的时候就生成的 ,无需创建对象来使用
(7)类变量的生命周期是随着类的加载开始的,随着类消亡而销毁
类方法(静态方法)
一、定义
当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有 static ,建议使用类名来调用,而不需要创建类的对象。调用方式非常简单。
静态方法的好处:当我们不希望创建实例,也可以调用某个方法(即当作工具来使用),这时将方法做成静态方法 非常方便
静态方法的访问修饰符的访问权限和范围和普通方法是一样的
// 定义语法:
访问修饰符 static 数据返回类型 方法名() { }; // 推荐使用
static 访问修饰符 数据返回类型 方法名() { };
// 举例:
public static int getPersonCount() {...};
// 访问语法:
类名.静态方法名(形参列表); // 推荐使用
对象名.静态方法名(形参列表);
// 举例:
int count = Person.getPersonCount();
二、类方法(静态方法)细节
口诀:静态方法 只能访问静态成员, 不能访问非静态成员
非静态方法既可以访问静态成员,也可以访问非静态成员
但是也要遵守访问权限
(1) 类方法和普通方法都是随着类的加载而加载的,将结构信息存储在方法区,所以类方法中没有并且不能使用this和super,而普通方法是有this参数的
.
(2) 类方法可以通过类名调用,也可以通过对象名调用
.
(3) 类方法只能访问类变量和类方法
.
(4) 类方法不能直接访问 普通成员变量或成员方法,可以在类方法中创建自己类对象进行调用
.
(5) 成员方法可以直接访问类变量或类方法
练习