关键字:static
简述:
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中
都单独分配一个用于代表国家名称的变量。
- class Circle{
private double radius;
public Circle(double radius){this.radius=radius;}
public double findArea(){return Math.PIradiusradius;}}- 创建两个Circle对象
Circle c1=new Circle(2.0); //c1.radius=2.0
Circle c2=new Circle(3.0); //c2.radius=3.0
- 创建两个Circle对象
- Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。
- 上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然
- 如果想让一个类的所有实例共享数据,就用类变量!
类属性、类方法的设计思想 - 类属性作为该类各个对象之间共享的变量。在设计类时, 分析哪些属性不因对象的不同而改变 ,将这些属性设置为类属性。相应的方法设置为类方法。
- 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法 ,从而简化了方法的调用。
static的适用范围:在Java类中,可用static修饰属性、方法、代码块、内部类 - 被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享
访问权限允许时,可不创建对象,直接被类调用
代码实例:
class Circle {
private double radius;
public static String name = "这是一个圆";
public static String getName() {
return name;
}
public Circle(double radius) {
this.radius = radius;
}
public double findArea() {
return Math.PI * radius * radius;
}
public void display() {
System.out.println("name:" + name + "radius:" + radius);
}
}
public class StaticTest {
public static void main(String[] args) {
Circle c1 = new Circle(2.0);
Circle c2 = new Circle(3.0);
c1.display();
c2.display();
类方法(class method)
- 没有对象的实例时,可以用 类名. 方法名()的形式访问由static修饰的类方法。
- 在 在static 方法内部只能访问类的 的static 修饰的属性或方法, 不能访问类的非 非static 的结构。
class Person {
private int id;
private static int total = 0;
public static int getTotalPerson() {
//id++; //非法
return total;}
public Person() {
total++;
id = total;
}}
public class PersonTest {
public static void