java的静态内部类中定义的变量是全局的么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的静态内部类中定义的变量是全局的么?相关的知识,希望对你有一定的参考价值。

A B C三个类,C为A的静态内部类。C中的静态和非静态变量,这些变量在B中使用时,都是全局的么?

你把静态变量和全局变量的概念弄混了吧。静态变量是public的只要被jvm加载所有的类都可使用,也就是说静态变量是多个类共用的;而全局变量(非静态变量)是指在一个类内部,可以被本类任意调用。c本身是静态的适用范围要远远大于你所谓的全局变量,所以你在b中无所谓全局与非全局。 参考技术A Java里面是没有跟C/C++那样全局的概念的,C作为A的静态内部类,是可以说明它的可见性的,如果声明为public,那么B无论在什么地方都可以使用这个C类,如果是声明为protected,则只能是B是A的子类的时候才能使用C类,如果默认不声明,则B必须跟A在同一个package里面才能使用C,如果声明为private,则B必须也是A的内部类才能使用C类。
这跟一般的全局的概念是有点不同的。
声明C为静态内部类,不过是可以在不实例化A的情况下直接使用C类而已,但是还是受到可见性声明的约束的。本回答被提问者和网友采纳

Java中成员变量局部变量全局变量静态变量成员变量

开头注意:static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

根据定义变量位置的不同,可以将变量分为成员变量和局部变量。

成员变量是 定义在一个类的变量:类中方法外
局部变量是定义在一个方法内的变量:方法中

成员变量分为:
静态属性:随类的存在而存在,是在类加载的初始化
非静态属性:随实例的属性存在而存在。

局部变量:
局部变量不能加static,包括protected, private, public这些也不能加。局部变量保存在栈中。
局部编程必须在声明时初始化。

成员变量和局部变量区别:
成员变量可以不显式初始化,它们可以由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值。
成员变量存在于堆内存,局部变量存在于栈内存。

静态变量:类中方法外,用static修饰
生命周期:JVM第一次读到这个类并加载类时开始,类销毁不存在。
类加载过程:

加载父类(如果父类已经加载过,则不在加载)。
初始化静态属性 。
按顺序的初始化静态代码块 初始化的前提就是分配空间 。
静态变量存在于方法区即静态区(方法区包含整个程序中唯一存在的元素)

全局变量(在java中可以理解为用static final修饰):在java中全局变量也称成员变量,是创建对象的时候分配内存的。全局常量存于全局数据区。
创建对象过程为:

分配空间。
创建父类对象。
初始化成员变量。
调用构造方法创建一个对象。
方法(包括静态方法)中不能有静态变量,方法中存在的是局部变量,而不是静态变量。静态变量是定义在类中,方法体外面的。

 


实例变量:定义在类中但在任何方法之外。

当一个对象被实例化之后,每个实例变量的值就跟着确定;

实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
访问修饰符可以修饰实例变量;实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObjectReference.VariableName。
 实例变量与局部变量异同
局部变量:定义在方法之中的变量。
1. 局部变量要先赋值,再进行运算,而实例变量均已经赋初值。(这是局部变量和实例变量的一大区别)
2. 实例变量的对象赋值为null。
3. 局部变量不允许范围内定义两个同名变量。实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效。
4. 实例变量和局部变量允许命名冲突。

 

以上是关于java的静态内部类中定义的变量是全局的么?的主要内容,如果未能解决你的问题,请参考以下文章

Java中成员变量局部变量全局变量静态变量成员变量

浅谈Java中的内部类

Java中的四种内部类总结

java 内部类

一个java内部类有几个分类?

实例变量,局部变量,全局变量,静态全局变量