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

——- 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值