(八)面向对象的特征

来源:互联网 发布:阿里云流量充值 编辑:程序博客网 时间:2024/05/22 00:49

面向对象的特征

面向对象的特征有:封装、继承、多态 (抽象)。

注意:面向对象特征这一块有个抽象,一般不问到抽象的话,就不用回答。

1、封装(encapsulation)

1.定义

封装是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

上面这个封装的概念是我在网上自己找的,如果有什么欠缺和不足的话,请自行忽略。
封装是一种信息隐藏技术。

2.体现形式

封装有以下三个体现形式:
1.方法/函数:提高了代码的复用性。
2.属性的私有化(类的封装):提高来代码的安全性。
3.内部类。

通过将属性私有化然后提供对外的公共的访问方法来设置或者获取该属性,可以在方法中对属性的设置或者获取做一系列的限定。

3.优点

提高了复用性、安全性、使代码结构更加紧密。

以下的特点是我自己查阅资料整理的优点,比上面那一句话总结的稍微复杂,仅供参考。
1.使属性私有化–隐藏信息,实现细节。
2.使属性值更符合要求–可以对成员进行更精确的控制。
3.提高了代码的安全性–类内部的结构可以自由修改
4.良好的封装能够减少耦合。

2、继承(inherit)

1.定义

如果一些类中含有相同的属性和方法,那么可以将这些相同的属性和方法提取到一个新的类中,利用extends关键字让原来的类和新的类产生联系,而这个关系称之为继承。新产生的类称之为父类(超类/基类),原来的类称之为子类(派生类)。
父类是子类的一般化,子类是父类的具体化。

注意:Java中支持的使单继承。一个子类只能有一个父类。一个父类可以有多个子类。子类通过继承父类可以使用父类中的一些方法和属性。

2.格式

calss a{}
class B extends A{//B类继承了A类
}

3.特征

1.继承关系是传递的。
2.继承简化了人们对事物的认识和描述,能清晰的体现相关类间的层次结构关系。
3.继承提供了软件复用功能。
4.继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
5.提供了多重继承机制。通过使用接口机制来实现多重继承。

4.优点

我自己写了三个字来方便记忆:提提桶。
1.提高复用性。
2.提高安全性。
3.统一结构。

5.使用条件

1.子类拥有父类非private的属性和方法。
2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方法实现父类的方法。

6.缺陷

1.父类变,子类就必须变。
2.继承破坏了封装,对于父类而言,它的实现细节对于子类来说都是透明的。
3.继承是一种强耦合关系。

7.单继承和多继承的优劣性比较

1.多继承在代码的复用性上要优于单继承,但是存在方法调用的混乱。

