java基础之变量(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheng__lu/article/details/86608131

一、变量的类型

成员变量:在类中定义,它的作用域是整个类。

局部变量:在一个方法的内部定义,它的作用域是整个方法。

方法参数:方法的参数,它的作用域是整个方法。

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实例与引用变量的关系

以上代码共创建两个Student对象和4个Studen类型的引用变量

猜你喜欢

转载自blog.csdn.net/cheng__lu/article/details/86608131