Java语言基础8:static关键字、静态变量和成员变量的区别、静态内容的内存结构图、main方法是静态的
1、static 关键字的特点(可以修饰成员变量,也可以修饰成员方法)
—— 静态的内容,其为与类相关,叫做类成员。其余的非静态内容,其于具体的对象相关,被称之为对象成员。
(1)随着类的加载而加载。
(2)优先于对象存在。
(3)被类的所有对象共享。(这也是我们判断是否使用静态关键字的条件!!!如果类中的某个成员变量需要被类的所有对象共享,那么它需要被定义成静态的static!!!举例:饮水机是静态的,水杯是非静态的。)
(4)静态的内容,可以通过类名调用,也可以通过对象名来访问。
2、static 关键字的注意事项
(1)在静态方法中是没有this关键字的。( 因为 静态是随着类的加载而加载的,this是随着对象的创建而存在,静态比对象先存在,先存在的东西去访问后面还没生成的东西,可以么?不能!所以在静态方法中是没有this关键字的。)
(2)静态方法只能访问静态的成员变量和静态的成员方法。非静态方法可以访问非静态的成员变量和非静态的成员方法,也可以访问静态的成员变量和静态的成员方法。( 静态只能访问静态,非静态可以访问一切!!!)
(3)main方法是静态的,根本就不用创建对象就可以调用main方法。
3、静态内容的内存结构图
(1)静态的内容存在于方法区的静态区。
(2)静态的内存结构图:
4、静态变量和成员变量的区别
(1)所属不同。
静态变量属于类,所以也称为类变量。
成员变量属于对象,所以也称为对象变量( 实例变量 )。
(2)在内存中的位置不同。
静态变量存储于方法区的静态区。
成员变量存储于堆内存。
(3)在内存中出现的时间不同。
静态变量随着类的加载而加载,随着类的消失而消失。
成员变量随着对象的创建而存在,随着对象的消失而消失。
(4)调用不同。
静态变量可以通过类名调用,也可以通过对象调用。
成员变量只能通过对象名调用。
5、main方法是静态的
(1)main方法的格式讲解:public static void main( String[ ] args) { ...... }
public:公共的,访问权限是最大的,由于main方法是被Java虚拟机调用,所以权限要够大。
static:静态的,不需要创建对象,通过类名就可以调用,方便JVM的调用。
void:方法的返回值是返回给调用者的,而main方法是被JVM调用的,你返回内容给JVM没有意义。
main:这是一个常见的方法入口。
String[ ] args:这是一个字符串数组。值去哪儿了?这个东西早期是为了接收键盘录入的数据的。
格式是: java MainDemo hello world java
(3)代码演示:
/* main方法的格式讲解: public static void main(String[] args) {...} public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。 static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。 void:因为我们曾经说过,方法的返回值是返回给调用者,而main方法是被jvm调用。你返回内容给jvm没有意义。 main:是一个常见的方法入口。我见过的语言都是以main作为入口。 String[] args:这是一个字符串数组。值去哪里了? 这个东西到底有什么用啊?怎么给值啊? 这个东西早期是为了接收键盘录入的数据的。 格式是: java MainDemo hello world java */ class MainDemo { public static void main(String[] args) { //System.out.println(args); //[Ljava.lang.String;@175078b //System.out.println(args.length); //0 //System.out.println(args[0]); //ArrayIndexOutOfBoundsException //接收数据后 System.out.println(args); //[Ljava.lang.String;@175078b System.out.println(args.length); //3 //System.out.println(args[0]); for(int x=0; x<args.length; x++) { System.out.println(args[x]); //hello world java } } }
6、
(1)测试类的作用:创建其他类的对象,调用其他类的功能方法。
(2)把构造方法私有化,则外界就不能构造对象了。把该工具类中的方法设置为static的,就可以用类名调用了。
(3)如何制作一个说明书呢?如何使用一个说明书呢?只需要一个class文件和一个说明书就可以使用工具类了。参考刘意老师的Java视频day08文件夹!
7、如何使用java的API文档?
8、代码块
(1)在Java中,使用{ } 括起来的代码被称之为代码块。
(2)根据其位置和声明的不同,可以分为:
A:局部代码块:在方法中的局部位置出现。作用:用于限定变量的生命周期,及早释放,提高内存利用率。
B:构造代码块:在类中的成员位置出现,用{ } 括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。作用:可以把多个构造方法中相同的代码存放到一起,对 对象进行初始化。。
C:静态代码块:在类中的成员位置出现,用{ } 括起来的代码,并且加上static修饰。作用:用于给类进行初始化,在加载的时候就执行,并且只执行一次,一般是对类进行初始化。。
D:同步代码块(在多线程中讲解)。
另: 面试题? 静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 --> 构造代码块 --> 构造方法。 静态代码块:只执行一次。 构造代码块:按照顺序,每次调用构造方法都执行。
示例:
/* 代码块:在Java中,使用{}括起来的代码被称为代码块。 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期。 构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。 作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了。 作用:一般是对类进行初始化。 面试题? 静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 -- 构造代码块 -- 构造方法 静态代码块:只执行一次 构造代码块:每次调用构造方法都执行 */ class Code { static { int a = 1000; System.out.println(a); } //构造代码块 { int x = 100; System.out.println(x); } //构造方法 public Code(){ System.out.println("code"); } //构造方法 public Code(int a){ System.out.println("code"); } //构造代码块 { int y = 200; System.out.println(y); } //静态代码块 static { int b = 2000; System.out.println(b); } } class CodeDemo { public static void main(String[] args) { //局部代码块 { int x = 10; System.out.println(x); } //找不到符号 //System.out.println(x); { int y = 20; System.out.println(y); } System.out.println("---------------"); Code c = new Code(); System.out.println("---------------"); Code c2 = new Code(); System.out.println("---------------"); Code c3 = new Code(1); } }
