静态成员
static修饰符可以修饰成员变量、成员方法和代码块。
1、用static修饰的成员变量叫静态变量。
2、用static修饰的成员方法叫静态方法。
3、用static修饰的代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。
类变量 (静态变量)
访问方式:1、类名.变量名。2、对象名.变量名
静态变量与实例变量的区别:静态变量在内存中只占一份备份,所有对象共享静态变量的值。而非静态变量只要用new创建一个新对象后就在内存中分配一份空间给变量。并且静态变量存放在栈空间,而实例变量存放在堆空间里。
类方法(静态方法)
访问方式:1、类名.方法名。2、对象名.方法名
注:1、在静态方法里只能直接访问类中其它的静态成员(变量和方法),而不能直接访问类中的非静态成员(非静态成员必须先创建类的实例之后才能使用)。
2、静态方法不能以任何方式引用this和super关键字。因为静态方法在使用前是不需要创建任何对象的,当静态方法被调用时,this所引用的对象根本就没有产生。
3、子类只能继承、重载、隐藏父类的静态方法,而不能重写父类的静态方法、也不能把父类的非静态方法写成静态方法。
静态代码块
重点内容:类中存在的静态代码块不存在于任何方法体中。
**注:**Java虚拟机加载类时执行静态代码块。若类中包括多个静态代码块,Java虚拟机将按照它们出现的次序依次执行,需注意的是,每个静态代码块都只会被执行一次。
**注:**static型的变量与静态代码块是按照它们在类中定义的先后顺序来以此执行的。
静态变量和静态方法的具体使用
public class Demo_5 {
public static void main(String [] args){
Rose f1=new Rose();
Lily f2=new Lily();
f1.show1();
f1.get_name();
f2.show1();
f2.get_name();
System.out.println("共有"+Fow.num+"朵花");
}
}
class Fow{
static int num=0;
static void show1(){
System.out.println("i'm a flower!");
num++;
}
void get_name()
{
}
}
class Rose extends Fow{
void get_name()
{
System.out.println("i'm a rose!");
}
}
class Lily extends Fow{
void get_name(){
System.out.println("i'm a lily!");
}
}
静态代码块的具体使用
public class StaticCode {
static int a=9;
public StaticCode()
{
System.out.println("构造方法");
}
static void aa()
{
System.out.println("静态方法");
}
static
{
System.out.println("第一个静态代码区");
}
void aaa()
{
System.out.println("成员方法");
}
static
{
System.out.println("第二个静态代码区");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("main()方法的执行");
StaticCode b=new StaticCode();
b.aa();
b.aaa();
}
}
程序运行结果
第一个静态代码区
第二个静态代码区
main()方法的执行
构造方法
静态方法
成员方法
解析:首先是静态变量被初始化,然后就是静态代码块被执行。然后程序进入main()方法,调用构造函数,然后利用实例对象调用静态方法和成员方法。