static关键字

1、为什么要使用static关键字
我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
static关键字_第1张图片
2、类属性、类方法的设计思想
类属性(类变量)作为该类各个对象之间共享的变量。在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用

public class Chinese {
    private static String country = "中国";
    private String name;
    private int age;

    public Chinese() {
    }

    public Chinese(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static String getCountry() {
        return country;
    }
    public static void setCountry(String country) {
        Chinese.country = country;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public String toString(){
        return "国籍:"+country+",姓名:"+name+",年龄:"+age;
    }
}
    public static void main(String[] args) {
        Chinese c1 = new Chinese("张",23);
        Chinese c2 = new Chinese("李四",33);

        System.out.println(c1);
        System.out.println(c2);

        Chinese.setCountry("中华人民共和国");//类变量可以通过类的静态方法修改,不需要通过对象调用

        System.out.println(c1);
        System.out.println(c2);

        c1.setCountry("中华民族");//即使通过对象修改,也是修改所有对象共享的数据,会影响所有对象

        System.out.println(c1);
        System.out.println(c2);

        c1.setName("张丰");//name属性是实例变量,一个对象修改,不会影响其他对象

        System.out.println(c1);
        System.out.println(c2);
    }

static关键字_第2张图片
static关键字_第3张图片

3、如何使用static
使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备以下特点:

  • 随着类的加载而加载
  • 优先于对象存在
  • 修饰的成员,被所有对象所共享
  • 访问权限允许时,可不创建对象,直接被类调用

(1)当static修饰属性时,叫类变量(类属性(class Variable))由该类的所有实例共享
(2)static修饰方法,是类方法(class Method)
没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类方法。

注意:
(1)在static方法内部只能访问类变量与类方法(类的static属性和静态方法),不能访问类的实例变量和成员方法(非static属性和方法)。
(2)因为不需要实例就可以访问static方法,因此static方法内部不能有this。(也不能有super ? YES!)
(3)重载的方法需要同时为static的或者非static的。

public class TestStatic {
    public static void main(String[] args) {
        Student stu1=new Student("张");
        Student stu2=new Student("李四");

        System.out.println("学生姓名:"+stu1.getName()+",所属学校:"+Student.getSchool());
        System.out.println("学生姓名:"+stu2.getName()+",所属学校:"+Student.getSchool());

    //  stu1.setSchool("北京大学");//虽然通过对象可以访问静态方法、属性,但是建议还是通过类名去访问
        Student.setSchool("北京大学");//当静态成员变量值被改变,所对象的该属性值都会被改变
        stu1.setName("张丰");//而某个对象的非静态成员变量值被改变,不影响其他对象
        //静态方法,通过类名访问   
        System.out.println("学生姓名:"+stu1.getName()+",所属学校:"+Student.getSchool());
        System.out.println("学生姓名:"+stu2.getName()+",所属学校:"+Student.getSchool());
    }
}
class Person{
    static String a;
}
class Student extends Person{
    //静态成员变量,是类变量或类属性,它是属于类的,即每个该类的实例对象共享这个属性值
    private static String school="北京大学";
    //非静态成员变量的值是每个对象独享
    private String name;

    public Student() {
        super();
    }

    public Student(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //静态成员变量如果私化,那么其getter和setter方法通常也是static的
    public static String getSchool() {
        return school;
    }

    public static void setSchool(String school) {
//      this//在静态方法中不能出现this和super关键字
//      getName();//在静态方法中不能调用非静态的方法
        Student.school = school;
    }

}

(3)修饰代码块

修饰代码块请查看此篇博客

(4)修饰内部类

你可能感兴趣的:(Java-SE)