Java中的成员变量 和 局部变量

学Java时间久了 总会忘记这两个变量的区别。

成员变量:它是描述对象状态的数据,是类中很重要的组成成分。

成员变量是定义在类里面,并和方法处于同一层次。定义成员变量的语法如下:[变量修饰符] 类型说明符 变量名

成员变量的类型可以是Java中的任意数据类型,包括基本类型、数组、类和接口。在一个类中,成员变量应该是唯一的,但是成员变量的名字可以和类中某个方法的名字相同,不过不赞成这么写因为这会引起不必要的混淆。可以用成员变量修饰符来规定变量的相关属性。默认情况下,成员变量是实例成员,在外部需要通过对象才能操作。如果用static修饰,就成为了静态成员,也称为类变量,无需通过对象就可以操作。如果前面加上final关键字,它就是一个常量。

凡是被public修饰的成员变量,都称为公共变量,它可以被任何类所访问。即允许该变量所属的类中所有方法访问,也允许其他类在外部访问。

凡是被private修饰的成员变量,都称为私有变量。它只允许在本类的内部访问,任何外部类都不能访问它。为了让外部用户能够访问某些私有变量,通常类的设计者会提供一些方法给外部调用,这些方法被称为访问接口。

凡是被protected修饰的变量,都被称为保护变量。除了允许在本类的内部访问之外,,还允许它的子类以及同一个包中的其他类访问,子类是指从该类派生出来的类。同一个包中的类可以直接使用,不在同一个包的类只能通过继承的方式访问,继承时改变的是子类从父类中所继承的值,也就是说,需要重新对变量赋值,并不需要再定义。子类如果不在父类的同一包中,是无法通过“对象名.变量名”的方式来访问protected类型的成员变量。

如果在变量前不加任何访问权修饰符,它就具有默认的访问控制特性,也称为friendly变量。它和保护变量非常像,它只允许在同一个包中的其他类访问,即便是子类,如果和父类不在同一包中,也不能继承默认变量(这是默认访问变量和保护变量的唯一区别)。因为它限定了访问权限只能在包中,所以也有人称默认访问权限为包访问权限。

私有变量很好地贯彻了封装原则,所有的私有变量都只能通过程序员设计的接口来访问,任何外部使用者都无法直接访问它,所以具有很高的安全性。但是,在下面这两种情况下,需要使用Java另外提供的两种访问类型:

1.通过接口访问私有变量,将降低程序的性能,在程序性能比较重要的情况下,需要在安全性和效率间取得一个平衡。

2.私有变量无法被子类继承,当子类必须继承成员变量时,需要使用其他的访问类型。

类体由两部分构成:一部分是变量的定义;一部分是方法的定义(一个类中可以有多个方法)。

在变量定义部分定义的变量叫做类的成员变量,成员变量在整个类中都有效。(全局变量是成员变量的俗称)在方法体中定义的变量叫做局部变量,局部变量只在定义它的方法中有效。

public class Clothes

{

String id; //实例变量

private String colorType; //实例变量

private int size; //实例变量

private static String depart; //类变量或静态变量

final String design="yangzi"; //常量

public static void main(Stringargs[])

{

Clothes c = new Clothes(); //创建实例

System.out.println(c.size);//通过实例访问实例变量

}

}

其中实例变量、类变量(静态变量)、常量都是属于成员变量的。static关键字修饰的变量,叫类变量或者静态变量。

静态成员变量:在某些情况下,程序员希望定义一个成员变量,可以独立于类的任何对象,即所有的对象都共用同一个成员变量。由于Java中不能像C一样定义全局变量,因此,Java中引入了静态成员变量。

在成员变量前加上static标识符就可以定义一个静态成员变量。相对于实例成员变量,静态成员变量具有以下特点:

● 它被类的所有对象共享,因此又被称为类变量。

● 它不是属于某个具体对象,也不是保存在某个对象的内存区域中,而是保存在类的公共存储单元。因此,可以在类的对象被创建之前就能使用。

● 它既可以通过“对象名.变量名”方式访问,也可以通过“类名.变量名”的方式访问。它们是完全等价的。

类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。所有的对象都是实例成员变量。它们的最大特色是:如果所属的对象没有被创建,它们也就不存在。如果在类的外部使用它,需要先创建一个对象,然后通过“对象名.变量名”来访问。静态变量static是一个公共变量,无论哪个对象改变了它的值,对其他所有该类对象都有效。静态变量的一个重要作用是当作同类各个对象之间传递信息使用,类似于C语言中的全局变量。但这样破坏了数据的封装原则,往往会留下隐患,所以使用这类变量时需要万分谨慎。而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

局部变量:定义在方法之中的变量,定义在for循环中的变量,定义在方法名参数上的变量,创建对象的引用,主函数。凡是局部变量都会在栈内存中开辟空间。

区别:

1. 局部变量要先赋值,再进行运算,而实例变量均已经赋初值。(这是局部变量和实例变量的一大区别)

2. 实例变量的对象赋值为null。

3. 局部变量不允许范围内定义两个同名变量。实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效。

4. 实例变量和局部变量允许命名冲突。

5.局部变量在栈内存中,作用于函数或语句。成员变量在堆内存中,因为对象的存在才在内存中存在,作用于整个类。





却坐在不足一平米的椅子上。

Java中的成员变量 和 局部变量

相关文章:

你感兴趣的文章:

标签云: