1、static存在的主要意义
static的主要意义是在于创建独立于具体对象的变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法!(使用 “类名.方法名(参数)”的方式调用静态方法,使用 “类名.静态变量” 的方式访问静态变量.)
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以 有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
2.static应用场景
修饰成员变量(静态变量)
修饰成员方法(静态方法)
静态代码块
修饰类(只能修饰内部类)
2.1静态变量:
使用 “类名.静态 变量” 的方式访问静态变量。
class people{
static int age;
}
2.2静态方法:
定义:static修饰的方法也叫做静态方法,使用 “类名.方法名(参数)”的方式调用静态方法。不知道各位有没有发现其实我们最熟悉的static静态方法就是main方法了。
class people{
static int age;
public static void eat(){
System.out.println("吃饭");
}
}
2.3静态代码块:
定义:也叫静态块、静态初始化块。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需要使用静态代码块,所以静态块常用来执行类属性的初始化 ,它可以定义在类的任何地方中除了方法体中【这里的方法体是任何方法体】。Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用。
class people{
static{
.......................
}
}
2.4静态内部类
1. 外部类如何调用静态内部类中的属性和方法
1)外部类可以通过创建静态内部类实例的方法来调用静态内部类的非静态属性和方法。
2)外部类可以直接通过“ 外部类.内部类.属性(方法)” 的方式直接调用静态内部类中的静态属性和方法。
2.静态内部类如何调用外部类的属性和方法
静态内部类如果要访问外部的成员变量或者成员方法,那么必须是静态的
1)静态内部类可以直接调用外部类的静态属性和方法
2)静态内部类可以通过创建外部类实例的方法调用外部类的非静态属性和方法。
3.如何创建静态内部类实例
创建静态内部类的时候是不需要将静态内部类的实例对象绑定到外部类的实例对象上
静态内部类属于外部类,而不是属于外部类的对象
1)在非外部类中:外部类名.内部类名 name = new 外部类名.内部类名();
2)在外部类中:内部类名 name = new 内部类名();
4.代码示例:
class Outer{
int a;
static int b;
public static void eat(){
Inner inner = new Inner(); //可以通过创建内部类实例来调用静态内部类的非静态属性和方法
inner.b = 1;
inner.water();
}
public void drink(){
// 在外部类中调用内部类的属性和方法
Outer.Inner.d = 1; // 可以通过静态内部类的全类名来调用静态内部类的静态属性(外部类名.静态内部类名.属性)
Outer.Inner.food(); // 可以通过静态内部类的全类名来调用静态内部类的静态方法(外部类名.静态内部类名.方法)
// Outer.Inner.walk(); //不能通过类静态内部类的全类名来调用内部类的非静态属性和方法
Inner inner = new Inner(); //可以通过创建内部类实例来调用静态内部类的非静态属性和方法
inner.b = 1;
inner.water();
}
private static class Inner{
int b;
static int d;
public static void food(){
}
public void water(){
// 在静态内部类中调用外部类的属性和方法
int f = b; // 可以直接调用外部类的静态属性
eat(); // 可以直接调用外部类的静态方法
// int e = a; 直接调用外部类的非静态属性出错编译出错
// test(); 直接调用外部类的非静态方法时编译出错
Outer outer = new Outer();
int e = outer.a; // 可以通过创建外部类实例来调用外部类的非静态属性
outer.drink(); // 可以通过创建外部类实例来调用外部类的非静态方法
}
}