相信初学Java面向对象的人一定会对成员变量、属性、局部变量和构造器之间的关系和使用搞得有些不知所措,因此此篇文章是总结了作者对此部分知识粗浅的理解。
要思考明白他们之间的关系,首先要理解局部变量这个概念,局部变量就是在方法定义中的变量,称之为局部变量.局部变量在方法创建的时候被创建。在方法调用结束后结束。
我们从一个例子来看这部分的知识:
假设我们在为一个漫画创造一个超级英雄角色,首先定义一个SuperHero类。一个超级英雄应该具备什么东西?一个名字,便于识别的外形特点,最重要的就是她的超能力。
因此我们为这个类定义三个成员变量先,还有一个空的构造器。
public class SuperHero {
String heroName;
String appearenceFeature;
private String superPower;
public SuperHero(){
}
}
我们可以思考目前这三个变量是什么变量,显然,定义在类中且不在方法中的变量,应为成员变量。此时我们有一个问题,为什么一般成员变量的时候,需要在前面加上this.成员变量名。
原因其实很简单,这就牵扯到了成员变量和局部变量的区别。总所周知,构造器其实可以看做是一个特殊的方法,因此在构造器中定义的变量,应该为局部变量。因此我们写如下代码,默认SuperHero的名字为Batman,并且再在构造器中定义一个heroName同名变量,赋予一个新的值。
public class SuperHero {
String heroName = "Batman";
String appearenceFeature;
private String superPower;
public SuperHero(String name){
String heroName = name;
System.out.println(heroName); //out:Superman
System.out.println(this.heroName); //out:Batman
}
public static void main(String[] args) {
SuperHero sh = new SuperHero("Superman");
}
}
由于变量使用时,有就近原则,遇到同名变量,首先使用的是构造器中的局部变量因此”局部的“heroName被赋值了Superman,但是可见的是成员变量中的heroName仍然为默认的Batman,因为此时构造器构造完成后,局部变量消失被收回,heroName的值并没有改变,为了防止这种逻辑错误,防止与成员变量的局部变量重名的影响,我们一般使用this的形式,对成员变量和局部变量做出一个区分。
还有一个常见误区是:成员变量就是属性
其实在查过一些资料之后,属性应该是满足
1.被private修饰的成员变量
2.此成员变量已经定义了get或者set方法。
至此我们分析结束
public class SuperHero {
String heroName = "Batman"; //成员变量
String appearenceFeature; //成员变量
private String superPower; //属性
public SuperHero(String name){
String heroName = name; //局部变量
System.out.println(heroName); //out:Superman
System.out.println(this.heroName); //out:Batman
}
public String getSuperPower() {
return superPower;
}
public static void main(String[] args) {
SuperHero sh = new SuperHero("Superman");
}
}