面向对象的三大特征——全网最详解析

面向对象的三大特征——封装性、继承性、多态性

类的封装性

  封装是将数据以及对数据的操作组合起来构成类,类是一个不可分割的独立单位。类中提供与外部联系的方法,又尽可能隐藏类的实现细

节。

  封装性提供一种软件模块化的设计思想,像组装硬件一样。类的设计者提供标准化的软件模块,使用者根据实际需求选择所需要的类模块,

集成为软件系统,各模块之间通过传递参数等方式进行工作。设计者需要考虑类的定义、类中数据和方法的访问权限以及方法如何实现等问题;

使用者需知道有哪些类,每个类的特点,每个类提供了哪些常量、成员变量和成员方法等,而不需知道方法实现的细节。


 

  而要实现类的封装性,我们要先为类及类中成员变量和成员方法分别设置必要的访问权限,使所有类,子类,同一包中的类,本类等不同

关系的类之间具有不同的访问权限。Java语言中为类成员设置了4种访问权限,为类(内部类有3种)设置了两种访问权限。

1. 类成员的访问权限

    Java语言中定义4种权限修饰符来修饰类成员的访问权限:public(公有)、protected(保护)、默认和private(私有)。

    这4种权限修饰符说明如下:

    ①public:说明该成员可被所有类的对象访问,public指定的访问权限最大。

   protected:说明该类成员能被同类中的其他成员、该类的子类成员或同一包中的其他类成员访问,不能被其他包的非子类成员访问。protected指定有限的访问权限范围,使保护成员在子类和非子类中具有不同的访问权限,即保护成员可被子类访问,不能被非子类访问。

  ③default(默认):当没有使用访问权限修饰符声明成员时,说明该类成员能被同一类中的其他成员访问或被同一包中的其他类访问,不能被包之外的其他类访问。默认权限以包为界划定访问权限范围,使同一包中的类具有访问权限,其他包中的类则没有访问权限。

  ④private:说明该成员只能被同一类中的其他成员访问,不能被其他类的成员访问,也不能被子类成员访问。private指定的访问权限范围最小,对其他类隐藏类的成员,防止其他类修改该类的私有成员。

    我们用一个表格来清楚的展示:

    

类成员的访问权限
权限修饰符 同一类 同一包 不同包的子类 所有类
public
protected  
默认    
private      

      

2. 类的访问权限(只讨论外部类)

类的访问权限有两种:public和默认,不能使用其他两种权限声明类。

在一个Java源程序文件中可以声明多个类,但是public修饰的类智能有一个,并且类名需要与文件名相同。

    

 


