zoukankan      html  css  js  c++  java
  • 【Java基础】static关键字

    一、static修饰成员变量

      定义一个学生类,其中grade使用static修饰

    public class Student {
    
        private String name;
        private int age;
        static String grade;//所在班级
    
        public Student() {
    
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        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;
        }
    }

      创建Student对象,且只对其中一个对象的grade赋值,此时第二个对象的grade会自动赋值

    /*
    一旦使用static关键字,那么这个变量不再属于对象自己,而是属于所在的类
    即多个对象共享同一份数据
    
     */
    public class Demo01StaticField {
    
        public static void main(String[] args) {
    
         Student one = new Student("郭靖",19);
         //只对one的属性进行赋值
         one.grade = "三年二班";
         System.out.println("姓名:" + one.getName()
                 + " 年龄:" + one.getAge()
                 + " 班级:" + one.grade);
    
         Student two = new Student("黄蓉",18);
         System.out.println("姓名:" + two.getName()
                 + " 年龄:" + two.getAge()
                 + " 班级:" + two.grade);//two的属性值此时也会自动赋值
        }
    }

    二、static修饰成员方法

    public class MyClass {
    
        int num;//成员变量
        static int numStatic;//静态变量
    
        //成员方法
        public void method(){
            System.out.println("这是一个普通的成员方法");
            //成员方法可以直接使用成员变量
            System.out.println(num);
            //成员方法可以直接使用静态变量
            System.out.println(numStatic);
        }
        //静态方法
        public static void methodStatic(){
            System.out.println("这是一个静态方法");
            //静态方法可以直接使用静态变量
            System.out.println(numStatic);
            //静态方法不能直接使用成员变量
            //System.out.println(num);
        }
    }
    /*
    一旦使用static修饰成员方法,那么此方法就成为了静态方法;
    静态方法不属于对象,而是属于类的
    
    如果没有static关键字,必须首先创建对象,通过对象才能使用该方法
    如有有static关键字,那么不需要创建对象,直接通过类名称来使用该方法
    
    注意事项:
    1、静态不能直接访问非静态
        原因:内存中是 先有 静态内容,后有 非静态内容
    2、静态方法中不能用this
     */
    public class Demo02StaticMethod {
    
        public static void main(String[] args) {
            //创建Myclass对象
            MyClass obj = new MyClass();
            //通过对象调用成员方法
            obj.method();
    
            //调用静态方法,可以通过对象名调用(不推荐),也可以通过类名来调用
            obj.methodStatic();//正确,但不推荐
            MyClass.methodStatic();//推荐写法
    
            //对于本类当中的静态方法,可以省略类名称
            myMethod();
            Demo02StaticMethod.myMethod();
        }
    
        public static void myMethod(){
            System.out.println("这是一个本类中的静态方法");
        }
    }

    三、静态代码块

    /*
    public class 类名称{
    
        static{
            代码块内容
        }
    }
    
    特点:
    执行唯一的一次;
    静态内容总是优先于非静态
    
    典型用途:用来一次性地对静态变量进行赋值
     */

      示例:

    public class Person {
    
        static {
            System.out.println("静态代码块执行啦");
        }
    
        public Person(){
            System.out.println("构造方法执行啦");
        }
    }
    public class Demo03Static {
        public static void main(String[] args) {
            Person one = new Person();
    
            Person two = new Person();
        }
    }

      执行结果:

      静态代码块执行啦

      构造方法执行啦

      构造方法执行啦

    根据执行结果可以说明:1、静态代码块优先执行;2、静态初始化块只在类加载时执行一次,所以当再次创建对象 two 时并未执行静态初始化块。

    万丈高楼平地起。
  • 相关阅读:
    properties,yml 文件读取 pom.xml 文件变量
    Docker实战编写Dockerfile
    在SpringBoot中实现异步事件驱动
    HttpClient封装工具类
    oracle临时表的两种方式
    关于cxGrid选中行操作关联数据集的一种方法
    安全释放 TreeView的DATA!
    行字段值拼接成字符串
    delphi中遍历枚举类型的方法
    C#将XML字符串转换成实体对象,并去除cdata
  • 原文地址:https://www.cnblogs.com/jcl226/p/13090483.html
Copyright © 2011-2022 走看看