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放到一个静态代码块中就可以执行了