A:static关键字的特点
------a:随着类的加载而加载
-------b:优先于对象存在
-------c:被类的所有对象共享
----------举例:
------------- 其实这个特点也是在告诉我们什么时候使用静态?
-------------------如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
--------------------共性用静态,特性用非静态
------ d:可以通过类名调用
------------ 其实它本身也可以通过对象名调用。
-------------推荐使用类名调用。
------------- 静态修饰的内容一般我们称其为:与类相关的,类成员
------a:随着类的加载而加载
-------b:优先于对象存在
-------c:被类的所有对象共享
----------举例:
------------- 其实这个特点也是在告诉我们什么时候使用静态?
-------------------如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
--------------------共性用静态,特性用非静态
------ d:可以通过类名调用
------------ 其实它本身也可以通过对象名调用。
-------------推荐使用类名调用。
------------- 静态修饰的内容一般我们称其为:与类相关的,类成员
B: static的注意事项
* a:在静态方法中是没有this关键字的
* 如何理解呢?
* 静态是随着类的加载而加载,this是随着对象的创建而存在。
* 静态比对象先存在。
* b:静态方法只能访问静态的成员变量和静态的成员方法
* 静态方法:
* 成员变量:只能访问静态变量
* 成员方法:只能访问静态成员方法
* 非静态方法:
* 成员变量:可以是静态的,也可以是非静态的
* 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
* 简单记:
* 静态只能访问静态。
静态变量和成员变量的区别* 静态变量也叫类变量 成员变量叫对象变量 * A:所属不同 * 静态变量属于类,所以也称为为类变量 * 成员变量属于对象,所以也称为实例变量(对象变量) * B:内存中位置不同 * 静态变量存储于方法区的静态区 * 成员变量存储于堆内存 * C:内存出现时间不同 * 静态变量随着类的加载而加载,随着类的消失而消失 * 成员变量随着对象的创建而存在,随着对象的消失而消失 * D:调用不同 * 静态变量可以通过类名调用,也可以通过对象调用 * 成员变量只能通过对 象名调用public class demo_static { public static void main(String[] args) { Person p1 = new Person(); //创建对象 p1.name = "伍老师"; //调用姓名属性并赋值 p1.country = "中国"; //调用国籍属性并赋值 Person p2 = new Person(); p2.name = "艳老师"; //p2.country = "陕西"; p1.speak(); p2.speak(); Person.country = "浮萍"; //静态多了一种调用方式,可以通过类名.不需要创建对象,节省内存,推荐使用 System.out.println(Person.country); Demo d = new Demo(); d.print1(); d.print2(); Demo.print2(); } } class Person { String name;//姓名 static String country;//国籍 public void speak() { //说话的方法 //this.country = "浮萍"; //它本身也可以通过对象名调用。 System.out.println(name + "..." + country); } } class Demo { int num1 = 10; //非静态的成员变量 static int num2 = 20; //静态的成员变量 public void print1() { //非静态的成员方法,既可以访问静态的成员也可以访问非静态的 System.out.println(num1); System.out.println(num2); } public static void print2() {//静态的成员方法 //System.out.println(num1);//Cannot use this in a static context //System.out.println(this.num1);//静态的成员方法不能访问非静态的,错误: 无法从静态上下文中引用非静态 变量 num1 //在静态方法中是没有this关键字的 System.out.println(num2); } }