1. 成员变量
定义格式: [修饰符] 类型 成员变量名列表;
特性:
- 成员变量的变量名是唯一的.
- 成员变量的类型可以为任意数据类型,也包括类.
- 它的作用范围是总个类,类中所有方法都可以直接访问成员变量.
- 成员变量的修饰符为可选项,主要对变量进行控制和限定作用.
修饰符:public
,protected
,private
,final
列子:
class Person {
int no;
String name;
Brithday day; // day的类型为类Brithday
}
class Brithday {
int year;
int month;
int date;
}
2. 局部变量
定义格式:类型 成员变量名列表;
特性:
- 局部变量的变量名是唯一的.
- 类型可以为任意数据类型,也包括类.
- 一般定义在方法体中,作用范围为方法体内
- 不能添加修饰符,否则会编译报错
列子:
public class Test {
final int a = 8;
public void display() {
//public int a= 4; //java: 非法的表达式开始
int a= 4;
System.out.println(a);
}
public static void main(String[] args) {
Test test = new Test();
test.display(); // 4
}
}
上面例子中,输出的值是方法display的局部变量a的值4,并不是成员变量a的值8,原因是当局部变量与成员变量的变量名相同时,成员方法中会优先使用数据自己的局部变量,如果没有该局部变量才会去成员变量中寻找。
但是就算发送变量重名,我只是要用成员变量时,在变量的引用时加上this关键字 如System.out.println(this.a);
这样输出一定是位类的成员变量。
3. 静态变量和静态方法
首先了解一个概率
实例变量:
对于不同的对象而言,它们在内存中的存储空间通常是独立的,对某个对象成员变量的值发送改变不会影响到其它的对象,把这种属于单个对象的成员变量称为实例变量。
静态变量:
定义格式:static [修饰符] 类型 成员变量名列表;
静态变量则是能够使一个类的不同实例都可以共用同一个变量,在一个成员变量前加上static
修饰符则就成为静态变量,注意的是静态变量可以有修饰符。
class Person {
static int no; // 静态变量
final String name; // 成员变量
public void display() {
int a; // 局部变量
}
}
特性:
- 静态变量不在属于某个实例或者对象,而是属于整个类;
- 可以通过类名直接进行访问静态变量
- 当一个实例或对象对静态变量进行修改后,该类的所有实例中的值都会发生改变
例子:
public class Test {
static int a = 8;
public void display() {
System.out.println(a);
}
public static void main(String[] args) {
Test.a = 0; // 直接通过类名访问静态变量
Test test1 = new Test();
Test test2 = new Test();
// 当一个实例或对象对静态变量进行修改后,该类的所有实例中的值都会发生改变
test1.display(); // 0
test2.display(); // 0
}
}
静态方法
类似的,在成员方法前加上static
修饰符则为静态方法,同样也可以直接通过类名访问静态方法
public class Test {
static public int a = 8; // 静态变量
static public void display() {
System.out.println(a); // 引用静态变量
}
public static void main(String[] args) {
Test.display(); // 直接通过类名访问静态方法
}
}
但要注意的是: 静态方法中不能直接引用成员变量,而只能引用静态变量
public class Test {
public int a = 8; //成员变量
static public void display() {
System.out.println(a); // 报错:无法从静态上下文中引用非静态 变量 a
}
}