Java学习—从入门到精通【2】面向对象程序设计(2)

一.static修饰符

静态成员归整个类所有,不依赖类特定的实例,是被类的所有实例共享。静态成员可以在任何对象创建之前访问,无须对象访问。

提示:Java语言没有传统意义上的全局变量,但静态成员具有全局变量的功能。

1.static变量——静态变量

    静态变量是属于类但不依赖类特定的实例。静态变量在类创建后就一直存在,其生命周期和所在类的生命周期是一样的。静态变量是被类的所有实例共享的,若一个类有多个实例对象,那么这些实例对象都可以共享该静态变量。同样在没有创建实例对象时,可以通过类名来访问该类的静态变量。

实例变量和静态变量区别如下:

①对于实例对象,每创建一个实例,JVM就会为实例变量分配一次内存,实例变量可以在内存中有多个备份,互不影响。实例变量隶属于对象,在类的内部,非静态方法可以直接访问实例变量。本类中的静态方法或其他类,则需要通过本类的实例对象访问实例变量。

②对于静态变量,静态变量可以被所有的对象之间共享。在本类中,任何方法都可以直接访问静态变量,当然也可以通过对象访问(不推荐)。在其他类中,则需要通过类名来访问静态变量。

public class StaticDemo01 {

	public static int ticket = 10;	//定义静态变量ticket
	public void sell() {	//定义tell()方法
		ticket--;
		System.out.println("剩余:"+ticket);
	}
	public static void left() {		//定义left()方法
		int i = ticket - 2;
		System.out.println("还剩余:"+i);
	}
	public static void main(String[] args) {
		int x = ticket--;	//直接访问ticket
		System.out.println("x="+x+",ticket="+ticket);
		int y = StaticDemo01.ticket--;		//通过类名访问
		System.out.println("y="+y+",ticket="+ticket);
		StaticDemo01 st1 = new StaticDemo01();
		int k = st1.ticket--;	//通过实例访问
		System.out.println("k="+k+",ticket="+ticket);
		StaticDemo01 st2 = new StaticDemo01();	
		st2.sell();		//通过非静态方法访问ticket
		left();		//通过静态方法访问ticket
	}
}

可以发现静态变量可以被多个实例共享。

静态变量在类中有以下几个作用:

①静态变量是被所有的实例共享,因此静态变量可以作为实例之间共享数据,增加实例之间的交互性。

②静态变量可以让类中的所有实例包含同一个常量属性。


2.static方法——静态方法

静态方法在类创建后就一直存在,其生命周期和所在类的生命周期是一样的。在没有创建实例对象的时候,可以通过类名来调用该类的静态方法,具有极大的灵活性。但静态方法不能访问非静态的实例变量和实例方法。

成员方法分为两种:一种是实例方法,是没有static关键字修饰的成员方法;另一种是静态方法,是有static关键字修饰的成员方法。

区别如下:

①静态方法可以通过“类名.静态方法名”就可以调用。静态方法不可以访问本类中的实例变量和实例方法,但可以访问静态成员。静态方法中不能使用this关键字和super关键字,因为这两个关键字与特定的实例相关。

②实例方法可以访问静态成员和非静态成员,包括静态变量、静态常量、静态方法、实例变量和实例方法。

public class StaticDemo02 {

	public static int piece = 10;	//静态变量piece
	int count = 0;		//实例变量count
	public void number() {		//实例方法number()
		piece--;		//通过实例方法访问静态变量piece
		count++;		//通过实例方法访问实例变量count
		System.out.println("1,非静态方法number:piece="+piece+",count="+count);
	}
	public void time() {	//实例方法time()
		System.out.println("2,非静态方法time:piece="+piece+",count="+count);
		System.out.print("\t 非静态方法 time 调用非静态方法 number:");
		number();
		System.out.print("\t 非静态方法 time 调用静态方法 amount:");
		amount();
	}
	public static void amount() {	//静态方法amount()
		piece--;	//通过静态方法访问静态变量piece
		System.out.println("3,静态方法amount:piece="+piece);
	}
	public static void figure() {	//静态方法figure()
		piece--;	//通过静态方法访问静态变量piece()
		System.out.println("4,静态方法figure:piece="+piece);
		System.out.print("\t 静态方法 figure 调用静态方法 amount:");
		amount();	//通过静态方法访问静态方法amount()
	}
	public static void main(String[] args) {
		amount();	//本类中直接调用静态方法amount()
		StaticDemo02.figure();	//通过类名调用静态方法figure()
		StaticDemo02 st = new StaticDemo02();
		st.time();	//通过实例调用实例方法time()
		st.amount();	//通过实例调用静态方法amount()
	}

非静态方法可以去访问静态变量和调用静态方法,但是静态方法不能直接访问非静态变量和调用非静态方法。

3.程序的入口——main()方法

每一个Java应用都是从main()方法开始的。

4.变量的作用域

静态成员变量在类被加载时创建,其生命周期与该类的生命周期相同;

成员变量在类的实例被创建时产生,其生命周期与该类的实例对象的生命周期相同;

局部变量在定义该变量的方法被调用时创建,在方法调用结束后,该变量也被撤销。


猜你喜欢

转载自blog.csdn.net/VinceMar/article/details/80384403
今日推荐