Java学习二:static关键字

本文详细介绍了Java中的static关键字,包括它的优缺点、修饰变量和方法的特性。static关键字使得变量和方法属于类级别,无需对象即可访问,全局唯一。同时,它限制了静态方法不能调用非静态成员,非静态方法可以访问静态成员。文中还通过实例展示了静态变量和方法的使用,并探讨了访问权限的影响。
摘要由CSDN通过智能技术生成

目录

一:static关键字的用法

1.1 static关键字的优缺点

 1.2 static关键字修饰变量

1.3 static修饰方法, 静态方法 

1.4总结


一:static关键字的用法

1.1 static关键字的优缺点

        优点:

                属于类级别的,不需要创建对象就可以直接使

                全局唯一,内存中唯一,静态变量可以唯一标识某些状态.

                在类加载时候初始化,常驻在内存中,调用快捷方便.

        缺点:

                静态方法不能调用非静态的方法和变量。(非静态方法可以任意的调用静态方法/变量
                不能使用this和super关键字(属于类级别,没有创建对象则不可用this/super)

 1.2 static关键字修饰变量

         1.static修饰的变量也称为静态变量,定义在类的方法外面,不能在类的方法里面,类的方法里面是局部变量。
         2.静态变量和非静态变量的区别是:
         静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化,而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
        3.static成员变量的初始化顺序按照定义的顺序进行初始化。
        4.static关键字并不会改变变量和方法的访问权限(public,private,protected)。
        5.需要记住的是:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要权限足够)。

1.3 static修饰方法, 静态方法 

         1.由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态方法成员变量。

        2.静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

        3.非静态方法可以访问静态成员变量和静态方法.

1.4总结

        1.非静态方法可以访问静态和非静态的成员变量(不论访问权限是public,private,protected),静态方法只可以访问静态成员变量(不论访问权限publi,private,protected)

        2.private权限的静态成员变量,不能通过类名和对象访问。

           protected权限的静态成员变量,可以通过类名和对象访问。

           public权限的静态成员变量,可以通过类名和对象访问。

        3.静态成员变量的值改变,所有该类对象中该静态成员变量的值都改变了。

           Java中的static关键字不会影响到变量的变量或者方法的作用域。

           在Java中能够影响到访问权限的只有private、public、protected这几个关键字。

import java.lang.String;

class StaticMember{
	
	protected float number = 3.14F;
	protected static float f = 3.14F;
	
	static int years =365;    //定义了一个静态成员变量
	private static int month = 12; //定义了一个私有的静态成员变量
	String name = "hejunran";   //非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
	
	// 非静态方法
	public void print(){
		/* 原因是用了public,private,static等修饰词去修饰方法内部变量,
		 * 然而在java类的方法里声明变量时,只能用final修饰(only final is permitted)(或者不加修饰)。
		 * 除此之外不能用其他的修饰符修饰,包括static也会报同样的错误。
		 * public,private等是声明作用域的。方法内部定义的变量(只能在方法内部使用),
		 * 在里面声明作用域无意义,也禁止声明。
		 */
		// 总结: 方法里面不可以定义 公共的,私有的变量(方法里面本身就是局部变量)
//		static String name ="hejunran";    这是不能声明的。
//		public String name ="hejunran";
		
		final String NAME= "hejunran";     // 定义了一个常量,方法里面不可以定义静态常量。
		System.out.println(years);         // 非静态方法调用静态成员变量
		System.out.println(this.years);         // 非静态方法调用静态成员变量
		System.out.println(month);         // 非静态方法调用私有静态成员变量
		System.out.println(name);         // 非静态方法调用非静态成员变量
		System.out.println(number);
		prints();                        // 非静态方法调用静态方法
	}
	
	
	// static方法一般称作静态方法
	public static void prints() {
//		print();                          //调用非静态方法报错
		System.out.println(month);        // 
		System.out.println(years);
//		System.out.println(number);       // 非静态成员变量不能被静态方法访问,编译会报错。
//		System.out.print(name);          // 非静态成员变量不能被静态方法访问,编译会报错。
	}
	
	
}

public class StaticStudy {
	
	static int value =11;
	
	private void printValue() {
        int value = 22;
        System.out.println(this.value);
    }
	
	public static void main(String[] args) {
		
		// 此处输出的值为11,而不是22,那是因为this是表示当前对象,
		// 通过new创建对象,static静态变量value一起初始化,this调用当前成员变量
		// 在printValue方法内部的value是局部变量,根本不可能与this关联.
		new StaticStudy().printValue();        
		
		System.out.println(StaticMember.years);
//		System.out.println(StaticMember.month);    // 私有的静态成员变量是不能被访问的
//		System.out.println(StaticMember.name);     // 非静态变量和方法只能通过对象访问
//		StaticMember.print();                      // 非静态变量和方法只能通过对象访问
		StaticMember.prints();
		
		StaticMember s1 = new StaticMember();
		StaticMember s2 = new StaticMember();
		System.out.println(s1.years);
		System.out.println(s2.years);
		
		System.out.println(s1.name);
		System.out.println(s2.name);
//		System.out.println(s1.month);           // private私有化的(静态和非静态的)成员变量是不能被类名和对象直接访问的。
		System.out.println(s1.number);          // protected (静态和非静态的)成员变量可以被对象访问,静态的protected可以通过类名。成员变量 的方式直接访问
//		System.out.println(StaticMember.number);    // number 非静态成员,不能通过类名直接访问
		System.out.println(StaticMember.f);
		System.out.println(s1.f);
		
		s1.print();
		
		System.out.println("************************");
		// 发现s1中的静态成员变量值改变之后s2也改变了 ,这是因为静态变量在类初始化时就被固定在内存中,是被多个对象共享的
		s1.years=255;
		System.out.println(s2.years);         
		System.out.println(StaticMember.years);
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值