面向对象特征之一:封装和隐藏
我们程序设计追求“高内聚,低耦合”
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露 的暴露出来。这就是封装性的设计思想。
信息的封装和隐藏
Java中通过将数据声明为私有的(private),再提供公共的(public) 方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑, 限制对属性的不合理操作;
便于修改,增强代码的可维护性;
package com.xxx.java;
public class AnimalTest {
public static void main(String[] args) {
Animal a = new Animal();
a.name = "花花";
a.age = 1;
//a.legs = 1; //The field Animal.legs is not visible
a.setLegs(6);
a.show();
a.eat();
}
}
class Animal {
String name;
int age;
private int legs; //防止用户跳出限制
//对属性的设置
public void setLegs(int l) { //为了禁止用户输入负数和奇数
if (l >= 0 && l % 2 == 0) {
legs = l;
} else {
legs = 0;
//抛出异常(后续完善)
}
}
//对属性的获取
public int getLegs() {
return legs;
}
public void eat() {
System.out.println("动物进食");
}
public void show() {
System.out.println("name = " + name + ",age = " + age + ",legs = " + legs);
}
}
四种访问权限修饰符
Java权限修饰符public、protected、(缺省)、private置于类的成员定义前用来限定对象对该类成员的访问权限。
对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。
4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
修饰类的话:只能使用:缺省、public
package com.xxx.java;
public class Order {
private int orderPrivate;
int orderDefault;
public int orderPublic;
private void methodPrivate() {
orderPrivate = 1;
orderDefault = 2;
orderPublic = 3;
}
void methodDefault() {
orderPrivate = 1;
orderDefault = 2;
orderPublic = 3;
}
public void methodPublic() {
orderPrivate = 1;
orderDefault = 2;
orderPublic = 3;
}
}
package com.xxx.java;
public class OrderTest {
public static void main(String[] args) {
Order order = new Order();
order.orderDefault = 1;
order.orderPublic = 2;
//私有结构无法调用
//order.orderPrivate = 3;
order.methodDefault();
order.methodPublic();
//私有结构无法调用
//order.methodPrivate();
}
}
package com.xxx.java1;
import com.xxx.java.Order;
public class OrderTest {
public static void main(String[] args) {
Order order = new Order();
//缺省结构出了包后无法调用
//order.orderDefault = 1;
order.orderPublic = 2;
//私有结构出了类后无法调用
//order.orderPrivate = 3;
//缺省结构出了包后无法调用
//order.methodDefault();
order.methodPublic();
//私有结构出了类后无法调用
//order.methodPrivate();
}
}
创建程序,在其中定义两个类:Person和PersonTest类。
定义如下: 用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
在 PersonTest 类 中实例化 Person 类的对象 b , 调 用 setAge() 和 getAge()方法,体会Java的封装性。
package com.xxx.exer;
public class Person {
private int age;
public void setAge(int i) {
if(i >= 0 && i <= 130) {
age = i;
}else {
System.out.println("age的范围为0-130,请重新设置");
}
}
public int getAge() {
return age;
}
}
package com.xxx.exer;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(12);
System.out.println(p1.getAge());
}
}
类的成员之三:构造器(构造方法)
构造器的特征
它具有与类相同的名称
它不声明返回值类型。(与声明为void不同