一、变量的类型
成员变量:在类中定义,它的作用域是整个类。
局部变量:在一个方法的内部定义,它的作用域是整个方法。
方法参数:方法的参数,它的作用域是整个方法。
public class Student{
int age; // 在类的内部定义,name为成员变量
public Student(){}
public Student(int age){ //age为方法参数
this.age=age;
int y=2; //局部变量
}
public static void main(String[] args){ //args为方法参数
Student s=new Student(1); //在方法内定义,s为局部变量
System.out.println(s.age);
}
}
各种变量类型的作用区域
public class Student{
int age1 = 0; //定义age1为成员变量
void method1(int age2){ //age2为方法参数
int age3 = 0;
age1++;
age2++;
age3++;
}
void method2(){
age1++;
age2++; //编译出错
age3++; //编译出错
}
}
变量age2是method1()的方法参数,变量age3是method1()方法的局部变量,它们只能在method1()方法中被访问;变量age1作为Student类的成员变量,能够在整个类中访问。在method2()方法中,只能访问age1变量,而不能访问age2和age3变量。
二、实例变量和静态变量的区别
类的成员变量有两种:一种是被static关键字修饰的变量,叫类变量(或静态变量)
另一种 是没有被是static关键字修饰的变量,叫实例变量。
区别:
类的静态变量在内存中只有一个,被类的所有实例共享。静态变量可以直接通过类名被访问
类的每个实例都有相应的实例变量。每创建一个类的实例,Java虚拟机就会为实例 变量分配一次内存。
public class Sample{
static int v1; //静态变量
int v2; //实例变量
public static void main(String[] args){
Sample s1=new Sample();
Sample s2=new Sample();
s1.v2=1;
s2.v2=2;
s1.v1=3;
s2.v1=4;
System.out.println(s1.v2+","+s2.v2+","+v1+","+Sample.v1); //打印1,2,4,4
}
}
对于静态变量v1,既可以通过s1.v1,引用变量是s1来访问v1变量
也可以通过Sample.v1,Sample类名来访问v1变量
对于实例变量v2,实例变量允许通过引用变量s1或者s2来访问实例变量v2
System.out.println()语句,System是JDK类库中java.lang包中的一个类,out是System类的一个静态成员变量,out变量为 PrintStream类型:public static final PrintStream out。所以System.out.println()用于调用System类的out静态成员变量所引用 的PrintStream对象的println()方法
关于静态变量的详细介绍,在后面复习到时再补个链接。这里不做过多讨论
三、成员变量和局部变量同名
在同一个作用域内不容许定义同名的多个变量,例如,不允许定义两个同名的成员变量或 局部变量
在一个方法内可以定义和成员变量同名的局部变量或参数。此时成员变量被屏蔽,如果要访问实例变量,可以通过this关键字访问(例如this.name)。this为当前实例的引用。如果要访问类变量(静态变量),可以通过类名来访问。如(Student.name)
Student类有一个成员变量name,它的构造方法也有一个名为name的参数。
public Student(String name){
this.name = name;
}
四、对象的默认引用:this
当一个对象创建好后,Java虚拟机就会给它分配一个引用自身的指针:this。所有对象默认引用都叫this。
class Student
{
String name;
public Student(){}
public Student(String name){}
public void setName(String name){
this.name = name ;//this引用当前Student对象
}
public String getName(){
return name;
}
public static void main(String[] args)
{
Student s1 = new Student();
s1.setName("王小二");
Student s2 = new Student();
s2.setName("张小二");
System.out.println(s1.getName()); //打印王小二
System.out.println(s2.getName()); //打印张小二
}
}
以上Student类的setName()方法中的this关键字引用当前的Student对象。
当Java虚拟机执行s1.setName("王小二");时,setName()中的this关键字指向s1变量所引用的Student对象。
当Java虚拟机执行s2.setName("张小二");时,setName()中的this关键字指向s2变量所引用的Student对象。
注意: 只能在构造方法或实例方法内使用this关键字,而在静态方法内不能使用this关键字。
四、参数传递
public class ParaTest{
public int a=0;
public static void changeParameter (int p1, ParaTest p2, ParaTest p3) {
p1=1; //改变基本数据类型参数的值
p2.a=1; //改变对象类型参数的实例变量
p3=new ParaTest(); //改变对象类型参数的引用,使它引用一个新的对象
p3.a=1; //改变新的对象的实例变量
}
public static void main(String args[]){
//声明3个局部变量
int p1=0; // p1是基本数据类型
ParaTest p2=new ParaTest(); //p2 是对象引用类型
ParaTest p3=new ParaTest();//p3 是对象引用类型
//将3个局部变量作为参数传递给changeParameter ()方法
changeParameter (p1, p2, p3);
//打印3个局部变量
System.out.println("p1= " +p1); //打印p1= 0
System.out.println("p2.a= " + p2.a); //打印p2.a= 1
System.out.println("p3.a= " + p3.a); //打印p3.a= 0
}
}
由于 参数变量p2和局部变量p2引用的是同一个对象,所以main中的p2.a=1
参数p3引入新的paratest对象,然后再把新的paratest对象变量v,设为1,由于参数变量和局部变量引用的不再是同一个paratest对象,所以main方法里的p3.a=0
注意,参数变量是基本类型时不改变成员变量或局部变量的值,参数变量是引用类型时,会改变成员变量的值
五、变量初始化
在创建一个对象时,JVM会自动为它的成员变量初始化为默认值。
数值型变量的默认值(0) 字符型的默认值(‘\u0000’) 布尔型的默认值(false) 引用类型的默认值(null)。
成员变量会自动初始化。 局部变量必须显式初始化再使用
public void method(){
int a = 0; //正确
int b ; //错误
}
六、new关键字创建对象
当一个引用类型的变量被声明后,如果没有初始化,那么它不指向任何对象。
Java语言用new关键字创建对象,有以下作用:
1)、为对象分配内存空间,将对象的实例变量自动初始化为其变量类型的默认值。
2)、如果实例变量在声明时被显式地初始化,那就把初始化值赋给实例变量。
3)、调用构造方法
4)、返回对象的引用
类的静态变量初始化是Java虚拟机加载类时完成的
public class Student
{
int age1;
int age2=1;
int age3;
public Student(){
age3=3;
}
public static void main(String[] args)
{
Student stu = new Student();
System.out.println(stu.age1); //输出0
System.out.println(stu.age2); //输出1
System.out.println(stu.age3); //输出2
}
}
Java虚拟机执行语句 Student stu = new Student();的步骤如下
(1)为一个新的Student对象分配内存空间,它所有的成员变量都被分配了内存,并自动初始化为其变量类型的默认值
(2)显式地初始化age2变量,把它的值设为1
(3)调用构造方法,显式地初始化成员变量age3,
(4)将对象的引用赋值给变量stu
一个对象可以被多个引用变量引用
Student stu1 = new Student("张小二");
Student stu2 = new Student("王小二");
Student stu3 = stu1;
Student stu4 = null;
Student实例与引用变量的关系
以上代码共创建两个Student对象和4个Studen类型的引用变量