• java中static关键字的使用


    知识点:java中,static关键字修饰类的变量、方法、代码块、内部类

    场景:我们在创建类的方法和变量时,如果这个类在创建多个对象时,共用同一个属性或者方法,就可以使用static关键字修饰,因为static修饰的变量,在内存的静态域存在的值,被类的多个实例所共用,实际上我们在编写一个类时,就是在描述对象的属性和行为,并没有产生实质上的对象,只有使用new关键字,才会产生对象,这时系统才会分配内存给对象,其方法才可以供外部调用。如果让多个对象共用内存空间的一份数据,就可以使用static关键字。

    实例

    public class Test {
    public static void main(String[] args) {
    Person person1=new Person("张三",20,"人类");
    Person person2=new Person("李四",21,"人类");

    System.out.println(person1);
    //Person.name="王五";
    //person1.setType("非人类");
    Person.type="非人类";
    System.out.println(person1);
    System.out.println(person2);
    }
    }
    class Person{
    //实例变量
    public String name;
    public int age;
    //类变量
    public static String type;

    public Person(){
    }
    //构造方法
    public Person(String name, int age, String type) {
    this.name = name;
    this.age = age;
    this.type = type;
    }
    @Override
    public String toString() {
    return "Person[name="+name+",age="+age+",type="+type+"]";
    }
    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 getType() {
    return type;
    }
    public void setType(String type) {
    this.type = type;
    }
    }

    程序执行结果:

    上面实例可以看到,当我们实例化,类Person的两个对象,person1和person2,并且用构造方法初始化变量值以后,Person.type="非人类" 修改类的static静态变量type的值,会导致person1和person2
    两个对象的type属性都发生改变(人类=》非人类),这就因为static修饰的类变量在内存的静态域申请一份空间,类的多个实例共用这一个内存空间,如果没有用static关键字修饰的变量,在初始化多个对象时
    变量会在内存中,申请多块内存空间。如Person的name和age属性
    相关的内存分配如下图:

    修改了Person.type="非人类"之后,则变为:


    关于static修饰的类的属性和方法时补充
    (1)与对象无关,调用方法直接用类名.方法名,调用属性则使用类名.属性名,也可以使用对象来调用;
    (2)static修饰的属性,无论创建多少个对象,在内存里只有一份存储空间;
    (3)static修饰的方法不能调用非static修饰的属性或者方法,反之则可以(static修饰的类的方法和属性时,在类加载,就已经产生了,而非static方法在类实例化对象时,才产生,
    所以迟些,只有迟产生的调用早的,早来的是不能调用迟的)
    (4)static修饰的类,必然是静态的内部类

    针对于(3)静态的方法不能调用,非静态的属性或者方法,举个简单的例子,我平时在写demo时,会将main作为调试的入口类,逻辑代码写testMethod()中,在main调用
    testMethod()时就会出错。


    这正是因为main方法有static关键字修饰,是静态的方法,无法调用testmethod()非静态方法,但是可以调用静态的方法,解决方法就是把非静态的方法变成静态的方法,加static


  • 相关阅读:
    使用poi读写excel文件
    视频云全球创新挑战赛 — 视频目标分割经典算法解析
    阿里云 RTC QoS 弱网对抗之变分辨率编码
    用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?
    “蚂蚁呀嘿” 刷屏的背后:算法工程师带你理性解构神曲
    白话解读 WebRTC 音频 NetEQ 及优化实践
    未来直播 “神器”,像素级视频分割是如何实现的 | CVPR 冠军技术解读
    「 视频云大赛 — 大咖驾到 」驱动下一代技术浪潮,我们更专注价值落地
    「 视频云大赛 — 大咖驾到 」下一代技术新浪潮,正由视频云驱动
    视频云大赛|视频目标分割,下一个视频算法技术爆发点?
  • 原文地址:https://www.cnblogs.com/shuaifing/p/10376521.html
Copyright © 2020-2023  润新知