面向对象的三大特征,五大原则(二)
五、里氏替换原则(ISA)
里氏原则里面核心的一句话就是,能用父类的地方就可以用子类,子类型必须能够替换基类型。我相信有很多人看到这句话的时候都会有点懵,因为在Java的概念中父类是等于子类的,那么能用父类的地方自然可以使用子类,那么这个原则似乎永远都不会违背。那么接下来我为大家举个违背的例子吧
//首先我们定义一个矩形的类
public class Rectangle{
//长
protected double high;
//高
protected double wide;
public void setHigh(double high){
this.high=high;
}
public double getHigh(){
return this.high;
}
public void setWide(double wide){
this.wide=wide;
}
public double getWide(){
return this.wide;
}
}
接着我定义一个正方形继承于矩形
public class Square extend Rectangle{
//写一个求面积的方法
public void area(){
this.high=this.wide;
this.wide=this.high;
System.out.print("正方形的面积为:"+this.wide*this.high);
}
}
注意观察以上代码,或者运行的时候就会发现,答案是错的,为什么看似正确的代码会是错的呢?关键还是在于继承的使用错误,在数学中正方形属于矩形,但是在编程中矩形有两个属性,而正方形只有一个,所以不属于父子关系。
三大特征:
封装
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用 基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
多态
多态,是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。