static:
static 静态
变量分类:
1.实例(成员)变量:属于对象的,有几个对象就有多少份,没有用static修饰的变 量, 都是实例变量.
2.静态变量:属于类的变量,只有一份,且被所有对象所共享的.
静态变量:
1.用static修饰的变量 就是静态变量,属于类的.
2.存储的位置是在方法区中.
3.如何用,通过类名打点调用.
内存管理:
JVM 进行管理分配:
1.栈区: 局部变量
2.堆区: new 出来的对象(实例变量)
3.方法区: 用来加载类的.class 字节码文件 (静态的变量 / 类的方法) 只会被加载一次
package oo.day04;
/**
*静态的使用演示demo
* */
public class StaticDemo {
public static void main(String[] args) {
Eoo e = new Eoo();//创建Eoo对象
e.show();
e.show();
Eoo e1 = new Eoo();//创建Eoo对象
e1.show();
Eoo e2 = new Eoo();//创建Eoo对象
e2.show();
}
}
class Eoo{
int a;//实例变量 属于对象的 通过对象访问
static int b;//静态变量 属于类的 通过类名打点访问
Eoo(){//构造方法
a++;
b++;
}
void show(){
System.out.println("实例变量a的值为:"+a+" 静态变量b的值:"+b);
}
}
静态适用性:当所有对象需要共享一份数据时,例如(图片),就可以将对应图片类型做成静态的.
静态修饰的方法:
1.用static修饰的方法 则为静态方法
2.存在方法区中
3.通过类名打点去访问
4.静态方法中,是没有隐式的this传递的,所以我们在静态方法中无法访问实例成 员(实例变量/方法).
静态方法在开发的过程中,当做一些工具方法的时候,一般都会将当前方法做成静态方法,目的就是方便调用.
//静态方法的测试
class Foo{
int a;//实例变量
static int b;//静态变量
void test(){//实例(普通)方法
System.out.println(a);//隐式的this 来进行调用
System.out.println(b);//隐式的写法 类名进行调用
}
static void fun(){ //静态方法:加了static 的方法 没有隐式this的内容了
//静态方法无法访问实例的成员(变量/方法)
// System.out.println(a);因为静态方法没有this 所以就无法访问实例的成员
System.out.println(Foo.b);
// test();静态方法无法访问实例的成员(变量/方法)
}
}
静态代码块: { } 代码块的意思
1.由static 修饰代码块 称之为静态代码块.
2.静态代码块属于类的,类被加载的时候会自动执行,优先执行静态代码块,在执行对象的构造方法,静态代码块只会被执行一次(因为类只会被加载一次).
package oo.day04;
/**
- 静态代码块的使用演示:
*/
public class StaticDemo2 {
public static void main(String[] args) {
//下面这行代码运行时所做的事情
//1.先将Goo类的.class文件加载到方法区中,并自动执行静态代码块
//2.创建Goo类的对象到堆区
//3.调用Goo的无参构造方法
Goo g = new Goo();
//下面这行代码运行时所做的事情 注意:类只会在首次使用时加载一次!
//创建Goo类的对象到堆区
//调用Goo的无参构造方法
Goo g1 = new Goo();
}
}
class Goo {
static int a;//静态变量
int b;//实例变量
Goo() {//构造方法
b = 20;
System.out.println("b的值初始化为:" + b);
}
static { //静态代码块 类被加载时执行 且只执行一次
// this.b = 10; 静态代码块无法访问实例成员
a = 10;
System.out.println("a的值初始化为:" + a);
}
}
思考?
**我们深海杀手这个项目,会存在很多个对象,举例 侦察潜艇,如果每个侦察潜艇都需要图片,这个如果设计为实例变量,那么假设1000个侦察潜艇对象,那么图片则存在1000份. 但是1000个图片都是一样的,所以我们可以将这个图片的变量设计为静态变量,那么这样 所有对象则可共享这一份图片,节省内存!
设计:项目中所需要的图片都需要进行初始化,那么需要单独的创建一个类来进行图片相关内容的处理, 类的单一职责.**
package cn.aries.submarine;
import javax.swing.*;
/**
* 图片类:主要负责项目图片资源加载的类
*/
public class Images {
public static ImageIcon battleship;//静态的图片类型----战舰
public static ImageIcon bomb; //深水炸弹图片
public static ImageIcon gameover;//游戏结束图片
public static ImageIcon mine;//水雷图片
public static ImageIcon minesubm;//水雷潜艇图片
public static ImageIcon obsersubm;//侦查潜艇图片
public static ImageIcon sea;//海洋图片
public static ImageIcon start;//开始图片
public static ImageIcon torpedo;//鱼雷图片
public static ImageIcon torpesubm;//鱼雷潜艇图片
static { //静态代码块 初始化图片
battleship = new ImageIcon("img/battleship.png");
bomb = new ImageIcon("img/bomb.png");
gameover = new ImageIcon("img/gameover.png");
mine = new ImageIcon("img/mine.png");
minesubm = new ImageIcon("img/minesubm.png");
obsersubm = new ImageIcon("img/obsersubm.png");
sea = new ImageIcon("img/sea.png");
start = new ImageIcon("img/start.png");
torpedo = new ImageIcon("img/torpedo.png");
torpesubm = new ImageIcon("img/torpesubm.png");
}
public static void main(String[] args) {
//测试信息 都是 8 说明没有问题
System.out.println(battleship.getImageLoadStatus());
System.out.println(bomb.getImageLoadStatus());
System.out.println(gameover.getImageLoadStatus());
System.out.println(mine.getImageLoadStatus());
System.out.println(minesubm.getImageLoadStatus());
System.out.println(obsersubm.getImageLoadStatus());
System.out.println(sea.getImageLoadStatus());
System.out.println(start.getImageLoadStatus());
System.out.println(torpedo.getImageLoadStatus());
System.out.println(torpesubm.getImageLoadStatus());
}
}