千峰Java教程:046. static关键字修饰属性和方法

10、static关键字

static关键字的作用:

1、静态变量或方法不属于对象,依赖 类

2、静态变量是全局变量,生命周期从类被加载后一直到整个程序结束

3、静态变量只存一份,在静态方法区中存放

4、静态变量是本类所有对象共享一份

5、建议不要使用对象名去调用静态数据,直接使用类名调用(Role.country = "秦国";)

 

6、用static修饰一个方法,那么该方法属于类,不属于对象,直接用类名调用

7、静态方法不能访问非静态属性和方法,只能访问静态的

1、使用static关键字修饰一个属性

声明为static的变量实质上就是全局变量

//这是不用static的时候的方法,就是以前学过的
public class a
{
	public static void main(String[] args)
	{
		Role liubei = new Role("刘备", "蜀国");
		Role guanyu = new Role("关羽", "蜀国");
		Role zhangfei = new Role("张飞", "蜀国");
		
		//输出
		
		System.out.println(liubei.getInfo());
		System.out.println(guanyu.getInfo());
		System.out.println(zhangfei.getInfo());
	}
}

//角色
class Role
{
	private String name;
	private String country;
	
	//下面是构造方法
	
	public Role()
	{}
	public Role(String name, String country)
	{
		this.name = name;
		this.country = country;
	}
	
	//下面是getter和setter
	
	public void setName(String name)
	{
		this.name = name;
	}
	public void setCountry(String country)
	{
		this.country = country;
	}
	public String getName()
	{
		return name;
	}
	public String getCountry()
	{
		return country;
	}
	
	//输出角色名称、地点
	
	public String getInfo()
	{
		return "我是"+name+",来自"+country;
	}
}

/*
输出
我是刘备,来自蜀国
我是关羽,来自蜀国
我是张飞,来自蜀国
*/

我们看,刘关张三人都在蜀国,有这样一个图:

堆里的country都是蜀国,就会很浪费,要是只有一个蜀国就好了。我们可以改造一下:

public class a
{
	public static void main(String[] args)
	{
		//Role liubei = new Role("刘备", "蜀国");
		//Role guanyu = new Role("关羽", "蜀国");
		//Role zhangfei = new Role("张飞", "蜀国");
		Role liubei = new Role("刘备");
		Role guanyu = new Role("关羽");
		Role zhangfei = new Role("张飞");
		
		//输出
		
		System.out.println(liubei.getInfo());
		System.out.println(guanyu.getInfo());
		System.out.println(zhangfei.getInfo());
	}
}

//角色
class Role
{
	private String name;
	private static String country = "蜀国";//这里定义了一个静态变量(全局变量)
	
	//下面是构造方法
	
	public Role()
	{}
	public Role(String name)
	{
		this.name = name;
		//这里少了个this.country = country;
	}
	
	//下面是getter和setter
	
	public void setName(String name)
	{
		this.name = name;
	}
        //静态方法不能访问非静态数据,要这样写:
        public static void setCountry(String country)
        {
            Role.country =country;
        }

	/*public void setCountry(String country)
	{
		this.country = country;
	}
	public String getName()
	{
		return name;
	}*/
	public String getCountry()
	{
		return country;
	}
	
	//输出角色名称、地点
	
	public String getInfo()
	{
		return "我是"+name+",来自"+country;
	}
}

定义了全局变量后,把国家直接定义成了蜀国,输出结果跟上面的一样。其实在堆内存中有一个区叫静态方法区,里面存储的是静态变量、类信息(包括方法),所以此时只需要一个存储的country=蜀国即可。

如果把Role里的private static String country = "蜀国";中private去掉,在main()函数中把liubei.country改成"秦国",则关羽张飞的country都会变成秦国。想改成秦国建议用类名Role.country="秦国";

2、使用static关键字修饰一个方法

通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法

3、使用static关键字修饰一个类(内部类会讲到)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值