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方法。
2.继承性
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中, 那么多个类无需再定义这些属性和行为,只要继承那个类即可。被继承的类称为父类,继承父类的类称为子类。子类继承了父类,就继承了父类的方法和属性。 在子类中,可以使用父类中定义的方法和属性,(但不能直接访问父类中私有的(private)的成员变量和方法),也可以创建新的数据和方法。
继承的出现减少了代码冗余,提高了代码的复用性;更有利于功能的扩展;让类与类之间产生了关系,提供了多态的前提。在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的对象所属的类中的重写方法。
由于多态性的存在,规定我们只能调用父类中声明的方法,如果我们想要调用子类中特有的方法怎么办呢?这就涉及到了对象类型转化的向下转型。从子类到父类的类型转换可以自动进行 ,叫做向上转型(多态),而从父类到子类的类型转换必须通过强制类型转换实现 。需要说明的是无继承关系的引用类型间的转换是非法的。
向下转型需要实例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
推荐阅读
-
Java中类、对象、封装、继承和多态(详细阐述)
-
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
-
Java中类、对象、封装、继承和多态(详细阐述)
-
面向对象封装、继承、多态
-
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
-
Java 面向对象三大特征之一:封装
-
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
-
【java基础】面试常见问题:类和对象,封装继承多态,final关键字,static关键字,类加载过程,双亲委派模型
-
一文带你了解java面向对象的三大特性:继承、封装、多态
-
python3全栈开发-面向对象的三大特性(继承,多态,封装)之继承