——- 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);
}
}
运行结果:
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 特点
- 函数名与类名相同。
- 不用定义返回值类型。
- 没有具体的返回值
例子:
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;
}
}
执行结果: