学生类有 姓名 年龄 地址
学生的姓名年龄地址是所有对象共享的么?不是,我有我的年龄,地址你有你的
每个人不一样
小敌机有x ,y坐标, x,y坐标能写死么?是所有小敌机x,y都一样么,不是,都是自己所特有的。
所以每个对象不一样,它就是实例的
所有对象共享的就做成静态的
成员变量分两种: 1)实例变量:没有static修饰,属于对象的,存在堆中, 有几个对象就有几份 通过对象名.来访问 2)静态变量:有static修饰,属于类的,存在方法区中, 只有一份 通过类名.来访问 堆:new出来的对象(包括实例变量) 栈:方法中的局部变量(包括参数) 方法区:.class字节码文件(包括方法、静态变量) 实例变量多,还是,静态变量多----------实例变量多 实例方法多,还是,静态方法多----------实例方法多 Scanner scan = new Scanner(System.in); int b = scan.nextInt(); double c = scan.nextDouble(); //实例方法 建项目-----------小区 建包-------------楼号+单元号 建类-------------房子
static:静态的 1)静态变量: 1.1)由static修饰 1.2)属于类的,存在方法区中,只有一份 1.3)常常通过类名点来访问 1.4)何时用:所有对象所共享的数据(图片、音频、视频等) 2)静态方法: 2.1)由static修饰 2.2)属于类的,存在方法区中,只有一份 2.3)常常通过类名点来访问 2.4)静态方法没有隐式this传递, 所以在静态方法中不能直接访问实例成员
class Moo{ int a; static int b; void show(){ //有this System.out.println(this.a); System.out.println(Moo.b); } static void test(){ //没有this //静态方法没有隐式的this传递 //没有this就意味着没有对象 //而实例变量a必须通过对象点来访问 //所以,在静态方法中不能直接访问实例成员(因为实例成员要对象去点.) //System.out.println(a);
System.out.println(b);//这句为什么是对的?b是静态变量,静态变量想访问需要通过对象.么?不需要,起始在b前面默认有个Moo. System.out.println(Moo.b); } } 2.5)何时用:方法的操作仅与参数相关而与对象无关
Arrays.sort(arr); int[] a1 = Arrays.copyOf(arr,6); double a = Math.random(); //静态方法 double b = Math.sqrt(25);
Arrays.sort(arr);-----------静态方法
无论a1,a2,a3,...,a100中的哪一个对象 去sort(arr)的最终结果都是一样的 说明sort()的操作仅与参数相关而与对象无关 假设sort()不是静态的: Arrays a1 = new Arrays(); a1.sort(arr); Arrays a2 = new Arrays(); a2.sort(arr); Arrays a3 = new Arrays(); a3.sort(arr);
double b = Math.sqrt(25);----------静态方法 无论m1,m2,m3,...,m100中的哪一个对象 去sqrt(25),最终的结果都是一样的 说明sqrt()的操作仅与参数相关而与对象无关 假设sqrt()不是静态的: Math m1 = new Math(); double a = m1.sqrt(25); Math m2 = new Math(); double a = m2.sqrt(25); Math m3 = new Math(); double a = m3.sqrt(25); 那小敌机---step()行为适不适合写成静态的---看不同的结果一不一样------都是落,但每个小敌机落得结果不一样 ---如下图
3) 静态块: 3.1)由static修饰 3.2) 属于类的, 在类被加载期间自动执行 因类只被加载一次,所以静态块也只执行一次 3.3) 何时用: 加载/初始化 静态资源(图片、音频、视频等)
class Noo{ //演示静态块 static{ System.out.println("静态块"); } Noo(){ System.out.println("构造方法"); } }
package oo.day05; //static的演示 public class StaticDemo { public static void main(String[] args) { Loo o1 = new Loo(); o1.show(); Loo o2 = new Loo(); o2.show(); //System.out.println(Loo.b); //常常类名点来访问 Moo.test(); Noo o3 = new Noo(); Noo o4 = new Noo(); } } ----------------------------------
案例 public class Airplane extends FyingObject implements{
private static BufferedImage[] images;//图片首先是静态的
Airplane a1 = new Airplane();
Airplane a2 = new Airplane();
Airplane a3= new Airplane();
Airplane a4 = new Airplane();
Airplane a5 = new Airplane();
Airplane a6 = new Airplane();
public Airplane(){
images =读取图片 //可以在这给Images赋值,但有个问题,每创建一个对象,我们都读一次图片
那其实读图片其实一次就够了,所以读图片这事我们往静态块放
static{//只走一次 images = new BufferedImage[5]; //5张图片 for(int i=0;i<images.length;i++){ images[i] = loadImage("airplane"+i+".png"); } }
j静态块 静态变量 静态方法的运用
}
}