类变量,静态方法和其他变量和方法在调用时的区别

1:静态变量(类变量)和其他变量在调用时的区别:

类变量赋值方法

类变量赋值可以采用类名.变量名的方法在下面两种规则中赋值,注意类变量不能用实例化出来的对象调用,因此也不能通过对象.变量名的方法赋值

  • 无final修饰,声明时赋值,构造器中赋值,静态语句块或静态方法赋值
  • 有final修饰,声明时赋值,声明与赋值分开可在静态语句(就是)块中赋值(一般static都是和final一起使用)

普通变量赋值则不能类名.变量名来对变量进行调用赋值,其他的赋值方式与static不带final一样,二者表面的区别只有格式不一样(也就是不带final的类变量比实例变量多了一种访问方式)

class A{

  public static String a;

  private String b;

  public A(String a){

  this.b = a;//实例变量通过构造函数赋值;

  }

  public static void main(){

  A a = new A("sadasd");//实例变量b通过构造函数赋值

  A.a = "sdad";//类变量通过类名.变量名直接赋值,也可以以这种方式来访问类变量

  

  }

}

还需要注意的是类变量与实例变量作用范围的不同:

实例变量:

  • 当一个对象被实例化之后,每个实例变量的值就跟着确定;
  • 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;

类变量:

  • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
  • 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
  • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
  • 静态变量在程序开始时创建,在程序结束时销毁。

2:静态方法和普通方法的区别:

1、在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

2、静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

3、程序的static块只能调用静态方法,不能调用实例的方法。

如果要追溯其区别的根源,可以这样理解:在编译期间静态方法的行为就已经确定,而实例方法只有在运行期间当实例确定之后才能确定。
关于类变量,静态方法和普通变量和方法的区别,我们这里有一个列子可以帮助理解(仁者见仁,智者见智)
在People类中:
package com.earth.people;

public class People {
    private String nation;//这些是每个对象都有,但是不同对象拥有不同值的属性,所以应该用实例变量来声明
    private double avageSalary;
    private double avagehigh;
    private String skingColor;
    //地球人是每个人都拥有的属性,但是这个属性所有人类对象都是一样的,所以可以用类变量来说声明
    public static String earth;
    public String getNation() {
        return nation;
    }
    public void setNation(String nation) {
        this.nation = nation;
    }
    public double getAvageSalary() {
        return avageSalary;
    }
    public void setAvageSalary(double avageSalary) {
        this.avageSalary = avageSalary;
    }
    public double getAvagehigh() {
        return avagehigh;
    }
    public void setAvagehigh(double avagehigh) {
        this.avagehigh = avagehigh;
    }
    public String getSkingColor() {
        return skingColor;
    }
    public void setSkingColor(String skingColor) {
        this.skingColor = skingColor;
    }
    public static final void protectEarth() {//这个可以理解为保护地球方法是全人类都应该做的,而不应该某一个对象应该做的,所以可以声明为类方法
        System.out.println( "plant tree and decline pollution");
    }

}

 

在ChinesePeople类中:
public class ChinesePeople {
    public static void main(String[] args) {
        People chinese = new People();
        People england = new People();
        People american = new People();
        People.protectEarth();
        chinese.protectEarth();//这两种都可以
        People.earth = "绿色地球";//静态类可以用这种方法来访问,但是不能用chinese.earth来访问,就相当于星球这个属性只能由整个人类来定义,以整个人类的名义访问,不能说某一个人或某一种人就能够定义;
    }

}

此例也可以用于以后在在创建对象时帮助确定静态变量,而且由此可以看出java的面向对象编程的特性,以后在编程中要结合生活中的常识规律才可以成为一个好的程序员

 

3:还有一个小细节,此前一直没有注意过:

例如:

class a{

  int i;

  i=5;//这句是再次赋值,是是一个语句

  }

这个代码是会报错的;原因是类体中只能出现变量和方法,类体变量在声明的时候如果你没有赋值,那么系统就会为你的变量赋一个默认值,数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。
而你在下面在在为其赋值就相当于一个语句,而语句不能直接出现在类体中,只能出现在方法体和静态语句块(就是{})中,如果这样改就可以使用:
class a{
  int i;
  {
  i=5;
  }
  }

将i=5放到一个静态代码块中就可以执行了





posted on 2018-06-22 20:09  沈大侠  阅读(366)  评论(0编辑  收藏  举报