Static 关键字
总结归纳:
1. 静态方法和静态变量是属于某一个类,而不属于类的对象;
2. 静态方法和静态变量的引用可以直接通过类名+. 或者引用+.;
3. 在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。
4. 静态变量在某种程序上与其他语言的全局变量相类似,如果不是私有的就可以在类的外部进行访问
5. static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),
但是不能在 其他类中通过类名来直接引用,这一点很重要。
换个思路理解:private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。
static前面加上其它访问权限关键字的效果也以此类推。eg:public
6. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
注:Static修饰的变量为静态变量,static修饰的方法叫静态方法
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
一:static 修饰代码块/类时:
Static还可以定义静态语句块。
Static 定义静态语句块实例如下:
Public class StaticTest01{
//静态语句块:在类加载的阶段执行,并且只执行一次,并且是自上而下的顺序执行
Static{
System.out.println(“1”);
}
Static{
System.out.println(“2”);
}
Static{
System.out.println(“3”);
}
Static{
System.out.println(“4”);
}
//入口
Public static void main(String[] args){
}
关于实例语句块:每次调用构造方法之前会执行一次,自上而下执行
public class StaticTest02{
//静态语句块
Static{
System.out.println(“A”);
}
//实例语句块
{
System.out.println(“1”);
}
{
System.out.println(“2”);
}
//构造方法
StaticTest02(){
System.out.println(“StaticTest02无参数的构造方法执行!”);
}
public static void main(string[]args){
//调用构造方法
new StaticTest02();
}
}
二:Static 修饰方法时:
Static修饰的方法为静态方法
一般情况下工具类中的方法大部分都是静态方法,静态方法不用创建对象也可以直接访问方法。
public class StaticTest03{
//成员方法:必须使用“引用.”调用
public void m1(){
当前
}
//静态方法可以使用“类名.”方法调用,不能直接访问非静态数据(成员变量和方法);
//静态方法中不能使用this
public static void m2(){
}
//入口
public static voidmain(String[] args){
StaticTest03 st=newStaticTest03();
st.m1();
m2();
//静态方法按照正规方式访问:”类名.”,同时也可以用”引用.”访问
//st.m2();//编译阶段检查出st是StaticTest03 类型,编译通过,运行时仍使用 “StaticTest03.“方式访问,不需要对象;
//空的引用去访问成员的时候才会出现空指针异常
M2方法不是成员,而是静态的所以及时引用是空的,也不会报空指针异常;
StaticTest03 s=null;
S.m2();
}
}
三:Static 修饰变量时:
Static 修饰的变量为静态变量
变量分类:局部变量,成员变量(实例变量,非静态变量),静态变量;
public class StaticTest04{
public void main (String[] args){
Animal a1=new Animal(“AAA”,10);
Animal a1=new Animal(“BBB”,11);
}
}
//抽象现实世界中“陆生”动物
class Animal{
//Field
//成员变量(一个对象一份)
//在创建对象的时候初始化,并且存储在堆中的每一个对象中
String name;
int age;
String type=“陆生”;
//Constructor
Animal(string name,int age){
this.name=name;
this.age=age;
}
}
变更:static string type=“陆生”;//静态变量,被存储在方法区,所有的java 对象共享这一份,所以是类级别的变量,使用”类名.”方式访问。
什么时候声明静态变量?
如果这个属性所有的对象都有,且这个属性的值是相同的,则该属性声明为静态变量
如何访问静态变量
//类名.
System.out.println(Animal.type);
//引用.
System.out.println(a1.type);
Animal a3=null;
System.out.println(a3.type);//静态变量底层访问的时候一定使用的”类名.”和对象无关,不会出现空指针异常
什么时候初始化
成员变量:创建java对象时初始化
静态变量:在类加载阶段赋值,并只赋值一次
关于代码的顺序:
//非法向前引用
Public classstaticTest05{
Static{
System.out.println(i);
}
Static int i=100;
}
结果:加载失败
应改为:
Public classstaticTest05{
Static int i=100;
Static{
System.out.println(i);
}
}
最后总述:
类{
//必须对象存在才可以访问,采用”引用.”;
成员变量
成员方法
//可以通过 ”类名.”也可以使用 ”引用.”底层也是 ”类名.”访问;
静态变量
静态方法
//类加载时且执行一次;
静态语句块
//构造方法每调用之前执行一次;
实例语句块
//创建对象,给成员变量赋值;
构造方法
//用在成员方法和构造方法中;
this
}
空指针异常:空引用访问成员时