static关键字
首先强调一点:
static修饰的成员变量或者成员方法,从属于类,只能使用类来访问;
普通成员变量或者方法从属于对象,使用对象来访问;
静态方法不能调用非静态成员,编译会报错
static修饰成员变量
使用"类名.变量名"来操作静态变量;
static修饰的成员变量也叫静态变量,静态变量和非静态变量的区别是:
静态变量:被所有对象共享,在内存中只有一份副本,当类被初次加载时会被初始化(只会加载一次就不会再加载);
非静态变量:是对象拥有的,在创建对象的时候会被初始化(系统给初始化或者带参构造方法显式初始化成员变量),每创建一个对象就初始化一次,可以有多个副本,且各个对象拥有的成员变量的副本互不影响,因为他们都有不同的空间地址;
static修饰成员方法
使用"类名.方法名()"的方式操作静态方法;
static修饰的成员方法叫做静态方法.静态方法不依赖任何对象就可以进行访问.所以对静态方法,它是没有this指向的;(this关键字指向当前对象.静态方法不依赖对象,就没有this);
由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,在静态方法中非静态成员变量和非静态成员方法都必须依赖具体的对象才能被调用;
非静态成员方法访问静态成员方法则没有限制的;
static修饰代码块
static修饰代码块可以优化程序性能;
java语言中的代码块分为通用代码块,static代码块和构造代码块三种;
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
通用构造块和构造方法在每次new的时候都会创建新的,static方法只会在第一次new时运行
先看创建对象的执行顺序:
先执行静态构造器;
再执行通用构造器;
最后才执行构造方法;(创建对象的时候用来初始化对象)
当new一个类对象时,static修饰的成员变量首先被初始化,随后是普通成员,最后调用Person类的构造方法完成初始化。也就是说,在创建对象时,static修饰的成员会首先被初始化;
并且,当再次new该类的对象时,static修饰的类成员不会被再次初始化,在程序运行过程中,static只会在第一次new时被初始化
static关键字的误区
1.static关键字会改变类中成员的访问权限吗?
java中的static不会影响成员变量或者方法的作用域.在java中能够影响访问权限的只有private,public,protected(包括包访问权限)这几个关键字;
2.能通过this访问静态成员变量吗?
静态成员变量独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
3.static能作用于局部变量么?
static不允许用来修饰局部变量;
4.静态没有多态性:
静态属于类,多态是对象的多态;
调用静态成员变量的时候,没有多态性;
父类类型 变量名 = new 子类类名();
变量名.静态成员变量;//访问的就是父类的;
变量名.静态成员方法();//调用的是父类的成员方法;