封装
在java中封装是把一个对象的属性私有化,同时提供一些接口(方法)给外界调用,用于与外界进行交互。
简单来说,就是类中的属性都把它的访问权限设置为private,然后根据业务需求提供访问权限为public的方法(get方法或set方法或其他方法)给外界调用。
当然,这条原则并不是教条,在有的业务需求中将属性的访问权限设置为public会跟简单一些。但是,我本人还是比较拥护上面这条原则。
话不多说,举个栗子
//我们使用两种不同的方式来实现一个Person类
//1.将类中的属性设置为private,暴露set方法和get方法给外界
public class Person {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ;
/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
}
//2.将类中的属性设置为public,外界直接调用属性来操作该类
public class Person {
public String name ;
public String sex ;
public int age ;
}
上面两者孰好孰坏?其实这很难讲。如果从代码量,是否易于阅读方面来考虑,第2种方式是妥妥的王者。但是如果从易扩展度方面来考虑,第1中种方式是最优解。原因在于它拥有方法,既然有方法那就可以做逻辑判断。例如,我们可以setAga方法里面为外界的赋值做一个逻辑判断,你有见过有人的年龄是200岁的吗?如果使用第1种方式,那就直接赋值进去,以后维护或者从数据库里拉数据的时候,这条数据就很奇怪了,这究竟是对还是错,是不是数据库有问题,还是网络异常导致的,等等一堆问题。
public void setAge(int age) {
if(age > 200){
System.out.println("ERROR:error age input...."); //提示錯誤信息
}else{
this.age = age;
}
}
因此,这也是我比较喜欢使用第2种方式来实现一个类的主要原因。
继承
继承所描述的是“is-a”的关系,如果有两个对象A和B,若可以描述为“A是B”,则可以表示 A 继承 B,其中 B 是被继承者称之为父类,A 是继承者称之为子类。
实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫,对于这个我们将其称之为向上转型。
继承的三个特性:
1.子类拥有父类非private的属性和方法。
2.子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类的方法。
诚然,讲到继承一定少不了这三个东西:构造器、protected 关键字、向上转型。
构造器
子类可以继承父类的属性和方法,除了那些 private 的外还有一样是子类继承不了的—构造器。对于构造器而言,它只能够被调用,而不能被继承。 调用父类的构造方法我们使用super()即可。
对于子类而已,其构造器的正确初始化是非常重要的,而且当且仅当只有一个方法可以保证这点:在构造器中调用父类构造器来完成初始化,而父类构造器具有执行父类初始化所需要的所有能力。
protected 关键字
private 访问修饰符,对于封装而言,是最好的选择,但这个只是基于理想的世界,有时候我们需要这样的需求:我们需要将某些事物尽可能地对这个世界隐藏,但是仍然允许子类的成员来访问它们。这个时候就需要使用到 protected。
对于 protected 而言,它指明就类用户而言,他是 private,但是对于任何继承与此类的子类而言或者其他任何位于同一个包的类而言,他却是可以访问的。
向上转型
将子类转换成父类,一般称之为向上转型。由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了。
多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态的实现
经典案例:http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx 。