Java 面向对象的三大特征:封装,继承、多态。
封装(Encapsulation)
封装就是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
例子:我们可以把电脑作为一个例子,电脑内部的那些部件对我们来说就是封装的。我们只看到了它的外面,当我们去用电脑时不需要去理解它里面的cpu,显卡,网卡,散热器怎么工作的。只取看和用它对外提供的显示器,鼠标等接口就行了。所以电脑内部对我们来说就是封装的隐藏了对象属性和实现细节。
封装的优点:
1.将变化隔离了。我们在根据自己的需求去改变封装部分的代码时,不用修改那些调用我们代码的程序片段。
2.提高重用性。当我们封装好一个功能块后不需要在去重新写这样的代码,而只去调用我们封装好的功能块就行了。
3.提高安全性。当我们去修改封装好的功能块的代码时,对外界其它代码的影响不大,便于维护修改。
4.便于使用。当封装好一个功能块后直接去调用就行,不一定要去理解内部实现。
继承(Extends)
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
例子:有个Person(人)类,里面有名字,性别,年龄属性。当我们想创建一个Student(学生)类时就可以不用再去写它的名字,性别,年龄属性,直接继承Person类就行了。这样Student类也就有了 这些属性,因为学生也是人的一种。而且这些属性外我们还可以在学生类中添加别的学号,班级等别的属性。
继承的有点:
1.提高了代码的复用性。
2.让类与类之间产生了关系,有了这关系才有了多态的特性。
注意:
1.Java 中只支持单继承。因为多继承会有安全隐患,当多个父类定义了相同的功能,功能内容不同时,子类对象不确定要运行那 个。就像多个父类定义了相同名字函数 add(); 而内容不同时,子类就不知道运行那个。
2.Java 会支持多继承,只有在接口与接口之间存在,因为接口中的成员函数没有方法体。
3.Java 支持多层继承,就是一个继承体系。如 :C 继承 B,B 继承 A,这个时候C包含了A,B的内容。
多态(Polymorphism)
某一类事物的多种存在形式。
例子: 猫 x = new 猫();
哺乳动物 x = new 猫();
动物 x = new 猫();
猫我们可以当作猫,同时猫也是猫类动物,或者哺乳动物,或者动物。这就时猫的多种表现形式。
多态的体现:
1.父类的引用指向了自己的子类对象。
2.父类的引用也可以接受自己的子类对象。
如下:
abstract class Animal {
public abstract void shout(); // 定义抽象shout()方法
}
class Cat extends Animal {
public void shout() {
System.out.println("喵喵...");
}
}
class Dog extends Animal {
public void shout() {
System.out.println("汪汪...");
}
}
public class Duotai {
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
animalShout(dog);
animalShout(cat);
// 运行结果:
// 汪汪...
// 喵喵...
}
// 定义一个静态的animalShout()方法,接收一个Animal类型的对象
public static void animalShout(Animal animal) {
animal.shout();// 调用实际参数的shout()方法
}
}
多态的前提:
1.必须是类与类之间有关系。要继承,要么实现。
2.而且要存在覆盖(复写) 。就像上面代码中复写了shout()。
多态的优点和弊端:
优点:
1.可扩展性。多态的出现大大的提高了程序的扩展性。
2.可替换性。多态对已存在的程序具有可替换。
3.接口性。多态是超类通过方法签名,向子类提供了一个共同接口。由子类来完善或覆盖它而实现的。
4.灵活性。它在应用中体现了灵活多样操作,提高了使用效率。
5.简化性。多态简化对应用软件的代码编写和修改过程,尤其在使用大量对象的运算操作时。
缺点:
1.提高了扩展性,但是只能使用父类的引用访问父类中的成员。也就是只能调用你在父类中定义过的东西。
注意:多态自始至终都是子类对象在做着变化。我们能转的是父类引用指向了自己的子类对象时可被提升,也可以被强制转换。
如: Animal a = new Cat(); 类型提升了,向上转型。 猫 ----> 动物
当我们想用子类的特有方法时,就强制将父类引用转换成子类类型,向下转型。如下:
Cat c = (Cat)a;
而我们不能将 Animal a = new Animal(); 转换成 Cat c = (Cat)a;
本博客内容根据个人理解所写,有什么错误和误解请反映给博主。