static关键字

终于结束了答辩的所有事情,继续干,加油!

static作为java关键字之一,其主要用途是修饰属性,方法,代码块,类。下面我们详细介绍。

static修饰属性

由static修饰的成员变量全称是静态成员变量也称静态变量。由static修饰的变量是属于类的,而不是属于对象的。上代码

public class Book {
    private String title; //书籍名称
    static String cbs="人人出版社";//出版社
    public Book(String title){
        this.title=title;
    }
    public String getInfo(){
        return "图书名称:"+this.title+",出版社:"+this.cbs;
    }
}
class TextDemo{
    public static void main(String[] args) {
        Book a= new Book("java开发");
        Book b = new Book("php开发");
        Book c = new Book("C++开发");
        System.out.println(a.getInfo());
        c.cbs="其他出版社";
        System.out.println(a.getInfo());
        System.out.println(b.getInfo());
        System.out.println(c.getInfo());
    }
}
输出结果:
图书名称:java开发,出版社:人人出版社
图书名称:java开发,出版社:其他出版社
图书名称:php开发,出版社:其他出版社
图书名称:C++开发,出版社:其他出版社

这里我们可以清晰的看到在执行完c.cbs="其他出版社"这条语句之后adc三个的出版社值都进行了变化。在这个程序Book类中我们提供了讴歌由static修饰的cbs属性,而cbs属性就成为了公共属性。 创建一个类的多个对象时,每个对象不会为静态变量各自分配空间而是多个对象共享一个静态变量的内存空间,因此类的任何一个具体对象访问静态变量所取得的值是相同的,任何一个对象去修改一个静态变量时,都是对同一内存单元进行操作。
static属性与非static属性最大的区别是,所有非static属性必须产生实例化对象才可以访问,但是static属性不受实例化对象控制,也就是说,在没有实例化对象产生的情况下,依然可以使用static。

static修饰方法

static修饰的方法与static修饰的属性大致相似,都可以在没有实例化对象时由类名直接进行调用。上代码

public class Book {
    private String title; //书籍名称
    static String cbs="人人出版社";//出版社
    public Book(String title){
        this.title=title;
    }
    public static void setCbs(String cbs) {
        Book.cbs = cbs;
    }
    public String getInfo(){
        return "图书名称:"+this.title+",出版社:"+this.cbs;
    }
}
class TextDemo{
    public static void main(String[] args) {
        Book.setCbs("喵喵出版社");
        Book a= new Book("java开发");
        Book b = new Book("php开发");
        Book c = new Book("C++开发");
        System.out.println(a.getInfo());
        System.out.println(b.getInfo());
        System.out.println(c.getInfo());
    }
}
执行结果:
图书名称:java开发,出版社:喵喵出版社
图书名称:php开发,出版社:喵喵出版社
图书名称:C++开发,出版社:喵喵出版社

这样我们大概知道了static定义的属性和方法都不受实例化对象的控制,都属于独立类的功能。但是这个时候会出现一个特别麻烦的问题:此时类中的方法就变为static方法和非static方法两组。这两组方法间的访问也将受到如下的限制。
static方法不能直接访问非static属性或方法,只能调用static属性或方法。
非static方法可以访问static的属性或方法,不受任何的限制。

那我们在什么时候定义static方法呢?

我们产生实例化对象是因为要堆内存中可以保留属性信息,如人的姓名,年龄,性别等,如果一个类中没有属性的产生,就没必要去开辟堆的内存空间,这个时候可以考虑类中所有的方法使用static修饰。举个栗子

public class JSQ {
    public static int add(int x,int y){
        return x+y;
    }
}
class Text{
    public static void main(String[] args) {
        System.out.println(JSQ.add(1,2));
    }
 }
 输出结果:3

这段代码实现了计算器中的加法,JSQ这个类中也没有需要保存到堆内存中的数据,在这种情况下就可以用static修饰add方法。

static修饰代码块

由static修饰的代码块叫做静态块,静态块还分以下两种情况:一种是在非主类,另一种是在主类中使用:
举个栗子(静态块在非主类中)

public class Book {
   public Book(){
       System.out.println("A book类中的构造方法");
   }{
        System.out.println("B book类中的构造块");
    }
    static{
        System.out.println("C book类中的静态块");
    }
}
class TextDemo{
    public static void main(String[] args) {
     new Book();
     new Book();
        System.out.println(Book.msg);
    }
}
输出结果:
C book类中的静态块
B book类中的构造块
A book类中的构造方法
B book类中的构造块
A book类中的构造方法

如果对这个不理解的话可以看我另一篇博客,有详细的解释,在这里就不再赘述。解释
这段程序中我们可以看到静态块会优先调用,而且只调用一次。
在举个栗子(静态块在主类中)

class TextDemo{
    public static void main(String[] args) {
        System.out.println("hello word");
    }
    static{
        System.out.println("我是娃哈哈");
    }
}
输出结果:
我是娃哈哈
hello word

这里我们可以看出静态块优先于主函数执行,了解即可。
综上所述我们可以总结出静态块的特点:
1. 格式

static{静态代码块中执行的代码}

2. 什么时候执行

随着类的加载而加载, 并且只执行一次

3. 作用

用于给类初始化

4. 特点

优先于主函数执行, 在静态方法之前执行

static修饰类

看这个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值