Java 静态约束
Java 静态约束,java,jvm,Java,Jvm,static方法只能调用同一类中的静态方法/字段。问题: 为什么非静态方法/字段不应提供给static,因为一旦调用了static方法,JVM就为其创建了一个对象,如果JVM允许,它可以访问类的其他部分 为什么static方法允许来自其他类的非静态方法的对象。强制限制他们只能访问其他类的静态,并允许静态访问同一类的非静态成员,这会导致任何差异吗 一旦调用了静态方法,JVM就会为其创建一个对象 它 事实并非如此。可以调用静态方法,而无需创建该类定义静态方法的对象(请记住publicstaticvo
static
方法只能调用同一类中的静态方法/字段。问题:
static
,因为一旦调用了static
方法,JVM就为其创建了一个对象,如果JVM允许,它可以访问类的其他部分static
方法允许来自其他类的非静态方法的对象。强制限制他们只能访问其他类的静态
,并允许静态
访问同一类的非静态成员,这会导致任何差异吗publicstaticvoidmain()
)
为什么Static methods()允许来自
其他课程
这是因为无论类定义静态方法(访问其他类
)的对象是否存在,其他类
实例都可以存在
查看以获得进一步的见解
一旦调用了静态方法,JVM就会为其创建一个对象
它
事实并非如此。可以调用静态方法,而无需创建该类定义静态方法的对象(请记住publicstaticvoidmain()
)
为什么Static methods()允许来自
其他课程
这是因为无论类定义静态方法(访问其他类
)的对象是否存在,其他类
实例都可以存在
查看以获得进一步的见解 下面是静态方法和字段的java语言规范。希望对你有帮助 8.3.1.1。静态字段 如果一个字段被声明为静态的,那么不管最终创建了多少个类实例(可能为零),该字段只存在一个化身。静态字段(有时称为类变量)在初始化类时具体化(§12.4) 未声明为静态的字段(有时称为非静态字段)称为实例变量。无论何时创建一个类的新实例(§12.5),都会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量 8.4.3.2。静态方法 声明为静态的方法称为类方法 在类方法的头或体中使用任何周围声明的类型参数的名称是编译时错误 类方法总是在不引用特定对象的情况下被调用。试图使用关键字this(§15.8.3)或关键字super(§15.11.2)引用当前对象是编译时错误 未声明为静态的方法称为实例方法,有时称为非静态方法
始终针对对象调用实例方法,该对象在方法体执行期间成为关键字this和super引用的当前对象。以下是静态方法和字段的java语言规范。希望对你有帮助 8.3.1.1。静态字段 如果一个字段被声明为静态的,那么不管最终创建了多少个类实例(可能为零),该字段只存在一个化身。静态字段(有时称为类变量)在初始化类时具体化(§12.4) 未声明为静态的字段(有时称为非静态字段)称为实例变量。无论何时创建一个类的新实例(§12.5),都会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量 8.4.3.2。静态方法 声明为静态的方法称为类方法 在类方法的头或体中使用任何周围声明的类型参数的名称是编译时错误 类方法总是在不引用特定对象的情况下被调用。试图使用关键字this(§15.8.3)或关键字super(§15.11.2)引用当前对象是编译时错误 未声明为静态的方法称为实例方法,有时称为非静态方法
实例方法总是针对对象调用,该对象在方法体执行期间成为关键字this和super引用的当前对象。非静态方法有一个隐式
this
对象,可以调用其他非静态方法
静态方法不能隐式调用非静态方法,因为它没有可隐式使用的对象。没有什么可以阻止您显式使用对象调用方法
e、 g
静态方法只能调用同一类中的静态方法/字段
如示例所示,情况并非如此
为什么非静态方法/字段不应提供给static,因为一旦调用了static方法,JVM就为其创建了一个对象 JVM可以自动创建对象,但这不太可能有用,尤其是在对象没有默认构造函数的情况下 如果JVM允许,哪个可以访问类的其他部分 它可以允许,但不应该这样做,因为这将更加混乱而不是有用 为什么静态方法允许来自其他类的非静态方法的对象 静态方法允许来自所有类的对象,而不仅仅是其他类 施加限制,使它们只能访问其他类的静态成员,并允许静态成员访问其他类的非静态成员
class Main {
public static void main(String... ignored) {
new Main().nonstatic(); // calls non-static method
}
public void nonstatic() {
nonstatic2(); // calls non-static object with implicit reference to "this"
}
public void nonstatic2() {
staticMethod(this);
}
public static void staticMethod(Main main) {
main.nonstatic3(); // static calls non-static with explicit object.
}
public void nonstatic3() {
}
MyClass.staticMethod();//will not read or change any state, because there is no object here
//Create an instance of a MyClass
MyClass obj = new MyClass();
//will not read or change any state of obj.
obj.staticMethod();