黑马程序员--Java面向对象理解

来源:互联网 发布:三菱plc编程教学视频 编辑:程序博客网 时间:2024/05/20 11:49

——- android培训、java培训、期待与您交流! ———-

1.1 面向对象概念

1.1.1 面向对象概念

    面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,    扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。    面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术[1] 发展到一定阶段后的产物。---摘自百度百科    相对面向过程而言,面向对象和面向过程都是一种思想。    面向过程强调的是功能行为,而面向对象强调的对象本身。    例子    计算长方形面积。思路:1:先求出长;2:求出宽;3:求面积:长x宽    例子    计算长方形面积。思路:1:设置长方形对象的长;2:设置长方形对象的宽;3:调用长方形的求面积方法    在使用面向对象分析过后,所有的操作都在对象本身,我们调用对象自己的功能就可以实现目的
package com.test.blog1;/* * 长方形类 * 包含的属性:长、宽 * 包含的行为:求面积 * */public class Rectangle {    // 属性:长    private long chang;    // 属性:宽    private long kuan;    // 求面积,并返回面积值    public long getMianji(long chang, long kuan) {        return chang * kuan;    }    // 取得长属性    public long getChang() {        return chang;    }    // 设置属性长的值    public void setChang(long chang) {        this.chang = chang;    }    // 取得宽的值    public long getKuan() {        return kuan;    }    // 设置属性宽的值    public void setKuan(long kuan) {        this.kuan = kuan;    }}

1.1.2 面向对象特征

1:封装(encapsulation)

  上述例子中,属性长、属性宽、属性求面积方法都封装在长方形类中就是封装的体现

2:继承(inheritance)

3:多态(polymorphism)

1.2 类与对象的关系

    类是具体事物的抽象,概念上的定义。对象即是该类事物实实在在存在的个体。    对于同一类事物可以抽取它们的共性的内容,定义在类中。    例子:    在上述求长方形面积的例子中,可以进行思考:每个长方形都具有长、宽属性,都有求取面积的功能。    那么可以对这些共性的东西进行抽取定义,就形成了长方形类。该类包含属性长和宽,包含方法求面积。    而每个长方形的长和宽都不一样,对应的面积也不一样。不同长、宽的长方形就是一个个对象。

1.2.1 如何定义类

     定义类就是定义类所抽象出来的对象的属性和行为。     属性也可以理解为变量,行为也可以理解为方法。     如上述例子中,长和宽就是变量(属性),求面积方法就是方法(行为)。     变量(属性)的分类:     a):成员变量:        1.成员变量定义在类中,在整个类中都可以被访问。        2.成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。        3.成员变量有默认初始化值。(每个类型的变量对应不同的初始值)     b):局部变量:        1.局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。        2.局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。        3.局部变量没有默认初始化值。

1.2.2 类创建并使用对象

例子:创建长方形类并调用其求面积方法
package com.test.blog1;/* *  * 创建类并使用类 * 测试创建长方形类并调用其求面积方法 *  * */public class Demo {    public static void main(String[] args) {        // 通过new关键字,建立对象        // r就是一个类类型的引用变量,该变量存在在栈内存中,指向了该类的对象。new Rectangle()对象在堆内存中        Rectangle r = new Rectangle();        // 为长赋值        r.setChang(12l);        // 为宽赋值        r.setKuan(3l);        // 调用对象的方法求面积        long result = r.getMianji(r.getChang(), r.getKuan());        System.out.println("长为:" + r.getChang() + " 宽为:" + r.getKuan()                + "的长方形面积为: " + result);    }}

运行结果:
01

1.2.3 对象内存分析

     Rectangle r1 = new Rectangle();    // 为长赋值    r1.setChang(12l);    // 为宽赋值    r1.setKuan(3l);    Rectangle r2 = new Rectangle();    // 为长赋值    r2.setChang(12l);    // 为宽赋值    r2.setKuan(3l);

结构分析图:
这里写图片描述


new操作符定义的实体会在堆内存中开辟一个新的空间,并且每一个对象中都有一份属于自己的属性。
各个对象属性的修改不会影响。
堆内存中的对象如果没有变量引用,会被垃圾回收器回收。
例如将r2=null,此时r2原来执行堆内存中地址为0x0089的对象就会被垃圾回收器回收。

 思考:在项目开发中,对于成员变量的使用,如果不在使用, 则尽可能的明确定义为null,是不是可以防止垃圾没被回收,预防内存泄露

1.3 构造函数

1.3.1 特点

  1. 函数名与类名相同。
  2. 不用定义返回值类型。
  3. 没有具体的返回值

例子:

package com.test.blog1;/* * 长方形类 * 包含的属性:长、宽 * 包含的行为:求面积 * */public class Rectangle {    //无参构造函数     public Rectangle() {        System.out.println("长方形类的构造函数,没有参数");    }    // 属性:长    private long chang;    // 属性:宽    private long kuan;    // 求面积,并返回面积值    public long getMianji(long chang, long kuan) {        return chang * kuan;    }    // 取得长属性    public long getChang() {        return chang;    }    // 设置属性长的值    public void setChang(long chang) {        this.chang = chang;    }    // 取得宽的值    public long getKuan() {        return kuan;    }    // 设置属性宽的值    public void setKuan(long kuan) {        this.kuan = kuan;    }}

1.3.2 与一般方法区别

构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。
一般函数:对象创建后,需要函数功能时才调用。

构造函数:对象创建时,会调用并且只调用一次。
一般函数:对象创建后,可以被调用多次。

分析:构造函数由Java自发执行,并且只执行一次;
一般函数由调用者执行,执行次数不限。
如果没有显示声明构造函数,则java会默认生成一个无参的执行体内没有内容的构造函数。

1.3.3 构造函数可以有多个

构造函数可以有多个,因为同名,所以是以重载的形式存在

例子:

package com.test.blog1;/* * 长方形类 * 包含的属性:长、宽 * 包含的行为:求面积 * */public class Rectangle {    // 属性:长    private long chang;    // 属性:宽    private long kuan;    // 无参构造函数    public Rectangle() {        System.out.println("长方形类的构造函数,没有参数");    }    // 有参数的构造函数    public Rectangle(long chang, long kuan) {        this.chang = chang;        this.kuan = kuan;        System.out.println("长方形类的长为:" + chang + " 宽为:" + kuan);    }    // 求面积,并返回面积值    public long getMianji(long chang, long kuan) {        return chang * kuan;    }    // 取得长属性    public long getChang() {        return chang;    }    // 设置属性长的值    public void setChang(long chang) {        this.chang = chang;    }    // 取得宽的值    public long getKuan() {        return kuan;    }    // 设置属性宽的值    public void setKuan(long kuan) {        this.kuan = kuan;    }}

执行结果:
03

0 0
原创粉丝点击