声明:如果你觉得自己掌握的不错的话!那就直接看总结吧,总结在后面哦!
看到标题时,肯定有同鞋会有疑问?类变量不就是静态变量吗?等等一系列问题。对,你说的没错!这说明你有一定的基础了,不错不错,继续努力!本文将解答困扰小白的难题:成员变量、局部变量、类变量、静态变量和实例变量的区别
在本文重点开始之前,先让我们看看变量的声明
Java 变量类型
在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:
type variable = value;
其中type
是Java的类型之一(例如int
或String
),而variable
是变量的名称(例如x
或 name
等等)。等号(=)
用于将值分配给变量。
以下列出了一些变量的声明实例。注意有些包含了初始化过程。
int a, b, c; // 声明三个int型整数:a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
byte g = 22; // 声明并初始化 g
String h = "Braidhu"; // 声明并初始化字符串 s
double pi = 3.14159; // 声明了双精度浮点型变量 pi
char x = 'x'; // 声明变量 x 的值是字符 'x'。
好,接下来我们进入正轨
- Java语言支持的变量类型有:
- 成员变量:在类体中定义的变量。
- 局部变量:在类的方法中定义的变量。
这时小白就会问了:“博主、博主!那类变量、静态变量、和实例变量哪去了?” 好!很有精神!接下来我将给你一一解答。
1.成员变量
在类体中所定义的变量被称为成员变量,成员变量在整个类中都有效。类的成员变量又可分为两种:静态变量和实例变量,其中静态变量又称为类变量
看到这里你就明白了吧!对,成员变量包含静态变量(类变量)和实例变量;类变量就是静态变量、静态变量就是类变量。 接下来我就讲讲类变量(静态变量)和实例变量。
-
类变量(静态变量)
- 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
好的!当你看到以上文字时是不是很崩溃?其实我也看的很崩溃,但如果你想提高就尽量都了解,毕竟多掌握一点知识对你有没啥坏处,是吧!。
下面举个例子:
public class Variable{
static int allClicks=0; // 类变量
}
}
-
实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
- 实例变量可以声明在使用前或者使用后;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
实例
下面举个例子:
class Person {
String name; // 这个实例变量对子类可见
private int age;// 私有变量,仅在该类可见
//这个成员方法专门用来向age设置数据
public void setAge(int num){
age=num;
}
//这个成员方法专门用来私语获取age数据
public int getAge(){
return age;
}
public void show(){
System.out.println("我叫:"+name+",年龄:"+getAge());
}
}
public class Me{
public static void main(String[] args){
Person p=new Person();
p.name="Braidhu";
p.setAge(19);
p.show();
}
}
运行结果:
run:
我叫:Braidhu,年龄:19
成功构建 (总时间: 0 秒)
2.局部变量
- 局部变量声明在方法、构造方法或者语句块中;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
- 访问修饰符不能用于局部变量;
- 局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量是在栈上分配的。
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
public class Test{
public void pupAge(){
int age = 0;
age = age + 3;
System.out.println("小狗的年龄是: " + age);
}
public static void main(String[] args){
Test test = new Test();
test.pupAge();
}
}
运行结果:
小狗的年龄是: 3
兄弟们!我们离胜利只差一步了!最最最重重重要要要的总结来了!啊啊啊啊!冲冲冲!
总结
- 类的变量类型可分为:成员变量和局部变量。
- 类的成员变量可分为两种:静态变量和实例变量,其中静态变量又称为类变量
- 类变量(静态变量)和实例变量都是声明在一个类中,但在方法、构造方法和语句块之外。
类变量和实例变量的区别
类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则是对象私有,某一个对象将其值改变,不影响其他对象。
类就像一份说明书,说明这种类的实例对象的规格。而在创建实例对象的时候,内存中会为每一个实例对象的每一个非静态成员变量开辟一段内存空间,用来存储这个对象所有的非静态成员变量值。即使两个不同的实例对象是属于同一个class类,但是它们的同名非静态成员变量在内存中占用的空间是不同的。
而静态成员变量也就是类变量不同。所有的实例对象都共用一个类变量,内存中只有一处空间是放这个类变量值的。因此,如果一个对象把类变量值改了,另外一个对象再取类变量值就是改过之后的了。*
class A{
static int a;//类变量(静态变量)
int b;//实例变量
}
public class B{
public static void main(String[] args){
A a1=new A();
A a2=new A();
a1.a=2;
a1.b=2;
System.out.println(a2.a);//结果为2,类变量是针对所有对象的,所以a1改变a,a2的a也改变
System.out.println(a2.b);//结果是0,实例变量是改变对象自身的,所以a1对象的b改变,不影响对象a2的b变量
}
}
运行结果
run:
2
0
成功构建 (总时间: 0 秒)
好的!兄弟姐妹们!看到这就要结束了!希望这篇文章解答了你的疑惑,如果文章中有某些错误可以私信我或评论留言。
文献参考:
Java变量类型|菜鸟教程: https://www.runoob.com/java/java-variable-types.html.