面向对象的三个基本特性封装、继承、多态

时间:2018-08-20
本文章向大家介绍面向对象的三个基本特性封装、继承、多态,需要的朋友可以参考一下

一、抽象

  抽象是从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃。抽象是Java面向对象编程的核心原则,出现在抽象类(abstract)和接口(interfaces)中

  抽象类的特点:

    1.抽象方法一定在抽象类中;

    2.抽象方法和抽象类都必须被abstract关键字修饰;

    3.抽象类不可以用new创建和实例化对象,因为抽象类本事就是不完整的,抽象方法只定义,未实现功能;

    4.抽象类中的方法要被使用,必须有子类重写所有的抽象方法后,建立子类对象的调用,如果子类未重写全部的抽象方法,那些该子类还是一个抽象类。

  Abstract关键字,不能和以下关键字共存:

    1.final :被final修饰的类不能有子类,即不能被继承。而abstract修饰的类一定是一个父类,只能被继承。

    2.private :抽象类中的私有方法的抽象方法,不能被子类所知,就无法被继承。

    3.Static : 如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。 可是抽象方法运行没意义。

  接口:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

   接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如privateprotectedstatic、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

  接口的特点:

   1、个Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protectedprivate,但是编译会出错!

   2、接口中可以定义成员变量,或者说是不可变的常量,因为接口中的成员变量会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name

   3、接口中不存在实现的方法。

  4、实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。

  5、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}

  6、在实现多接口的时候一定要避免方法名的重复。

   

二、封装

  封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。封装可以把一个对象的属性私有,而提供一些可以被外界访问的属性的方法。简而言之,就是隐藏对象信息,流出访问接口。

  封装的作用:

    1对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。

    2对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。

  代码的实现,属性前+private。创建GetSet方法提供外部使用。
public class Person{

private String name;

private int age;

  public String getName() {
   return name;
  }
  public void setName(String name) {
   this.name = name;
  }
  public int getAge() {
   return age;
  }
  public void setAge(int age) {
  this.age = age;
  }
  }

三、继承

  继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

  语法为:

    class 子类 extends 父类 {}

    *  继承中的初始化顺序:

  从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属性和实例属性)、方法(包括类方法和实例方法)、构造器和初始化代码块(包括类的初始化块和实例的初始化块)。对于继承中的初始化顺序,又具体分为类的初始化和对象的初始化。

  类初始化:

  在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间。并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

  

  对象初始化:

  在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属和初始化块先分配内存并执行初始化。然后执行父类构造器中的初始化程序,接着才开始对子类的对象属性和初始化块执行初始化。

注:

  1. 在对象初始化阶段,属性和方法均针对子类可以从父类继承过来的属性和方法而言,一般而言,都是针对父类中非private而言的。因为private修饰的为父类所特有的,子类没有继承过来,当new子类时,无须为其分配空间并执行初始化。当然了,父类的构造器子类也是不继承过来的,但构造器另当别论。

  2.类的初始化只执行一次,当对同一个类new多个对象时,类属性和类初始化块只初始化一次。

  继承中的this和super:

  构造器中的this表示当前正在初始化的对象引用,方法中的this表示当前正在调用此方法的对象引用。this具体用法表现在一下几个方面:

1.当具多个重载的构造器时,且一个构造器需要调用另外一个构造其,在其第一行使用this(param)形式调用,且只能在第一行;

2.当对象中一个方法需要调用本对象中其他方法时,使用this作为主调,也可以不写,实际上默认就是this作为主调;

3.当对象属性和方法中的局部变量名称相同时,在该方法中需要显式的使用this作为主调,以表示对象的属性,若不存在此问题,可以不显式的写this。其实,其牵涉到的一个问题就是变量的查找规则:先局部变量 => 当前类中定义的变量 => 其父类中定义的可以被子类继承的变量 => 父类...

super表示调用父类中相应的属性和方法。在方法中,若需要调用父类的方法时,也一定要写在第一行。

四、多态

   多态的定义: 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采 用多种不同的行为方式。 程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

   多态的作用:消除类型之间的耦合关系 

  实现多态有三个必要条件:  1.继承     2.重写     3.向上转型

  指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子 类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父 类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接,动态 调用

  多态的优点:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。