class A{    public int m(){        return 2;    }}class B {    public int m(){        return 1;    }}public class C extends A, B{    C c = new C();    int i = c.m(); // 多继承会产生方法调用的混乱}

2.单继承也可以提高代码的复用性,可以避免方法调用的混乱,提高了方法调用的安全性。

8.权限修饰符

用于限定变量或者方法的使用范围的:

本类种 同包类中 子类中 其他类中 Public(公共的) 可以 可以 可以 可以 Protected(受保护的) 可以 可以 可以 不可以 默认 可以 可以 同包子类可以 不可以 Private(私有) 可以 不可以 不可以 不可以

看权限修饰符从定义的位置上看起。

9.super关键字

在创建子类对象的时候,会先创建一个父类对象,而这个父类对象在子类中以super关键字的形式存在。super是父类对象的引用。
super表示在子类中代表了父类的对象。通过super来调用父类中的方法或者属性。可以将super看成一个虚拟对象。

super语句

在子类构造函数中通过调用父类对应形式的构造函数。
如果子类构造函数中没有手动添加,那么JVM在编译的时候会自动添加一个无参的super();。
调用super语句的时候,会自动匹配父类中对应形式的构造函数。
如果父类中没有提供无参构造函数,则默认省略的super语句就不能使用,那么这个时候子类的构造函数中需要手动添加一个super语句,super语句必须放在子类构造函数的首行。
this语句和super语句不能同时使用,如果子类的构造函数中已经存在来this语句,它会调用本身的其他含有super语句的的构造函数,来创建父类。
子类的构造函数中必然直接或者简介的有一个super语句,在创建子类对象的时候必然先创建一个父类对象。
可以通过this来调用父类中的方法或者属性。

// 父类class Pet {    String species;    int age;    public Pet(int age) {        this.age = age;    }    public Pet(String species, int age){}    public void eat() {    System.out.println("在吃食~~~");    }}// 通过extends关键字产生的联系---继承// 子类class Cat extends Pet {    public Cat(){    // super语句必须放在构造函数的首行    super(5);    }    // 方法的重写/覆盖    @Override // 注解---这个注解用于标识这个方法是一个重写的方法    public void eat() {        System.out.println("猫在吃土~~~");    }}class Dog extends Pet {    public Dog() {    // super语句---表示调用了父类的无参构造    // super();        super(5);    }    public void sleep() {    // super 代表一个父类对象---在子类中调用父类中的方法或者属性        super.eat();        System.out.println("吃饱之后开始睡觉~~~");    }}

用法

1.super.成员变量/super.成员方法;
用来在子类中调用父类的同名成员变量或者方法。
2.super(parameter1,parameter2……);
用在子类的构造器中显示调用父类的构造器。

10.父类中不能被子类继承的东西

1.构造方法/函数。
2.用private修饰的东西,即所有私有的东西。
3.构造代码块和静态代码块。
4.默认权限不同包的东西。

3、多态(Polymorphism)

1.定义

多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
多态主要针对对象的行为(方法),而不是对象的属性。

2.动态绑定(dynamicbinding)

实现多态的技术称为动态绑定,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

3.作用

降低模块与模块之间的依赖性就是解耦。
多态的产生使为了解耦,消除类型之间的耦合关系。

4.必要条件

1.要有继承。
2.要有重写。
3.父类引用指向子类对象。

5.优点

1.可替换性(substitutability)。多态对已经存在代码具有可替换性。
2.可扩充性(extensibility)。多态对代码具有可扩充性。
3.接口性(interface-ability)。
4.灵活性(flexibility)。在应用中体现了灵活多向的操作,提高了使用效率。配合反射实现解耦。
5.简化性(simplictiy)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

6.体现形式

编译时多态:在编译时期就要动态绑定的运行过程。
编译时多态包括:方法的重载。

add(1,2)add(1,2,3)//编译时期就能确定要使用的方法。

运行时多态:在运行时期才能确定绑定的运行过程。
运行时多态包括:向上造型、方法的重写。

多态还有一种分类:
对象多态:向上造型。
行为多态:重写和重载。

7.运行时多态

向上造型,重写。
继承是运行时多态的前提。

向上造型

定义

下面是我收集到的好几个定义,那一个便于理解就看那一个。

用父类声明的,用子类来创建实际对象叫向上造型。
子类的对象可以向上造型为父类的类型。即父类引用子类对象,这种方式被称为向上造型。

下面是我自己总结的一句话,仅供参考:
使用向上造型声明的对象可以使用父类中的所有,但是只能使用子类中,父子类共有的东西。

当向上造型创建对象的时候,用父类声明,用子类创建,父类在声明的时候就相当于给来这个对象一份提纲;子类创建对象的时候是告诉来对象该怎么干。
当用向上造型来创建对象的时候,对象能够干什么,看的是父类。行为应该怎么干,看的是子类。

当用向上造型来创建对象的时候,在编译的时候只检查两个类之间是否是继承关系,而不去具体检查是用哪个类来创建的对象,在运行时期才会检查是谁来创建的对象。所以,向上造型是运行时多态。

原创粉丝点击