zoukankan      html  css  js  c++  java
  • Java static 关键字

     

    static 修饰成员变量:

    如果一个成员变量使用了 static 关键字,那么这个变量不再属于对象自己,而是属于所在的类。 多个对象共享同一份数据

     1 package cn.itcast.day08.demo03;
     2 
     3 public class Student {
     4 
     5     private int id; //学号
     6     private String name;
     7     private int age;
     8     static String room; //所在教室
     9     private static int idCounter = 0; //学号计数器,每当new了一个新对象的时候,计数器++
    10 
    11     public Student() {
    12         this.id = ++idCounter;
    13     }
    14 
    15     public Student(String name, int age) {
    16         this.name = name;
    17         this.age = age;
    18         this.id = ++idCounter;
    19     }
    20 
    21     public String getName() {
    22         return name;
    23     }
    24 
    25     public void setName(String name) {
    26         this.name = name;
    27     }
    28 
    29     public int getAge() {
    30         return age;
    31     }
    32 
    33     public void setAge(int age) {
    34         this.age = age;
    35     }
    36 
    37     public int getId() {
    38         return id;
    39     }
    40 
    41     public void setId(int id) {
    42         this.id = id;
    43     }
    44 }
    View Code
     1 /*
     2 如果一个成员变量使用了 static 关键字,那么这个变量不再属于对象自己,而是属于所在的类。 多个对象共享同一份数据
     3  */
     4 
     5 public class Demo01StaticField {
     6 
     7     public static void main(String[] args) {
     8         Student one = new Student("郭靖", 19);
     9         one.room = "101Room";
    10         System.out.println("name: " + one.getName()
    11                 + ",age: " + one.getAge() + ",room: " + one.room + ",id: " + one.getId());
    12 
    13         Student two = new Student("黄蓉", 16);
    14         System.out.println("name: " + two.getName()
    15                 + ".age: " + two.getAge() + ",room: " + two.room + ",id: " + two.getId());
    16 
    17     }
    18 }

    static修饰成员方法:

    1. 一旦使用static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类的。

    2. 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它
    如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它

    3. 无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用:
    静态变量:类名称.静态变量
    静态方法:类名称.静态方法()

    注意事项:
    1. 静态不能直接访问非静态
    原因:在内存中先有的静态内容,后有的非静态内容。 "先人不知道后人, 但是后人知道先人"
    2. 静态方法中不能用this
    原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。静态方法调用方式是类名称.静态方法,没有对象的事

     1 public class MyClass {
     2 
     3     int num; // 成员变量
     4     static int numStatic; // 静态变量
     5 
     6     // 成员方法
     7     public void method() {
     8         System.out.println("这是一个普通的成员方法");
     9 
    10         // 成员方法可以访问成员变量
    11         System.out.println(num);
    12         // 成员方法可以访问静态变量
    13         System.out.println(numStatic);
    14     }
    15 
    16     // 静态方法
    17     public static void methodStatic() {
    18         System.out.println("这是一个静态方法");
    19         // 静态方法可以访问静态变量
    20         System.out.println(numStatic);
    21 
    22         // 静态不能直接访问非静态【重点】
    23         //System.out.println(num); // 错误写法
    24 
    25         // 静态方法中不能使用this关键字
    26         // System.out.println(this); //错误写法
    27     }
    28 }
    View Code
     1 /*
     2 一旦使用static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类的。
     3 
     4 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它
     5 如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它
     6 
     7 无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用
     8 静态变量:类名称.静态变量
     9 静态方法:类名称.静态方法()
    10 
    11 注意事项:
    12 1. 静态不能直接访问非静态
    13 原因:在内存中先有的静态内容,后有的非静态内容。 "先人不知道后人, 但是后人知道先人"
    14 2. 静态方法中不能用this
    15 原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。静态方法调用方式是类名称.静态方法,没有对象的事
    16  */
    17 
    18 public class Demo02StaticMethod {
    19 
    20     public static void main(String[] args) {
    21         MyClass obj = new MyClass(); //首先创建对象
    22         //然后才能使用没有static关键字的内容
    23         obj.method();
    24 
    25         //对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用
    26         obj.methodStatic(); //正确,不推荐。这种写法在编译之后也会被javac翻译成"类名称.静态方法名"
    27         MyClass.methodStatic(); //正确,推荐
    28 
    29         //对于本类当中的静态方法,可以省略类名称
    30         myMethod();
    31         Demo02StaticMethod.myMethod(); //完全等效
    32     }
    33 
    34     public static void myMethod() {
    35         System.out.println("自己的方法");
    36     }
    37 }


    静态static内存图

    静态代码块:

    1 public class Person {
    2     static {
    3         System.out.println("静态代码块执行");
    4     }
    5 
    6     public Person() {
    7         System.out.println("构造方法执行");
    8     }
    9 }
    View Code
    /*
    静态代码块的格式是:
    
    public class 类名称{
        static {
            // 静态代码块的内容
        }
    }
    
    特点:当第一次用到本类时,静态代码块执行唯一的一次
    静态内容总是优先于非静态,所以静态代码块比构造方法先执行
    
    静态代码块的典型用途:用来一次性的静态成员变量进行赋值
     */
    
    public class Demo04Static {
        public static void main(String[] args) {
            Person one = new Person();
            Person two = new Person();
        }
    }
    猪猪侠要努力呀!
  • 相关阅读:
    HDU5730 Shell Necklace
    BZOJ4883 [Lydsy2017年5月月赛]棋盘上的守卫
    Spring boot 配置文件
    org.joda.time.DateTime 日期操作
    Elasticsearch + Springboot 启动报错 java.net.ConnectException: Connection refused
    centos7 在docker下安装es Elasticsearch
    centos 7 。 docker 安装rabbitmq 以及集权搭建
    linux 安装mysql5.7.25
    安装rabbtimq CentOS 7
    docker + spring boot 打包 部署。
  • 原文地址:https://www.cnblogs.com/mlllily/p/14915193.html
Copyright © 2011-2022 走看看