探秘static:类不需实例化就能用?
副标题#e#
一般环境下,需要用到某个类的时候,都必需先实例化这个类,才气对其举办挪用。在编程进程中发明,有些类不消实例化就可以直接拿来利用,利用它的字段、要领等等。
这时候,靠的就是static浸染。static英文意思为“静止的,静态的”,在OOP中可以作为修饰符,类、字段、属性、要领等被static修饰后,变为静态类、静态字段、静态属性、静态要领……
static修饰的类成为静态类,静态类中只能包括静态成员(被static修饰的字段、属性、要领),不能被实例化,不能被担任;非静态中可以包括静态成员。
1、被挪用时必需先实例化的环境:
被挪用成员为非静态成员(此时它所属的类必定为非静态类)。如下小例子:
public class ClassA //ClassA类(非静态类) { public ClassA() { } //结构函数 public void Fun() { }//ClassA类中的要领(非静态要领) } public class ClassB //需要挪用ClassA类中要领的ClassB类 { public ClassB() { } //结构函数 public void Fun() { ClassA a = new ClassA();//挪用ClassA类中的要领需要先实例化 a.Fun(); } }
说明:ClassA类为非静态类,个中的要领Fun()也为非静态要领,所以在ClassB中挪用时需要先实例化ClassA类。
2、被挪用时不需要实例化的环境:
被挪用成员为静态成员(此时它所属的类为静态类或非静态类)。如下小例子:
(1)被挪用类为非静态类:
public class ClassA //ClassA类(非静态类) { public ClassA() { } //结构函数 public static void Fun() { }//ClassA类中的要领(静态要领) } public class ClassB //需要挪用ClassA类中要领的ClassB类 { public ClassB() { } //结构函数 public void Fun() { ClassA.Fun(); //挪用ClassA类中的要领直接挪用:类名.成员 } }
说明:ClassA类为非静态类,但个中的要领Fun()为非静态要领,所以在ClassB中挪用时不实例化ClassA类(并且不能实例化),直接挪用其成员,语法为“类名.成员”。
(2)被挪用类为静态类:
public static class ClassA //ClassA类(静态类) { //虽然静态类中不能存在结构函数 public static void Fun() { }//ClassA类中的要领(静态要领) } public class ClassB //需要挪用ClassA类中要领的ClassB类 { public ClassB() { } //结构函数 public void Fun() { ClassA.Fun(); //挪用ClassA类中的要领直接挪用:类名.成员 } }
说明:ClassA类为静态类,个中的要领也Fun()为非静态要领,所以在ClassB中挪用时不实例化ClassA类(并且不能实例化),直接挪用其成员,语法为“类名.成员”。
#p#副标题#e#
3、static修饰符(拓展):
(1) 用来修饰类或类的成员,这时不需要建设实例就能会见(并且不能实例化),在被挪用的时候自动实例化,且在内存中发生一个实例。当含有静态成员的非静态类实例化出工具后,这些工具公用这些静态成员,通过类名或工具名都能会见它们。
在网上看到两个有趣的小例子:
人是一个非静态类。人有脑筋,这是一个用static修饰的属性。
这个属性是针对所有的人,是人的配合特征。而不是某个特点工具所特有的(好比张三有脑筋,李四没脑筋),因为只要是小我私家,他都有脑筋(固然卡洛斯·罗德里格兹只有半个脑筋,尚有些人较量脑残→_→,那也算是有脑筋),既然是人类共有的,那么他就不能被实例化。
别的一个能被实例化的例子,照旧人这个类,人的身高,就是一个非static的属性。因为每小我私家的身高是差异的。好比我身材魁梧,高达1.55米,这个1.55米是描写我的身高,是跟我这个特定的工具有接洽的。姚明才2.26米,这是姚明这个工具的数据。不管是1.55照旧2.26,这都和特定的工具有接洽,而不是人类所共有的特征。所以非static的可以被实例化,而static不能被实例化。
(2) 修饰要领内部的静态变量:
我们的代码都是从硬盘加载到内存中才气运行的,在内存中主要分为三个区域,来存放我们的代码,别离是堆、栈和静态存储区。堆中存放的是代码中的引用范例变量,如类的实例、数组等;栈中存放的是代码中的值范例,如整型、浮点型、布尔型等;静态存储区中存放静态变量和全局变量、常亮。
#p#分页标题#e#
整个措施运行时,代码都是共用静态存储区中的静态变量的,譬喻界说存款余额为静态变量,同一个银行卡号,无论你是在银行取钱、在ATM机取钱,照旧网银消费,用的都是这个静态的余额。
所以,要领内部的静态变量,执行完静态变量值不用失,再次执行此工具的要领时,值仍存在,它不是在堆和栈中分派的,是在静态区非配的, 这是与局部变量最大的区别。
作者:csdn博客 胡玉洋