浅谈java面向对象的理解
一、描述
把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。
二、面向对象与面向过程(也叫结构化编程)的区别
项目名称 面向对象 面向过程
面向对象顾名思义就是把现实中的事务都抽象成为 面向过程是“自上而下”的设计语言,先定好框架,再增砖添瓦。
定义 程序设计中的“对象”,其基本思想是一切皆对象, 通俗点,就是先定好main()函数,然后再逐步实现mian()函数中
是一种“自下而上”的设计语言,先设计组件,再完成拼装。 所要用到的其他方法。
特点 封装、继承、多态 算法+数据结构
优势 适用于大型复杂系统,方便复用、 适用于简单系统,容易理解
劣势 比较抽象、性能比面向过程低 难以应对复杂系统,难以复用,不易维护、不易扩展
对比 易维护、易复用、易扩展,由于面向对象有封装、继承、多态 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比
性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加 如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的
易于维护 因素。
三、类与对象的主要区别
对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
四、面向对象三大主要特征
封装
一层含义是把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单元(即对象)中。
另一层含义指“信息隐藏”,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓,或只允许使用对象的功能,而尽可能隐藏对象的功能实现细节。
1、封装特性
(1)良好的封装能够减少耦合,符合程序设计追求“高内聚,低耦合”。
(2)类内部的结构可以自由修改。
(3)可以对成员变量进行更精确的控制。
(4)隐藏信息实现细节。
2、封装实现步骤
(1)修改属性的可见性来限制对属性的访问(一般限制为private),这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
public class Person {
private String name;
private int age;
}
(2)对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
public class Person{
private String name;
private int age;
private boolean alive;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
}
(3)封装同时可以提高代码的安全性,例如普通的类属性不是private修饰就直接可以通过“对象名.属性 = xxx”对其赋值,但当我们用private修饰该属性后就不能这样对其做任意的修改了,而且我们还可以在其对外的访问方法中进行合法值校验。比如上例中的setAge()就可以更改为:
public void setAge(int age){
if(age > 120)
System.out.println("Age setting error");
else
this.age = age;
}
3、封装使用细节
(1)一般使用private访问权限
(2)提供相应的get、set方法来访问相关属性,这些方法通常是public修饰的。以提供对属性的赋值与读取操作。(注意!boolean变量的get方法是is开头。)
(3)一些只用于本类的辅助性方法,可以使用private修饰,希望其他类调用的方法用public修饰。
继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
1、类的继承格式
class 父类 { }
class 子类 extends 父类 { }
【注意说明】
需要注意的是 Java 不支持多继承,但支持多重继承。
2、继承的特性
(1)提高类代码的复用性。
(2)提高了代码的维护性。
(3)使得类和类产生了关系,是多态的前提(它也是继承的一个弊端,类的耦合性提高了)。
(4)子类拥有父类非 private 的属性、方法。
(5)子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
(6)子类可以用自己的方式实现父类的方法,即重写父类方法。
(7)Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
(8)继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
(9)提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。多态
多态是同一个行为具有多个不同表现形式或形态的能力。
1、多态的类型
方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
对象多态:子类对象可以与父类对象进行转换,而且根据其使用的子类不同完成的功能也不同(重写父类的方法)。
【注意说明】
多态是面向对象的最后一个主要特征,它本身主要分为两个方面:
(1)方法的多态性:重载与覆写
重载:同一个方法名称,根据不同的参数类型及个数可以完成不同的功能。
覆写:同一个方法,根据操作的子类不同,所完成的功能也不同。
(2)对象的多态:父子类对象的转换
向上转型:子类对象变为父类对象,格式:父类 父类对象 = 子类实例,自动。
向下转型:父类对象变为子类对象,格式:子类 子类对象 = (子类)父类实例,强制。
2、多态的特性
(1)消除类型之间的耦合关系。
(2)可替换性。
(3)可扩充性。
(4)接口性。
(5)灵活性。
(6)简化性。
3、多态的实现方式
(1)重载与重写
(2)抽象类和抽象方法,在Java中,一个没有方法体的方法称为抽象方法。而一个类中如果有抽象方法,那么这个类就称之为抽象类。
(3)接口