static 关键字(静态修饰)
修饰的数据是被共享的
特点:
1.随着类的加载而加载
2.优先于对象存在
3.被类的所有对象共享——这也就是我们判断是否使用静态关键字的条件
4.可以通过类名调用
class person{
private int age;
private String name;
static String guoji;//定义静态变量
public void setPerson(int age,String name,String guoji) {
this.guoji=guoji;
this.age=age;
this.name=name;
}
public void setPerson(int age,String name) {
this.age=age;
this.name=name;
}
public void show() {
System.out.println("姓名:"+name+"---"+"年龄:"+age+"---"+"国籍:"+guoji);
}
}
public class StaticDemo2 {
public static void main(String[] args) {
/* person p1=new person();
p1.setPerson(21,"张三", "中国");
person p2=new person();
p2.setPerson(20,"李四", "中国");
person p3=new person();
p3.setPerson(18,"王二", "中国");
p1.show();
p2.show();
p3.show();
System.out.println("--------------------------------------------------");*/
/*person p1=new person();
p1.setPerson(21,"张三", "中国");
person p2=new person();
p2.setPerson(20,"李四");
person p3=new person();
p3.setPerson(18,"王二");
p1.show();
p2.show();
p3.show();
System.out.println("--------------------------------------------------");*/
/* person p=new person();
p.guoji="中国";
person p1=new person();
p1.setPerson(21,"张三");
person p2=new person();
p2.setPerson(20,"李四");
person p3=new person();
p3.setPerson(18,"王二");
p1.show();
p2.show();
p3.show();
System.out.println("--------------------------------------------------");*/
person p1=new person();
p1.setPerson(21,"张三", "中国");
person p2=new person();
p2.setPerson(20,"李四");
person p3=new person();
p3.setPerson(18,"王二");
p1.show();
p2.show();
p3.show();
System.out.println("--------------------------------------------------");
p1.guoji="美国";//改变静态变量(这里不管是改成p1,p2,p3都是一样的)
p1.show();
p2.show();
p3.show();
}
}
static注意事项
1.在静态方法中是没有this关键字的
2.静态方法只能访问静态的成员变量和静态的成员方法
静态变量和成员变量的区别
A:所属不同
1.静态变量属于类,所以也称为类变量
2.成员变量属于对象,所以也称为实例变量(对象变量)
B:内存中位置不同
1.静态变量存储于方法去的静态区
2.成员变量存储于堆内存
C:内存出现时间不同
1.静态变量随着类的加载而加载,随着类的消失而消失
2.成员变量随着对象的创建而创建存在,随着对象的消失而消失
D:调用不同
1.静态变量可以通过类名调用,也可以通过对象调用
2.成员变量只能通过对象名调用
class Static{
int num1=10;
static int num2=20;
public void getNum1() {
System.out.println(num1);
System.out.println(this.num1);
/*在成员方法中可以调用静态变量,而在静态方法中不能调用成员变量,因为成员方法比静态变量后加载进内存
System.out.println(num1);
System.out.println(this.num1);
因为这两种写法是等价的,所以在静态方法中不能调用this关键字
*/
System.out.println(num2);
}
public static void getNum2() {
System.out.println(num2);
}
}
public class StaticDemo {
public static void main(String[] args) {
Static s = new Static();
System.out.println(s.num1);
//编译错误,因为成员变量不能通过类名调用
//System.out.println(Static.num1);
//而静态变量既可以通过类名调用,又可以通过对象调用
System.out.println(s.num2);
System.out.println(Static.num2);
System.out.println("----------");
s.getNum1();
System.out.println("----------");
s.getNum2();
}
}
main方法的格式讲解:
public static void main(String[] args) {...}
public:公共的,访问权限是最大的,由于main方法是被jvm调用,所以权限要够大
static :静态的,不需要创建对象,通过类名就可以,方便jvm的调用
void:因为方法的返回值是返回给调用者的,而main方法是被jvm调用,所以返回内容给jvm没有意义
main:是一个常见的方法入口,几乎所有的语言都是以main作为入口
String[] args:字符串数组,在早期,是为了接受键盘录入的数据,但现在被Scanner代替。(了解)