哈工大软件构造-对于修饰符的理解
前言
本文主要针对于修饰符private与static在应用中的理解
一、公有访问修饰符-public
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。
如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
二、私有访问修饰符-private
私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
public class Person {
public String Name;
Person(String name)
{
this.Name=name;
}
public String getName(){
return this.Name;
}
}
public class Graph {
public static void main(String[] args) {
Person ross=new Person("Ross");
ross.Name="Kitty";
System.out.println("直接访问:"+ross.Name);
System.out.println("getter访问"+ross.getName());
}
}
输出结果:
直接访问:Kitty
getter访问Kitty
如图,定义了一个Person类,将成员变量Name设为public时,其他类(Graph)同样可以直接访问并且修改该成员变量,这样做通常来说是错误的,会造成一些意想不到的bug。
正确写法:应该将Perosn的Name成员改为private修饰
那么如图,在Graph类中以下两行会出现编译错误,代表除Person以外的其他类均不能访问或者修改private修饰的成员变量,仅仅能通过getter实现访问
二、static
1.静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
代码如下(示例):
public class Person {
private String Name;//人名
private static String Site="Harbin";//人们所在地点
Person(String name)
{
this.Name=name;
}
public static void main(String[] args) {
Person ross = new Person("Ross");
Person bob = new Person("Bob");
System.out.println(Person.Site);
System.out.println("Ross所在位置:"+ross.Site);
System.out.println("Bob所在位置:"+bob.Site);
bob.Site="Beijing";
System.out.println("Ross所在位置:"+ross.Site);
System.out.println("Bob所在位置:"+bob.Site);
}
}
输出结果如下:
Harbin
Ross所在位置:Harbin
Bob所在位置:Harbin
Ross所在位置:Beijing
Bob所在位置:Beijing
由此可见,静态成员变量Site可以直接通过类进行访问而非实例。同样,静态成员变量Site被所有实例化的对象所共同占有(共享)。
2.静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
代码如下(示例):
public class Person {
private String Name;//人名
private static String Site="Harbin";//人们所在地点
Person(String name)
{
this.Name=name;
}
public static String getSite(){
//System.out.println(this.Name);该行出现编译错误,因为静态方法无法访问非静态变量
return Site;
}
public static void main(String[] args) {
Person ross = new Person("Ross");
Person bob = new Person("Bob");
System.out.println(Person.getSite());
System.out.println("Ross所在位置:"+ross.getSite());
System.out.println("Bob所在位置:"+bob.getSite());
}
}
输出结果为:
Harbin
Ross所在位置:Harbin
Bob所在位置:Harbin
由此可见:静态方法不能访问非静态成员变量。
静态方法可以被非实例化类直接调用,也能被实例化对象调用。