欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java面向对象(二)——三大特征封装、继承、多态

程序员文章站 2024-01-04 00:00:16
Java面向对象(二)——三大特征封装、继承、多态1.封装性2.继承性3.多态性Java面向对象思想的三大特征分别为封装性、继承性、多态性。这三种特性体现在程序设计的方方面面,也让代码更加简洁,复用性更好。今天我们就来简单说一说这三大特性。1.封装性在我们生活中,用到的很多东西都是封装起来的,只留下必要的部分供人们去操作使用。例如汽车内部包括动力系统、传动系统、电子系统等非常复杂的系统,但对于驾驶员而言并不需要去了解太多内在的原理性东西,只需要掌握如何去操作即可。在程序设计中也是如此,我们追求“高内聚...

Java面向对象(二)——三大特征封装、继承、多态


Java面向对象思想的三大特征分别为封装性、继承性、多态性。这三种特性体现在程序设计的方方面面,也让代码更加简洁,复用性更好。今天我们就来简单说一说这三大特性。

1.封装性

在我们生活中,用到的很多东西都是封装起来的,只留下必要的部分供人们去操作使用。例如汽车内部包括动力系统、传动系统、电子系统等非常复杂的系统,但对于驾驶员而言并不需要去了解太多内在的原理性东西,只需要掌握如何去操作即可。在程序设计中也是如此,我们追求“高内聚、低耦合”,即将对象内部的复杂特性进行隐藏,只对外供开简单的、必要的部分,便于外界调用。
Java中通过权限修饰符可以对数据进行封装,可以将数据声明为private类型,再提供public的方法(常见的set、get方法),对属性进行操作。这样的好处包括:

  • 隐藏一个类中不需要对外展示的细节;
  • 调用者只能通过声明好的方法访问数据,能够限制对属性不合理的操作;
  • 便于修改,便于维护。

Java提供四种权限修饰符用于修饰部分类的成员分别是public、protected、(缺省)、private,四种权限修饰符的权限如下表所示:

权限修饰符 类内部 同一个包 不同包的子类 同一个工程
private
(缺省)
protected
public

需要注意的是,对于类而言,只能用public和(缺省)来修饰。

当属性被声明为private之后,则只能在本类使用,如果需要在其他地方使用,则需声明相应公共的set、get方法,为了提高开发效率,我们可以借助开发工具自动生成,例如在eclipse中点击Source---->Generate Getters and Setters对相应的私有化属性设置get、set方法。
Java面向对象(二)——三大特征封装、继承、多态

2.继承性

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中, 那么多个类无需再定义这些属性和行为,只要继承那个类即可。被继承的类称为父类,继承父类的类称为子类。子类继承了父类,就继承了父类的方法和属性。 在子类中,可以使用父类中定义的方法和属性,(但不能直接访问父类中私有的(private)的成员变量和方法),也可以创建新的数据和方法。

继承的出现减少了代码冗余,提高了代码的复用性;更有利于功能的扩展;让类与类之间产生了关系,提供了多态的前提。在Java中,只支持单继承和多层继承,即一个子类只能有一个直接父类,一个父类可以有多个子类。
Java面向对象(二)——三大特征封装、继承、多态
如果在声明类时没有明确地使用extends说明继承于哪个父类,则默认继承Object类,他是所有类的根父类。Object类中没有定义属性,但定义了一些方法,例如equals()、toString()、getClass()、clone()等等,也定义了一个空参的构造器。

说到这里不得不详细说明一下Object类中的equals()方法与操作符“==”的区别。没有重写过的equals()方法只适用于引用数据类型,比较两个对象的地址值是否相等。但很多类中都重写过equals()方法,例如类File、String、Date类及包装类中重写的equals()方法是比较类型及内容,而不考虑引用的是否是同一个对象。而“= =”既适用于基本数据类型又适用于引用数据类型,对于基本数据类型是比较两个变量的值是否相等,对于引用数据类型也是比较两个对象的地址值是否相同。

继承性还涉及很多知识,例如super关键字的使用等等,这里只是简单的概括,更多内容参考Java面向对象(三)——关键字(this,super,static,final,abstract,interface,implements,throw)

3.多态性

多态性是面向对象中最重要的概念,在Java中对象的多态性就是:父类的引用指向子类的对象 。其使用前提是继承性和方法的重写,仅适用于方法,不适用于属性。Java引用变量有两个类型:编译时类型和运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。例如,Man是Person的一个子类:

Person p = new Man(); //Person类型的p指向Man类型的对象

编译时类型是Person,运行时类型是Man。编译时类型和运行时类型不一致,就出现了对象的多态性。
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就只能访问父类中声明的属性和方法,当子类重写过父类中声明的方法后,运行时实际调用时执行的是子类重写的方法。即对于成员方法,编译时:要查看引用变量所声明的类中是否有所调用的方法;运行时:调用实际new的对象所属的类中的重写方法。

由于多态性的存在,规定我们只能调用父类中声明的方法,如果我们想要调用子类中特有的方法怎么办呢?这就涉及到了对象类型转化的向下转型。从子类到父类的类型转换可以自动进行 ,叫做向上转型(多态),而从父类到子类的类型转换必须通过强制类型转换实现 。需要说明的是无继承关系的引用类型间的转换是非法的。
Java面向对象(二)——三大特征封装、继承、多态
向下转型需要实例a是属于A类的,否则会出现ClassCastException异常 ,因此再向下转型之前需要使用instanceof进行判断:

if (p instanceof Man) { 
	Man m = (Man) p; // 将p强制转换为Man类型
	System.out.pritnln(m.getname());
 }

强制转换后即可使用子类中特有的属性和方法。

以上就是关于封装、继承、多态特性的简单介绍,如果有错误的地方欢迎大家指正。

本文地址:https://blog.csdn.net/weixin_44011294/article/details/107283786

上一篇:

下一篇: