static关键字所修饰的属性或者方法为公共属性与方法可以在类没有实例化的情况下通过类名直接调用,而非static的属性或者方法则必须在实例化类之后才能够调用。
class Student{
private String name;
private Integer snum;
static String collage;
//构造方法 可以调用static属性
public Student(String name,Integer snum,String collage){
this.snum = snum;
this.name = name;
Student.collage = collage;
}
//定义一个static类型的方法,主类中可以在为实例化的情况下使用
public static void tell1() {
System.out.println("学院"+ collage );
}
//非static类型的方法,必须实例化之后才能够调用
public void tell() {
System.out.println("姓名"+this.getName()+"学号"+this.getSnum()+"学院"+ collage);
}
}
//主类中在未实例化的情况下也可直接通过 类名.属性 的方式直接调用static类型的属性
public static void main(String[] args){
Student.collage = "测试学院"; //未实例化的情况下直接调用static类型的属性
Student.tell1();//未实例化的情况下直接调用static类型的方法
Student s1 = new Student();
s1.tell();//非stati类型的方法必须在实例化之后才能够使用
}
static类型的方法,不可以调用非static方法与非static属性,比如this关键字,此时会报错。
public static void tell() {
System.out.println("姓名"+this.getName()+"学号"+this.getSnum()+"学院"+ collage);
}//此时不可使用this关键字,报错
static类型的属性为公共属性,可以用来存储类中属性相同的值,避免每个类重复存储。
实例:比如在存储一个学院的学生信息时,此院学生的学院名称全部为相同的,每个学生的在存储信息时,都需要存一下学院信息这样的话,每个学生的信息中的学院信息都是独立的。这样的情况下就造成了学院名称这样一个属性的重复存储。
代码实例:collage属性不设置为static
class Teacher{
String name;
Integer age;
String collage;
public void tell(){
System.out.println("姓名:"+ name + "年龄:" + age + "学院:" + collage);
}
}
public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Teacher();
Teacher t3 = new Teacher();
t1.name = "张三";t1.age = 25; t1.collage = "数计学院";
t2.name = "李四";t2.age = 27; t2.collage = "数计学院";
t3.name = "王五";t3.age = 28; t3.collage = "数计学院";
}
内存分析:在这种情况下,不仅大量的存储的重复信息,且当collage属性发生变化时,修改此信息则变成了一个灾难。
变化:collage属性设置为static的情况下:
代码:
class Teacher{
String name;
Integer age;
static String collage;
public void tell(){
System.out.println("姓名:"+ name + "年龄:" + age + "学院:" + collage);
}
}
public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Teacher();
Teacher t3 = new Teacher();
t1.name = "张三";t1.age = 25;
t2.name = "李四";t2.age = 27;
t3.name = "王五";t3.age = 28;
}
则此时就把collage变成了公共属性供大家使用:
此时可以直接对collage进行赋值或者修改:
Teacher.collage = "信息学院";
则,所有的学生的collage属性就被成功的修改:
此时进行语句的输出结果可以看到,所有的学生用户的collage属性都被修改。
public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Teacher();
Teacher t3 = new Teacher();
t1.name = "张三";t1.age = 25;
t2.name = "李四";t2.age = 27;
t3.name = "王五";t3.age = 28;
Teacher.collage = "信息学院";
t1.tell();
t2.tell();
t3.tell();
}
/**
输出结果为:
姓名:张三,年龄:25,学院:信息学院
姓名:李四,年龄:27,学院:信息学院
姓名:王五,年龄:28,学院:信息学院
**/