Java相对c++而言,是一种面向对象更为严谨的一种编程语言。编程某个的类的过程中,如果有每个对象的共需数据,当需要修改时,每个对象都要对其修改,会很麻烦,使其同步会过于繁琐。比如一个班级类中,里面有个学生人数的成员属性,那么对于每个学生对象都应该是一样的值,当要修改这个属性时,则需更新每个学生对象的属性值,会造成很大的不便。Java中提供了静态变量来解决这个问题,用static关键字来描述。

成员中的变量分为实例变量和静态变量(类变量)

      行为方法分为实例方法和静态方法(类方法)

      方法中的创建的变量又称为局部变量

      静态变量

      静态变量就是用static修饰的成员变量,也称为类变量(static 数据类型 变量名;)。该类的所有对象共享的变量,当访问它时取到的都是相同的值,同样任何一个类去修改它时,修改的也都是同一个变量。

      静态变量可以被所有实例共享,可以使用“类名.变量名"的形式来访问。《Java程序设计  理实一体化》书中也写了可以使用”对象名.变量名“的形式访问,但我测试时会出现警告,为了区分实例变量与高效使用类变量,我建议尽量使用”类名.变量名“来修改其值,方便,访问的话两种我倒觉得没啥区别。

java中不能创建对象的类_java中不能创建对象的类

 可以看见黄色灯泡那行字说明的应该以静态方式访问静态字段的警告,所指的方式就是”类名.变量名".(记忆可以根据名字来记忆,它本身就叫类变量,访问想到用类名就行。)

下面用个例子来描述一下静态变量的使用:

public class School{

  static String mySchool;  //定义一个静态成员变量
  
public static void main(String[] args){
  School stu1 = new School();
  School stu2 = new School();
  School.mySchool = "合肥师范学院";  //为类变量赋值
  
  System.out.println("欢迎来到" + stu1.mySchool + "!");
  System.out.println("欢迎来到" + stu2.mySchool + "!");
}

}

静态方法

      静态方法就是用static修饰的方法(static 方法类型 方法名(参数));调用该类方法的形式也有两种,”类名.方法名“和”对象名.方法名“。

  实际开发中,有时希望在不创建对象的情况下就可以调用某个方法,换句话就是说对象和方法不是绑定在一起的。我们最常见的就是静态main方法了,正是因为它是静态的,从而使得它可以在不创建对象的情况下就可以被编译访问,这也是main方法为什么一定要是静态的原因。

静态方法可以访问其他静态成员(其他静态方法,其他静态变量),但不可以访问实例成员。实例成员可以访问静态成员。

java中不能创建对象的类_静态成员_02

可以明显的看到当访问实例成员时出错了,“不能访问非静态字段”。访问静态成员的时候没有发生错误,说明是可以访问的。 

java中不能创建对象的类_静态代码块_03

这里我们可以看到实例方法访问静态成员时没有出错。 

原因:

        程序最终都是在内存中执行的,变量只有在内存中有一席之地才会被访问,类的静态成员属于类本身,当类被加载的时候就会分配内存了,会将其放入方法区中,可以通过类名进行访问。非静态成员属于类的对象,所以只有在类被创建的时候才会分配内存,然后通过类的对象进行访问。类的对象是存入堆区的。创建对象时,也是先把类的信息存入方法区,再成功创建对象在堆区。所以在静态方法中也不可以用this和super,内存机制的原因。

举个例子学习静态方法:

public class Person{
    public static String name;
	
	public static void beautifulGirl() {
		System.out.println(name + "是大美女");
	}
}

public class Main{
    public static void main(String[] args) {
		Person.name = "小不点";
		Person xmq = new Person();
		
		Person.beautifulGirl();   //类名的方式调用静态方法
		xmq.beautifulGirl();  //实例对象的方式调用静态方法
	}
}

注意:Java中的static不能用作局部变量。Java的面向对象是严谨的,而static用作为局部变量更针对于过程,Java中把这一语法规则给弃掉了。

静态代码块

      static还可以用来形成代码块以便优化程序性能(格式:static{},大括号里面是若干行语句),静态代码块可以用来对类成员进行初始化。当类被加载时,静态代码块就会执行,由于每个类只加载一次,所以静态代码块只执行一次,就因为只执行一次,所以有时起到了优化程序性能的作用,尤其是空间上。


public class Main {
	static {
		System.out.println("测试类的静态代码块执行了!");
	}
	
	public static void main(String[] args) {
		Person stu1 = new Person();
		Person stu2 = new Person(); //创建两个对象,验证静态代码块执行次数
	}
	
}
public class Person {
	static {
		System.out.println("Person类中的静态代码块执行了!");
	}
	
}
/*输出:
测试类的静态代码块执行了!
Person类中的静态代码块执行了!
*/

      因为执行类的时候最先执行的是静态成员,所以使用static还可以起到加快程序运行的作用。