那假如我想改变对象的状态呢?该怎么办?目前毫无办法,因为没有任何可以更改状态的方法,直接修改 color 是行不通的,因为它的访问权限修饰符是 private 的。
最好的办法就是为 Pig 类追加 getter/setter 方法,就像下面这样:
public String getColor() {return color;
}
public void setColor(String color) {
this.color = color;
}
通过 setColor() 方法来修改,通过 getColor() 方法获取状态,它们的权限修饰符是 public 的。
Pig pigNoColor = new Pig();pigNoColor.setColor("花色");
System.out.println(pigNoColor.getColor()); // 花色
为什么要这样设计呢?可以直接将 color 字段的访问权限修饰符换成是 public 的啊,不就和 getter/setter 一样的效果了吗?
因为有些情况,某些字段是不允许被随意修改的,它只有在对象创建的时候初始化一次,比如说猪的年龄,它只能每年长一岁(举个例子),没有月光宝盒让它变回去。
private int age;public int getAge() {
return age;
}
public void increaseAge() {
this.age++;
}
你看,age 就没有 setter 方法,只有一个每年可以调用一次的 increaseAge() 方法和 getter 方法。如果把 age 的访问权限修饰符更改为 public,age 就完全失去控制了,可以随意将其重置为 0 或者负数。
访问权限修饰符对于 Java 来说,非常重要,目前共有四种:public、private、protected 和 default(缺省)。
一个类只能使用 public 或者 default 修饰,public 修饰的类你之前已经见到过了,现在我来定义一个缺省权限修饰符的类给你欣赏一下。
class Dog {}
哈哈,其实也没啥可以欣赏的。缺省意味着这个类可以被同一个包下的其他类进行访问;而 public 意味着这个类可以被所有包下的类进行访问。
假如硬要通过 private 和 protected 来修饰类的话,编译器会生气的,它不同意。
private 可以用来修饰类的构造方法、字段和方法,只能被当前类进行访问。protected 也可以用来修饰类的构造方法、字段和方法,但它的权限范围更宽一些,可以被同一个包中的类进行访问,或者当前类的子类。
可以通过下面这张图来对比一下四个权限修饰符之间的差别:
同一个类中,不管是哪种权限修饰符,都可以访问;
同一个包下,private 修饰的无法访问;
子类可以访问 public 和 protected 修饰的;
public 修饰符面向世界,哈哈,可以被所有的地方访问到。
好了,我亲爱的读者朋友,本文到此就打算戛然而止了,有什么不满意的,尽管留言,我保证给你上墙的机会。
我是沉默王二,一枚有趣的程序员,如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读。 原创不易,莫要白票,请你为本文点赞个吧,这将是我写作更多优质文章的最强动力。