static关键字

static


需求:使用java类描述传智的学生。 传智的学生都是中国人  

问题1:每个学生都是中国人,那么就没有必要在每个学生对象中都维护者一个country属性。

解决方案:把country数据移动到数据共享区(方法区)中。

问题2:怎样子才能把数据移动到数据共享区中?

解决方案:只需要使用static关键字修饰该成员变量即可。
 

class Student{
	
	String name; //姓名

	 String country = "中国";	// 成员变量使用了static修饰,那么该数据会进去方法区内存中,而且只会存在一份数据。

	public Student(String name){
		this.name = name;
	}


	public void study(){
		System.out.println("好好学习,为将来可以成为高富帅做准备!!");
	}
}


class Demo9 {

	public static void main(String[] args) 
	{

		Student s1 = new Student("张三");
		Student s2 = new Student("李四");
		s1.country = "小日本";
		System.out.println("姓名:"+ s1.name+" 国籍:"+ s1.country); // 小日本
		System.out.println("姓名:"+ s2.name+" 国籍:"+ s2.country); // 中国
	
	}
}

static(静态): 修饰符

 

static修饰成员变量: 如果一个数据需要被所有对象共享使用的时候,那么即可使用static修饰该成员变量。
        
        访问方式:
                方式1: 可以使用对象进行访问。  格式:对象.静态属性名

                方式2: 可以使用类名进行访问。  格式: 类名.属性名。
        
        推荐使用:可以使用类名进行访问。
        

    静态成员变量要注意的细节:
        1. 静态的成员变量可以使用类名或者是对象进行访问。
        2. 非静态的成员变量只能使用对象进行 访问,不能使用类名直接访问。
        3. 千万不要为了方便访问而使用static修饰一个成员变量,只有这个成员变量的数据是需要被共享的时候
            才使用static修饰。

    static修饰成员函数:
        
        静态函数的访问方式:
            
              方式一:使用对象访问。  格式: 对象.函数名()

              方式二:使用类名访问。 格式: 类名.函数名();

        
        静态函数要注意的细节:
            1. 非静态的函数只能使用对象调用,不能使用类名调用。
            2. 静态函数可以直接访问静态的成员(成员变量成员函数),但是不能直接访问非静态的成员。
                原因:静态函数可以使用类名调用,而这时候对象可能还没有存在内存中,这时候非静态的数据也就不存在内存中。

            3. 非静态函数可以直接访问静态以及非静态的成员。
                原因:非静态函数必须要由对象调用,如果对象存在了,静态数据以及非静态数据早就存在内存中了。 

            4. 静态函数不能出现this以及super关键字。
                原因:因为静态函数可以使用类名直接调用,而这时候可能还没有对象存在,this又要代表当前对象。

    
    什么时候使用static修饰一个函数呢?
        如果一个函数没有直接访问非静态的成员,那么即可使用static修饰该函数了。(常用于工具类的方法 Arrays)


    非静态的成员变量与静态成员变量的区别:
    
        数量上的区别:    
            (n份)非静态成员变量是在每个对象中都维护一份数据
            (1份)静态成员变量只会在方法中维护一份数据。

        访问方式上的区别:
            非静态的成员变量只能使用对象进行访问. 
            静态成员变量可以使用对象、类名进行访问。
        
        存储位置上的区别;
            非静态成员变量是存储在堆内存中。
            静态成员变量是存储在方法区中。
            
        生命周期的区别:
            非静态成员变量是随着对象的创建而存在,随着对象的消失而消失。
            静态成员变量是随着类文件的加载而存在,随着类文件(字节码文件)的消失而消失。

        作用上的区别:
            非静态成员变量的作用是用于描述一类事物的属性。
            静态成员变量的作用是提供一个共享数据给所有对象使用的。 

class Student{
	
	 String name ; // 非静态的成员变量

	static	String country = "中国";  //静态的成员变量
	
	//静态代码块
	static{
		System.out.println("静态代码块的代码执行了..");
	}

	public Student(String name){
		this.name = name;
	}
	
	//静态函数  
	public static void sleep(){
		System.out.println( "今晚早睡..");
		
	}

	
	//非静态函数
	public void study(){
		System.out.println(name+"好好学习,为将来可以成为高富帅做准备!!");
	}

}

class Demo10 
{
	public static void main(String[] args) 
	{
			
		Student s1 = new Student("狗娃");
		Student s2 = new Student("铁蛋");
		System.out.println("姓名:"+ s1.name);
		System.out.println("姓名:"+ s2.name);
		/*
		System.out.println("国籍:"+ Student.country);
		*/
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值