小蔡学Java

为什么接口不可以有静态变量、静态代码块

2023-09-05 10:26 1510 0 Java基础 Java

1.概念由static修饰的代码块称为静态代码块,每个类中可以有多个静态代码块,每个静态代码块都只会在类加载时执行一次。对那些只需要进行一次操作的初始化代码,就可以放在静态代码块中执行。静态代码块具有如下特性:

● 静态代码块类似于是一个方法,但它不可以在方法中调用,也不能存在于任何方法体中;

● 静态代码块可以写在类中的任何地方,一个类中也可以有多个静态代码块;

● 静态代码块在类加载时执行;

● 静态代码块优先于动态代码块执行;

● 如果类中包含多个静态代码块,则JVM虚拟机会按它们在类中出现的先后顺序依次执行,每个静态代码块只会被执行一次;

● 静态代码块与静态方法一样,不能直接访问类的实例变量和实例方法,需要通过类的实例对象来访问

2.语法静态代码块的语法格式如下:

static {
//代码内容
}

静态代码块的语法格式比较奇特,static关键字后面直接跟一个{ }花括号,这就是静态代码块。我们可以在这个静态代码中编写若干代码,效果类似于是一个方法。

3.案例

3.1定义User类我们先来定义一个User类,在该类中定义一个静态代码块,一个非静态代码块,还有一个构造方法。在Java中,按照代码执行时间的早晚:静态代码块 > 非静态代码块 > 构造方法 > 普通方法我们要记住以下几点:

● 静态代码块,在类被加载时就会自动调用,且只会被调用一次。

● 非静态代码块,在对象被创建时自动调用,每次创建对象时都会执行。

● 而构造方法,每创建一个对象就会执行一次。

public class User {

    //静态属性,属于整个类,被整个类的所有对象共享!
    static int num = 10;

    //普通属性,属于某个对象,是对象私有的!
    private int age = 20;

    //静态代码块,在类被加载时自动调用,且只会被调用一次。比普通代码块先执行!
    static {
//无论创建几个User对象,本静态代码块都只会执行一次,num++变成11
        System.out.println("这是静态代码块,num=" + (num++));
    }

    //非静态代码块,在对象被创建时自动调用,每次创建对象时都会执行,比构造方法先执行!
    {
        //每创建一个User对象,就会执行一次本代码块,num++变成12,age=20.
        System.out.println("这是非静态代码块,num=" + (num++) + ",age=" + (age++));
    }

    //构造方法
    public User() {
    //每创建一个User对象,就会执行一次构造方法,num++变成13,age=21.
        System.out.println("这是无参构造方法,num" + (num++) + ",age=" + (age++));
    }
}

3.2定义测试类接下来我们再定义一个测试类,在这里创建3个User对象。

3.3执行结果分析上面的代码执行结果如下图所示:

在上述代码中,我们创建了3个User对象。其中,无论构造几次对象,一个类中的一个static静态代码块都只会执行一次,所以在构造第一个User对象时num是10。然后执行非静态代码块,num变成11,age等于20。接着执行构造方法。num=12,age=21。

之后开始构造第2个对象,此时只执行非静态代码块和构造方法,不会再执行静态代码块。因为num是静态属性,所以第2个user对象继续共享num变量,num=13;而因为age是成员变量,所以age是一个新的成员变量,age仍然是20。接着执行构造方法,num=14,age=21。最后创建第3个User对象,过程和上述一样。

4.接口中为什么不能有静态代码块

在Java中,接口是一个抽象的概念,用于定义一组公共的方法和常量,但是接口不能有实现代码。这意味着接口不能包含构造函数,也不能包含静态代码块。一个静态代码块在Java中是一个被static关键字修饰的代码块,用于在类被加载时执行一次。但是,由于接口只是一个声明,而不是一个具体的类,因此它不能被加载,也就不能执行静态代码块。下面是一个简单的代码示例,用于说明为什么接口不能有静态代码块:

public interface MyInterface {
    static {
    	System.out.println("This is a static block in interface.");
    }
}

当你尝试编译这个代码时,你会收到以下错误信息:

MyInterface.java:frowning: error: interface cannot have static initializer
static {
^
1 error

总结

这表明了一个接口不能包含静态代码块。总之,接口是Java中的一个抽象概念,它只包含方法和常量的声明,而没有实现代码,因此接口不能包含静态代码块。

Java中的接口(interface)不能有静态变量、静态代码块,这是因为接口仅用来定义行为规范,不提供具体实现,不是用来存储状态或数据的地方。静态变量属于类级别的变量,它们与特定的实现类相关联,而不是与接口本身相关联。因此,不允许有静态变量和静态代码块。

接口的主要目的是描述一组行为规范,以便实现类去实现,而不是存储数据。**如果接口允许定义静态变量,那么每个实现类都会共享同一个静态变量,这可能导致问题和混乱。**因为不同的实现类可能需要不同的静态变量或不同的初始值。

另外,接口的成员变量默认是 public static final 的,也就是说它们是静态常量。

如果你需要在接口中定义一些静态常量,可以直接声明成员变量,并自动应用上述规则。例如:

public interface MyInterface {
    int MAX_VALUE = 10;
    // ...
}

一: 类的静态代码块通常用来对类的静态变量进行初始化。

接口中的变量都是静态常量,静态常量按照Java语法规则,在定义的时候就必须初始化,

例如:

public static final MAX_SIZE=11;

既然接口的静态常量已经在定义的时候被初始化,就没有必要提供静态代码块来进行初始化的操作了。

这是解释接口没有静态代码块的一个原因。

二: 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错),所以不能含有静态代码块。

总结来说,设计接口的目的是定义行为规范,而不是提供具体实现,不是用于存储状态或数据。接口中不能有静态变量及静态代码块,不是实现上的要求,而是设计上的要求。

参考链接1:https://blog.csdn.net/m0_37692562/article/details/132233340


参考链接2:https://www.zhihu.com/question/361261600

评论( 0 )

  • 博主 Mr Cai
  • 坐标 河南 信阳
  • 标签 Java、SpringBoot、消息中间件、Web、Code爱好者

文章目录