Java面向对象(封装、继承、多态)
为什么要面向对象编程?
以前开发的过程通常是采用面向过程编程,面向过程是以过程为中心来进行编程设计,本质上是分析出需要哪些过程,在编程时一步步的对其实现,但是随着软件规模的扩大,这种面向过程的设计模式已经越来越不适应如此大规模的软件。面向过程存在着诸多的缺点比如:
1.软件重用性差
重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。
2.软件可维护性差
软件工程强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指标。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护性差。
3.不能满足用户需要
用传统的结构化方法开发大型软件系统涉及各种不同领域的知识,在开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。
举例说明:将大象放进冰箱分几步?三步:打开冰箱、把大象放进去、关上冰箱
对于面向过程:
public class Test { // 1. 打开冰箱
public static void openFridge()
{
System.out.println("第一步:将冰箱门打开!");
}
// 2. 打开冰箱
public static void putElepantIntoFridge()
{
System.out.println("第二步:将大象放进冰箱!");
}
// 3. 打开冰箱
public static void closeFridge()
{
System.out.println("将冰箱门关上!");
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
openFridge();
putElepantIntoFridge();
closeFridge();
}}
面向对象的实现方式:
public class Test { public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// 冰箱对象
Fridge fridge = new Fridge();
fridge.setFridgeName("fridge");
// 大象对象
Elephant elephant = new Elephant();
elephant.setElepantName("elephant");
fridge.openTheDoor();
fridge.putin(elephant);
fridge.closeTheDoor();
}
}class Fridge
{
private String fridgeName;
public void openTheDoor()
{
System.out.println(this.fridgeName + "打开门!");
}
public void closeTheDoor()
{
System.out.println(this.fridgeName + "关闭门!");
}
public void putin(Elephant elephant)
{
System.out.println(elephant.getElepantName()+"放进来了!");
}
public String getFridgeName() {
return fridgeName;
} public void setFridgeName(String fridgeName) {
this.fridgeName = fridgeName;
}
}
class Elephant
{
private String elepantName;
public String getElepantName() {
return elepantName;
} public void setElepantName(String elepantName) {
this.elepantName = elepantName;
}
}
什么是面向对象?
面向对象的分析根据抽象关键的问题域来分解系统。面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成“现实世界”的对象。面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。
万事万物皆对象,这符合我们日常生活的认知,对于一个人来说,人会包含一些属性,比如说:年龄、姓名、性别等等,那么这样的一个人我们要对他进行描述的话,就是将他作为一个整体,而这个整体本身又包含了上述所说的诸多的一些属性,那么我们把这个整体可以看做是对象,当然这在程序中是一个类,那么这个集成的过程就是封装。
面向对象与基于对象的区别?
面向对象三个特征:封装、继承、多态。而基于对象的特征是封装,没有实现继承和多态。(没有实现继承那么多态也就无从谈起了,因为多态是建立在继承的基础上的。)区分这两者的关键就是去看到底有没有继承和多态。有很多技术都是基于对象的,他们只是使用封装好的对象,调用其中的方法,设置对象的属性。比如我们web开发过程中会经常用到bean类,这个一般的是基于对象的,但是当你实现继承之后那就是面向对象了。
面向对象的重要特性:封装
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
那么,有些刚刚学习或者外行的人会问,我为什么要封装?你看我这些属性直接使用public的我就可以直接访问了,而且代码还很少,写起来很简单的呀。那么我要问一下,你的这个类是不是其他的任何人对里面的任何的属性值都可以任意的修改了对吗?当然是对的。如果你作为这个类的角度去想,我的东西凭什么你就想用就用,这个属性是我的,作为一个类而言,我觉得我有权限去管管的呀对吧。再者呢,就是说我们通过封装的话可以在这些类中设置属性值的时候进行检测,控制一部分的传入的属性值使其符合标准的形式。
面向对象的重要特性:继承与多态
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
(1)继承关系是传递的。若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
(3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
(5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。
多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
举例说明:
public class Test2 { public static void main(String[] args) {
// TODO Auto-generated method stub
Man man = new Man();
man.setPersonName("阳仔");
man.setPersonSex("男");
man.setHeight("64");
man.eat();
// 输出的是:吃月饼
System.out.println(man.toString());
}}
class Person
{
private String personName;
private String personSex;
public void eat()
{
System.out.println("eat food!");
}
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
public String getPersonSex() {
return personSex;
}
public void setPersonSex(String personSex) {
this.personSex = personSex;
}
}
class Man extends Person
{
private String Height;
public String getHeight() {
return Height;
} public void setHeight(String height) {
Height = height;
}
public void eat()
{
System.out.println("吃月饼");
} @Override
public String toString() {
// TODO Auto-generated method stub
return"姓名:" + this.getPersonName() + ",性别:" + this.getPersonSex() + ",身高:" + this.Height;
}
}
【Java面向对象(封装、继承、多态)】
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- jQuery插件