Java基础——static关键字

一、基本信息:

1.什么是static关键字:

        static修饰的代码属于类,定义的变量存储在方法区的静态常量池当中

2.为什么存在static关键字:

       方便类去使用自己的变量

3.static可以修饰什么?

  1. 修饰变量
  2. 修饰方法
  3. 修饰类

 二、static的应用:

1.修饰变量:

修饰的变量叫做类变量,存储在方法区的静态常量池中,被所有该类产生的对象所共享的

例:

public class Person {
    public String name= "张三";
    public static String address = "BaoDing";

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                "address='" + address + '\'' +
                '}';
    }
}
public class Test {
    public static void main(String[] args){
        Person p1 = new Person();
        Person p2 = new Person();
        p1.name= "李四";
        p1.address="BeiJing";
        p2.name="王五";
        p2.address="ShangHai";

        System.out.println(p1.toString());
        System.out.println(p2.toString());

    }
}

 运行结果:

Person{name='李四'address='ShangHai'}

Person{name='王五'address='ShangHai'}

为什么二人的地址一样呢,就在于static关键字修饰变量,来看其内存图:

在静态常量池里边存储的static所修饰的代码,person.class存储在方法区中(类信息是存储在方法区当中的)。开始时,address=保定

1.main方法入栈,创建出p1,p2两个对象,地址指向0x1,0x2;此时,name的值为张三

2.p1.name= 李四;将0x1里的name变成李四;静态常量池中的address改为北京

p2.name= 王五;将0x2里的name变成王五;静态常量池中的address改为上海

3.最终输出结果,为Person{name='李四'address='ShangHai'}

Person{name='王五'address='ShangHai'} 由此可知,static修饰的变量static修饰的变量是被所有类所共享的。

2.修饰方法:

1. 类级别的方法

  • 独立于实例static 方法属于类本身,而不是任何特定的对象实例。这意味着你可以在不创建类实例的情况下调用 static 方法。

2. 访问限制

  • 只能访问 static 成员static 方法只能直接访问类中的 static 变量和 static 方法。它不能直接访问实例变量或实例方法,除非通过类的实例访问这些非 static 成员。

原因:非静态方法想要表达时就已经创建了对象,那么静态方法是一定存在的

3. 调用方式

  • 通过类名调用:虽然可以通过类的实例调用 static 方法,但推荐通过类名直接调用,以提高代码的可读性和清晰性。
public class Example {
    public static void staticMethod() {
        System.out.println("Static method called");
    }
}

public class Main {
    public static void main(String[] args) {
        Example.staticMethod(); // 推荐:通过类名调用 static 方法
    }
}

4. 不可被重写

  • 不能被实例方法重写static 方法不能被子类重写。子类可以定义一个与父类中 static 方法同名的方法,但这被称为方法隐藏,而不是重写。

注意:main方法是static修饰的方法

方法要被main方法调用的解决方案:

1.1.在非静态方法上加入static关键字

1.2.在main方法中创建对象,让对象调用非静态方法

3.修饰代码块:

在main方法之前运行,目的是优化程序

public class Example {
    static int count;

    static {
        count = 10; // 在 static 块中初始化 static 变量
        System.out.println("Static block executed");
    }

    public static void printCount() {
        System.out.println("Count: " + count);
    }
}

public class Main {
    public static void main(String[] args) {
        Example.printCount(); // 输出 Count: 10
    }
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值