类的继承性

  继承是软件重用的一种形式,在声明新类时复用现有类的成员,然后赋予其新的功能,或修改原有的功能,通过继承,程序员在程序开发已验证和调试过的高质量软件,可节省开发时间,也使系统更有可能得到有效的实现。

  1. 继承的概念

  当程序员创建类时,可以指定新类从现有类中继承某些成员,而不需要完全从头开始声明新的成员。这个现有类称为超类或父类,新创建类称为子类。子类也可以成为其他类的超类或父类

  通常子类会添加自己的变量和方法,因此子类比其超类或父类更详细,表示更为特定的对象,典型的情况是,子类既有父类的功能,又有专门的性能。

  继承性在父类和子类之间建立起联系,子类自动拥有父类的全部成员,包括成员变量和成员方法,使父类成员得以传承和延续;子类可以改父类的成员,使父类成员适应新的需求;子类也可以增加自己的成员,使类的功能得以扩充。但是,子类不能删除父类的成员!!

  Java语言只支持单重继承,可以通过接口实现多重继承。在单重继承中父类与子类是一对多的关系。一个子类只有一个父类;一个父类可以有多个子类,每个父类又可以作为父类再定义自己的子类。

  2. 继承原则

    类的继承包括以下基本原则。

    ①子类继承父类的所有成员变量,包括实例成员变量和类成员变量。

  ②子类继承父类除构造方法外的成员方法,包括实例成员方法和类成员方法。因为父类构造方法创建的是父类对象,子类必须创建自己的构造

  方法,创建子类自己的对象

    ③子类不能删除父类的成员。

    ④子类虽然继承了父类的私有成员,但子类不能使用父类的私有成员

    ⑤子类可以增加自己的成员变量和成员方法。

    ⑥子类可以重新定义父类成员(方法重写)。

    3. 子类的声明

    在Java语言中,子类对父类的继承是通过extends关键字来实现的。语法格式如下:

    [修饰符] class类 [extends 父类] [implements 接口列表]

    其中,extends说明当前声明的类将要继承父类的属性和方法。父类中哪些属性和方法将被继承取决于父类对成员的访问控制:

    ①子类对父类的私有成员没有访问权限。

    ②子类对父类的公有成员和保护成员有访问权限。

  ③子类对默认权限成员分两种情况,对同一包中的父类的默认权限成员具有访问权限,而对不同包中父类的默认权限成员则没有访问权限。

    4. 子类方法的覆盖

  在面向对象语言的程序设计中,子类可以改写从父类中继承来的某个方法,形成与父类方法同名,解决的问题也相似,但具体实现和功能却不尽一致的新方法。

    定义与父类完全相同的方法以实现对父类方法的覆盖是,必须注意以下几点:

    ①完全相同的方法名。

    ②完全相同的参数列表。

    ③完全相同的返回值类型。

    注意:在满足上述三个条件的同时,还必须保证访问权限不能缩小。

    5.super关键字

    在子类的方法中,可以使用关键字super调用父类成员。super的使用有两种方法。

    ①调用父类的构造方法

    父类的构造方法不能够被继承,但在子类的构造方法体中,可以使用super调用父类的构造方法。语法格式如下:

    super([参数列表]);

    其中,参数列表是父类构造方法的参数列表。

    ②调用父类的同名成员

  子类继承父类的成员,当子类没有重定义父类成员时,则不存在同名成员问题。子类的对象访问的都是父类声明的成员变量,调用的也都是父类定义的成员方法,所以不需要使用super。

    当子类重定义了父类成员时,则存在同名成员问题。此时,在子类方法体中,成员变量和成员方法均默认为子类的成员变量或成员

  方法。如果需要引用父类的同名成员,则需要使用super引用。在以下两种同名成员情况下,需要使用super引用。

    1)子类隐藏父类的成员变量

      当子类成员变量隐藏父类的同名成员时,如果需要访问被子类隐藏的父类的同名成员变量,则需要使用super只带父类的同名成员变

  量,则需要使用super指代父类的同名成员变量。语法格式如下:

    super.成员变量;

    2)子类覆盖父类成员方法

    当子类成员方法覆盖父类同名成员方法时,如果需要调用被子类覆盖的父类成员方法,则可以使用super调用父类的同名成员方法。

  语法格式如下:

     super.成员方法([参数列表]);


类的多态性

     类的多态性提供了类中的方法设计的灵活性和执行的多样性。通过多态,就能对“对通用情况进行编程”,而不是“对特定情况编程”。

  多态的特别之处是使程序能够处理类层次中共享同一父类的对象,就好像他们都是父类的对象一样。

  多态性的概念

    在面向对象语言中,多态性是指一个方法可以有多种实现版本,即“一种定义,多种实现”。对于一个方法的多种实现,在程序运行

  时,系统会根据方法的参数或调用方法的对象自动选择一个方法执行,不会产生混淆和混乱。例如,算数运算中不同类型的数据的混合

  运算就是一个典型的多态运用。

    类的多态性表现为方法的多态性,下面主要讨论在不同层次的类中以及在同一个类中多个同名方法之间的关系问题。方法的多态性

  主要有方法的重写和重载。下面进行一个多态小程序举例:

    

 1 /**
 2  * 声明打印机类
 3  */
 4 public abstract class Test03_Print {
 5     private String name;
 6 
 7     public String getName() {
 8         return name;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14     
15     public abstract void Print();
16 }
 1 /**
 2  *  声明黑白打印机类
 3  */
 4 public class Test03_Black extends Test03_Print {
 5 
 6     @Override
 7     public void Print() {
 8         // TODO Auto-generated method stub
 9         super.setName("黑白");
10         System.out.println(super.getName()+"打印机");
11     }
12 
13 }
 1 /**
 2  *  声明彩色打印机类
 3  */
 4 public class Test03_Color extends Test03_Print {
 5 
 6     @Override
 7     public void Print() {
 8         // TODO Auto-generated method stub
 9         super.setName("彩色");
10         System.out.println(super.getName()+"打印机");
11     }
12 
13 }
 1 /**
 2  * 多态小程序举例:
 3  * 利用多态性分别进行黑白打印机和彩色打印机的打印
 4  */
 5 public class Test03_Test {
 6 
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         Test03_Print p1 = new Test03_Black();
10         p1.Print();//黑白打印机
11         p1 = new Test03_Color();
12         p1.Print();//彩色打印机
13     }
14 
15 }

  

   

原文地址:https://www.cnblogs.com/ymyBlogs/p/8743880.html