java基础特性,封装,继承,多态

java的三大特性

Java语言的三大特性即是:封装、继承、多态

首先先简单的说一下其3大特性的定义:

封装:

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。封装的基本要求是: 把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数。在开发的时候经常要对已经编写的类进行测试,所以在有的时候还有重写toString方法,但这不是必须的。

继承:

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

通过继承实现代码复用。Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。继承而得到的类称为子类,被继承的类称为父类。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。但Java不支持多重继承,即一个类从多个超类派生的能力。在开发中尽量减少继承关系,这样做是为了把程序的耦合度降低。

多态:

多态是同一个行为具有多个不同表现形式或形态的能力。

多态又分为设计时多态和运行时多态,例如重载又被称为设计时多态,而对于覆盖或继承的方法,JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。总而言之,面向对象的设计的典型特点就是继承,封装和多态,这些特点也是面向对象之所以能如此盛行的关键所在。

java的多态性

对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。

Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

例 1

下面通过一个例子来演示重写如何实现多态性。例子使用了类的继承和运行时多态机制,具体步骤如下。

1)创建 Figure 类,在该类中首先定义存储二维对象的尺寸,然后定义有两个参数的构造方法,最后添加 area() 方法,该方法计算对象的面积。代码如下:

 
  1. public class Figure {
  2. double dim1;
  3. double dim2;
  4.  
  5. Figure(double d1, double d2) {
  6. // 有参的构造方法
  7. this.dim1 = d1;
  8. this.dim2 = d2;
  9. }
  10.  
  11. double area() {
  12. // 用于计算对象的面积
  13. System.out.println("父类中计算对象面积的方法,没有实际意义,需要在子类中重写。");
  14. return 0;
  15. }
  16. }

2)创建继承自 Figure 类的 Rectangle 子类,该类调用父类的构造方法,并且重写父类中的 area() 方法。代码如下:

 
  1. public class Rectangle extends Figure {
  2. Rectangle(double d1, double d2) {
  3. super(d1, d2);
  4. }
  5.  
  6. double area() {
  7. System.out.println("长方形的面积:");
  8. return super.dim1 * super.dim2;
  9. }
  10. }

3)创建继承自 Figure 类的 Triangle 子类,该类与 Rectangle 相似。代码如下:

 
  1. public class Triangle extends Figure {
  2. Triangle(double d1, double d2) {
  3. super(d1, d2);
  4. }
  5.  
  6. double area() {
  7. System.out.println("三角形的面积:");
  8. return super.dim1 * super.dim2 / 2;
  9. }
  10. }

4)创建 Test 测试类,在该类的 main() 方法中首先声明 Figure 类的变量 figure,然后分别为 figure 变量指定不同的对象,并调用这些对象的 area() 方法。代码如下:

 
  1. public class Test {
  2. public static void main(String[] args) {
  3. Figure figure; // 声明Figure类的变量
  4. figure = new Rectangle(9, 9);
  5. System.out.println(figure.area());
  6. System.out.println("===============================");
  7. figure = new Triangle(6, 8);
  8. System.out.println(figure.area());
  9. System.out.println("===============================");
  10. figure = new Figure(10, 10);
  11. System.out.println(figure.area());
  12. }
  13. }

从上述代码可以发现,无论 figure 变量的对象是 Rectangle 还是 Triangle,它们都是 Figure 类的子类,因此可以向上转型为该类,从而实现多态。

5)执行上述代码,输出结果如下:

长方形的面积:
81.0
===============================
三角形的面积:
24.0
===============================
父类中计算对象面积的方法,没有实际意义,需要在子类中重写。
0.0

猜你喜欢

转载自blog.csdn.net/yunxing323/article/details/115406706
今日推荐