*static:是一种修饰符 1、意思:静态的 2、可以修饰什么? (1)方法 (2)成员变量 (3)内部类:后面详细讲讲,这里略过,但是从字面意思你也大概知道,就是类里面的类 (4)代码块
3、修饰后有什么不同?
①这个方法,对于其他类来说可以用"类名.方法"进行调用,当然也可以使用"对象名.方法"进行调用,我们推荐用"类名.方法"(否则容易误导人,而且eclipse里面也会有警告,因为eclipse也是推荐使用类名.方法)
②静态方法中,是不允许出现:this,super,对本类的非静态属性、非静态的方法的直接使用代码的
①用static修饰的成员变量的值,表示是这个类型的所有对象“共享的”,如下图 下面我们再看看他们生成的get/set方法有什么不同 找不同: 注意:局部变量和类变量重名的时候直接类名打点即可
②static修饰的成员变量的值,存储在方法区 ③static修饰的成员变量的get/set也是静态的, ④如果在方法中有局部变量与static修饰的成员变量同名时,在静态变量前面加"类名."进行区别
结论:非静态的"对象名.",静态的用"类名."
问?黄色的脸,黑色的眼,中国人 class Chinese{ private static String face = “黄色”; private static String eyes = “黑色”; private String name; }
什么叫非静态代码块,我们再复习一下 那么什么叫静态代码块呢?是不是就是加个static就行了? 还真是
特点:(1)每一个类的静态代码块只会执行一次(2)静态代码块在第一次使用这个类之前执行,即在类初始化时执行。 疑问:从以上例子中,初始化的时候都执行了代码块,那么静态代码块和非静态代码块有什么区别呢? 另外就算我们不实例化,静态代码块也是会被执行的哦,不过你要写到main所在的类里面
由此我们可以得出结论: **(1)每一个类的静态代码块只会执行一次(跟非静态代码块相反) (2)静态代码块在第一次使用这个类之前执行,即在类初始化时执行。 (3)非静态代码块,实例化多次的话就会执行多次 **
代码如下(示例):
package com.atguigu.test03_static; public class TestStatic { private static int a;//可以修饰成员变量 private int num=10; //非静态的 public int getNum(){ return num; } public static void main(String[] args) { /* System.out.println(a); System.out.println(num); System.out.println(getNum);*/ GraphicTools tools=new GraphicTools(); tools.printRectangle(5, 10, "&");//看到没有,有黄线,不推荐使用"对象名."调用,因为会让人误会不同的对象,调用的结果不同 GraphicTools.printRectangle(3, 5, "&");//推荐使用 //String cs=this. Account a1=new Account(); Account a2=new Account(); System.out.println("a1.rate="+a1.rate+" a1.balance="+a1.balance);//因为没有私有化,可以直接a1.rate(否则就需要用1get/set) System.out.println("a2.rate="+a2.rate+" a2.balance="+a2.balance); a1.rate=0.045; a1.balance=2000; System.out.println("a1.rate="+a1.rate+" a1.balance="+a1.balance); System.out.println("a2.rate="+a2.rate+" a2.balance="+a2.balance); } } //绘图工具类 class GraphicTools{ public static void printRectangle(int line,int column,String sign){ for(int i=0;i<line;i++){ for(int j=0;j<column;j++){ System.out.print(sign); } System.out.println(); } } } //账号类 class Account{ //利率 static double rate =0.035;//是Account的所有对象共享的 double balance=1000;//如果不是static修饰,那么就不是共享的,而是Account每一个对象独立的 public static double getRate() { return rate; } public static void setRate(double rate) { Account.rate = rate; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } } //共享与不共享的理解 class Chinese{ private static String face="黄色";//共享的,所有中国人都是黄色的脸,不受个体的影响 private static String eyes="黑色"; private String name;//名字不是共享的,受个体的影响 }我们来猜一下,这段1代码(类初始化的时候)执行的顺序是什么 结果如下 此部分全部代码如下,仅供参考
/* * 3、修饰后有什么不同? * (1)方法:我们称为“静态方法”或“类方法” * (2)成员变量:称为“类变量、静态变量” * (3)内部类:后面讲 * (4)代码块 * * 非静态代码块: * 【修饰符】 class 类{ * { * 非静态代码块 * } * } * * 静态代码块: * 【修饰符】 class 类{ * static{ * 静态代码块 * } * } * 特点: * (1)每一个类的静态代码块只会执行一次 * (2)静态代码块在第一次使用这个类之前执行,即在类初始化时执行。 * * 4、类初始化即执行类初始化方法:<clinit>() * 类初始化方法,一个类只有一个。它也是有编译器编译生成的,由两部分代码组成: * (1)静态变量的显式赋值代码 * (2)静态代码块的代码 * 其中(1)和(2)是按照顺序执行 * 回忆:实例初始化方法<init>()或<init>(形参列表) * 一个类可能有好几个实例初始化方法,有几个构造器就有几个实例初始化方法,它们由编译器根据: * ①成员变量的显式赋值代码 * ②非静态代码块代码 * ③构造器的代码 * initialize:初始化 * class initialize:类初始化 * */ package com.atguigu.test03_static; public class TestStatic2代码块 { //不进行初始化 static{ System.out.println("TestStatic2静态代码块1"); } public static void main(String[] args) { /* MyClass.test(); MyClass.test(); MyClass.test(); MyClass.test(); MyClass.test();*/ /* MyClass c=new MyClass(); MyClass c2=new MyClass(); MyClass c3=new MyClass();*/ /* Kuai k=new Kuai(); Kuai k2=new Kuai(); Kuai k3=new Kuai();*/ /* * 不进行初始化 * Kuai k=new Kuai(); StaticKuai s=new StaticKuai();*/ Demo d=new Demo(); } } class MyClass{ static{ System.out.println("MyClass静态代码块"); } public static void test(){ System.out.println("静态方法test"); } } //非静态代码块 class Kuai{ { System.out.println("非静态代码块2"); } } //静态代码块 class StaticKuai{ static{ System.out.println("静态代码块3"); } } //4、类初始化的Demo class Demo{ static{ System.out.println("(1)Demo的静态代码块1"); } private static String info=assign(); static{ System.out.println("(2)Demo的静态代码块2"); System.out.println(info); } public static String assign(){ System.out.println("(3)assign()方法"); return "hello"; } }