不多说,直接上干货!
定义类其实就是在定义类中的成员。
成员:成员变量<-->属性,成员函数<-->行为。
局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被分配内存,请求在方法执行完毕后自动释放内存而消亡,在使用局部变量的时候必须先对其进行初初始化。它是在方法体中定义的变量以及方法的参数,只在定义它的方法内有效。成员变量违背人为初始化,系统将自动根据其所属类型进行初始化,基本数据类型变量量系统赋值0,引用型变量赋值null。
成员变量与局部变量就好比正式工与临时工,成员变量就是正式员工,一直存在,与公司同生同灭,局部变量就是临时工,公司请临时工来做一点事情,做完,临时工就没有了,被销毁了。
static静态变量是所有对象共有的变量,它可以在不创建对象的情况下,直接被引用普通变量只有在创建了类的对象后才能被引用。局部变量与成员变量是非静态变量,调用之前必须动态创建,不能直接调用。非静态成员变量是在定义后,电脑随机给一个地址,当程序运行结束时,地址收回。而静态成员变量的不收回,而且一但给了地址它,这个地址就是它的了,不管程序结不结束,它在等待有个语句来释放它,或者关了电脑也就没了。
全局变量也叫成员变量,是指在类中定义的变量;它在整个类中都有效,又可分为类变量和实例变量。类变量又叫静态变量,用static修饰 它可以直接用类名调用,也可以用对象调用 ,而且所有对象的同一个类变量都是共享同一块内存空间的。实例变量不用static修饰,它只能通过对象调用,而且所有对象的同一个实例变量是共享不同的内存空间的。
成员变量和局部变量的区别:
1、成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
2、成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
3、成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
4 、成员变量都有默认初始化值。
局部变量没有默认初始化值。
看代码:
class Person{
String name;//姓名,这是一个成员变量
static String country = "中国";//国籍,这是一个静态变量 public void printInfo() {
System.out.println(name+":"+country);
}
}
上面的代码中我们可以看到变量name是一个成员变量,而country是一个静态变量,用static关键字修饰。
1、两个变量的生命周期不同:
成员变量:随着对象的创建而存在,随着对象的被回收而释放。
静态变量:随着类的加载而存在,随着类的消失而消失。
那么类什么时候消失呢?一般情况下,虚拟机结束了,类就结束了,当然这只是说一般情况下。
2、两个变量的调用方式不同:
我们来看一个上面代码的测试:
class StaticTest{
public static void main(String[] args){
Person p = new Person();
p.name = "小强";
String name = Person.name;
System.out.println(p.country+"--"+Person.country);
}
}
我们可以看到直接用类名来调用成员变量就会出现“无法从静态上下文中访问非静态变量”的错误。
当我们把这名话注释之后再来运行:
class StaticTest{
public static void main(String[] args){
Person p = new Person();
p.name = "小强";
//String name = Person.name;
System.out.println(p.country+"--"+Person.country);
}
}
结果,是
程序正常运行并合法访问,所以我们可以总结出下面的区别:
成员变量:只能被对象调用。
静态变量:既可被对象调用,也可被类调用。上一节我们就已经学习了static修饰的成员可以直接用类名调用。
3、两个变量的别名不同:
成员变量:又称为实例变量。
静态变量:又称为类变量。
4、两个变量的存储位置不同:
成员变量:存储在堆内存中的对象中,所以也叫对象的特有数据。
静态变量:存储在方法区(共享数据区)的静态区中,所以也叫类的共享数据。