首页 > 代码库 > 面向对象编程

面向对象编程

6. 面向对象编程

<style>html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video { margin: 0; padding: 0; border: 0 } body { font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 1.6; color: #333; background-color: #fff; padding: 20px; max-width: 960px; margin: 0 auto } body>*:first-child { margin-top: 0 !important } body>*:last-child { margin-bottom: 0 !important } p,blockquote,ul,ol,dl,table,pre { margin: 15px 0 } h1,h2,h3,h4,h5,h6 { margin: 20px 0 10px; padding: 0; font-weight: bold } h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 code { font-size: inherit } h1 { font-size: 28px; color: #000 } h2 { font-size: 24px; border-bottom: 1px solid #ccc; color: #000 } h3 { font-size: 18px } h4 { font-size: 16px } h5 { font-size: 14px } h6 { color: #777; font-size: 14px } body>h2:first-child,body>h1:first-child,body>h1:first-child+h2,body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child { margin-top: 0; padding-top: 0 } a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6 { margin-top: 0; padding-top: 0 } h1+p,h2+p,h3+p,h4+p,h5+p,h6+p { margin-top: 10px } a { color: #4183C4; text-decoration: none } a:hover { text-decoration: underline } ul,ol { padding-left: 30px } ul li>:first-child,ol li>:first-child,ul li ul:first-of-type,ol li ol:first-of-type,ul li ol:first-of-type,ol li ul:first-of-type { margin-top: 0px } ul ul,ul ol,ol ol,ol ul { margin-bottom: 0 } dl { padding: 0 } dl dt { font-size: 14px; font-weight: bold; font-style: italic; padding: 0; margin: 15px 0 5px } dl dt:first-child { padding: 0 } dl dt>:first-child { margin-top: 0px } dl dt>:last-child { margin-bottom: 0px } dl dd { margin: 0 0 15px; padding: 0 15px } dl dd>:first-child { margin-top: 0px } dl dd>:last-child { margin-bottom: 0px } pre,code,tt { font-size: 12px; font-family: Consolas, "Liberation Mono", Courier, monospace } code,tt { margin: 0 0px; padding: 0px 0px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8 } pre>code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent } pre { background-color: #f8f8f8; border: 1px solid #ccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px } pre code,pre tt { background-color: transparent; border: none } kbd { background-color: #DDDDDD; background-image: linear-gradient(#F1F1F1, #DDDDDD); background-repeat: repeat-x; border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD; border-style: solid; border-width: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 10px; padding: 1px 4px } blockquote { border-left: 4px solid #DDD; padding: 0 15px; color: #777 } blockquote>:first-child { margin-top: 0px } blockquote>:last-child { margin-bottom: 0px } hr { clear: both; margin: 15px 0; height: 0px; overflow: hidden; border: none; background: transparent; border-bottom: 4px solid #ddd; padding: 0 } table th { font-weight: bold } table th,table td { border: 1px solid #ccc; padding: 6px 13px } table tr { border-top: 1px solid #ccc; background-color: #fff } table tr:nth-child(2n) { background-color: #f8f8f8 } img { max-width: 100% }</style>

1. 面向对象概念

阅读面对对象程序设计,回答以下问题:

1. 什么是面向对象编程
2. 什么是对象和类
3. 什么是类的封装
4. 什么是类的继承
5. 什么是类的多态

1.1 面向对象编程的概念

模拟人类的思维过程,一切皆对象

1.2 对象和类

1.2.1 对象

对象的两个要素:

  1. 属性:

    用于描述对象静态特性(结构特性)的数据项
    比如描述一个人的姓名、性别、年龄、出生日期等属性
    
  2. 方法:

    用于描述对象动态特性(行为特性)的操作系列
    比如人都具有工作、学习等行为特性
    

对象可以表示:

对象可以是看的见、摸的着的有形的实体,如计算机、飞机、汽车等等;
对象也可以表示人或组织所起的作用,如治病、教学、生产等; 
对象还可以表示事件,如各种事故、演出、战斗、开会等; 
对象更可以表示规则,如各种专家规则、约束条件、正则表达式等

1.2.2 类

把事物归纳、划分成类是我们认知世界常用的方法
分类的依据的原则是抽象,也就是忽略事物的非本质特征,只注意事物的本质特征
找出事物的共性并将具有共同性质的事物划分为同一个类

技术分享

同一类中的对象有相同的属性(也称为成员变量,它描述该类的静态特性或结构特性)
同一类中的对象有相同的方法(也称服务,它描述该类的行为特性或动态特性)
同一类中的对象遵守相同的语义规则。(共同的约束或规则)

技术分享

1.2.3 类和对象的关系

技术分享

1.3面对对象编程原则

1.3.1 封装

对象将数据和数据的操作打包为一个不可分割的最基本模块,使得只有该类的方法可以操纵和改变这些数据,这就是封装
封装是允许有选择地隐藏类中的属性和方法

1.3.1 继承

继承(重用)现有类生成新类

继承关系:

父类是有其它类继承其行为的类
继承父类的类称为子类

技术分享

1.3.3 多态

多态是建立在继承基础之上的

不同的子类继承自同一个父类,父类的用一个方法以不同方式实现 技术分享


2. 面对对象程序设计

2.1 创建类

类就是对象的模板(template ),是对象的抽象。
而对象就是类的一个实例(instance)
类包含:属性;方法
数据成员是通过方法(函数)访问的

2.1.1 类定义

Java使用关键字class定义一个类 定义类时,用属性(成员变量)定义类的静态特征,用方法来定义类的行为特征。

修饰符 class 类名{
  变量类型 变量名;
  …
  变量类型 变量名;
  方法修饰符 返回类型 方法名(形参1,形参2,…){
     //方法体
  }
  …
  方法修饰符 方法名(参数1,参数2,…){
    //方法体
  }
} 

例如:

public class Dog {
    int age;
    String name;
    String color;

    void barking() {
    }

    void sleeping() {
    }
}

2.1.2 定义属性(变量)

语法格式:

    修饰符 变量类型 变量名;
    修饰符 变量类型 变量名 = 变量值;
    private int row = 5;

类中的属性有:

  1. 局部变量

    在方法、构造方法或者语句块中定义的变量被称为局部变量。
    变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
    
  2. 成员变量

    成员变量是定义在类中,方法体之外的变量。
    这种变量在创建对象的时候实例化。
    成员变量可以被类中方法、构造方法和特定类的语句块访问。
    
  3. 类变量

    类变量也声明在类中,方法体之外,但必须声明为static类型。
    
  4. this关键字:

    //构造方法有三个参数
    public Dog(int age,String name,String color){
        //this代指当前对象,这样区分了局部变量和对象变量同名的问题
        this.age = age;
        this.name = name;
        this.color = color;
    }
    

    作用:表示对当前对象的引用;

    表示类的成员变量,而不是方法中的成员变量,在两者同名时进行区分,最常用的this使用方式;

    注意:this不能在static方法中使用

2.1.3 定义方法

语法格式:

修饰符 方法返回类型 方法名(形参1,形参2,…){
    方法体;//语句
}
例如:
public int add(int i,int j) {
    return i+j;
}

构造方法

构造方法是类的特殊方法,与类同名且没有返回值
对象的创建通过构造方法实现,构造方法的功能是完成对象的初始化,当类实例化一个对象会自动调用构造方法
类中必定有构造方法,若没有则系统自动添加一个无参无方法体的空构造方法

例如:

public Dog(int a,String n,String c){
    age = a;
    name = n;
    color = c;
}

2.1.4 定义类的属性和方法

  1. 静态变量

    不管创建了类的多少实例,整个类中静态变量的副本只有一个。
    引用静态变量的方法:通过类的名称,通过引用类的任一实例
    

    例如:

    //静态变量
    static int numOfLegs = 4;
    
  2. 静态方法

    静态方法只能访问静态成员,实例方法可以访问静态和实例成员
    之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象
    类方法没有this
    

    例如:

    //定义静态方法,获取腿的数量
    public static int getLegs(){
        return numOfLegs;
    }
    

2.2 创建对象

2.2.1 创建对象的格式

对象是类的实例化

Java中使用new关键字来创建对象

创建对象有两步:

    声明:声明一个对象,包括对象名称和对象类型
    实例化:使用关键字new来创建一个类的对象。

格式:

类名 对象名 = new 类名(); 

例如:

public class Dog {
    int age;
    String name;
    String color;

    //构造方法有三个参数
    public Dog(int a,String n,String c){
        age = a;
        name = n;
        color = c;
    }

    public static void main(String[] args) {
        //生成Dog类的一个对象,并按照构造方法参数表传入参数值
        Dog wangcaiDog = new Dog(1,"Wangcai","brown");
    }
}

2.2.2. 关键字new的作用

创建一块内存空间并将内存空间分配给创建的对象

将对象的属性成员变量全部初始化,并执行构造方法

类成员变量初始值:

Java保证了在任何代码使用该对象之前,已将对象中的状态信息初始化为缺省值

技术分享

2.3 属性和方法的调用

2.3.1. 对象的属性和方法调用:

格式:
对象.成员变量
对象.方法名()

例如:

//访问对象的变量
int age = wangcaiDog.age;
//调用对象的方法
wangcaiDog.barking();

2.3.2 类的属性和方法调用

格式:
类.成员变量
类.方法名()

例如:

    //调用Dog类的属性
    int numOfLegs = Dog.numOfLegs;
    //调用Dog类的静态方法而不需要生成一个对象来调用
    wangcaiDog.getLegs();

2.4 类的访问控制

Java中一般把属性数据和一些私有的方法声明为private或者protected类型,从而使这些数据或者方法不能被外部修改或调用。

只有我们希望被外部直接访问的属性数据和方法才声明为public。

如果在声明数据和方法时不写是private、protected还是public,那么类型为默认。

技术分享

2.5 对象的比较

两个对象相比较,一定要注意是比较值还是比较地址

    //生成Dog类的一个对象,并按照构造方法参数表传入参数值
    Dog wangcaiDog = new Dog(1,"Wangcai","brown");
    Dog xiaoheiDog = new Dog(1,"Wangcai","brown");
    System.out.println("两个对象的比较结果为:"+(wangcaiDog==xiaoheiDog));

2.6 对象的销毁

对象在创建的时候,系统会分配内存空间给新建的对象,当对象被销毁,内存空间会归还给系统,该对象就不可以再继续使用了。

    //生成Dog类的一个对象,并按照构造方法参数表传入参数值
    Dog wangcaiDog = new Dog(1,"Wangcai","brown");
    Dog xiaoheiDog = new Dog(1,"Wangcai","brown");
    System.out.println("两个对象的比较结果为:"+(wangcaiDog==xiaoheiDog));
    //销毁对象,将对象置为空
    wangcaiDog = null;

 

面向对象编程