一、面向过程思想概述
我们在完成一个需求是,首先要清楚我们需要做什么,然后分析需要怎么做,最后再用代码去实现那些功能。在这过程中,每一步都需要我们去实现和操作,这就体现了面向过程的思想。
面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
面向过程强调的是每一个功能的步骤。
例如:
我们在洗衣服的过程中,如果采用面向过程的思想,那么步骤应该为:
把衣服脱下来---找一个盆---放洗衣粉---放水---浸泡十分钟---揉一揉---清洗---拧干---晾起来
二、面向对象思想概述
当需求比较简单时,我们可以一步一步去操作。可是随着需求的增加,功能的增多,我们再面对每一个步骤就会比较麻烦了。这是我们就应该想,能不能把这些相同或相近的步骤和功能进行封装,这样结构就会比较清晰,使用时直接找到相应的类就可以了。
面向对象强调的是对象,然后由对象去调用功能。
例如:
还是洗衣服的过程中,我们采用面向对象的思想,那么步骤应该为:
把衣服脱下来---打开全自动洗衣机---放入衣服---放入洗衣粉---按按钮---晾起来
1、面向对象的思想特征
- 是一种符合我们思考习惯的思想
- 可以将复杂的事情简单化
- 让我们从执行者变成了指挥者
2、如何模拟现实世界的事物
通过两个方面:
- 属性 就是事物的描述信息
- 行为 就是事物能够做什么
以学生来举例:
学生的属性有:名字、年龄、性别等等
学生的行为有:学习、玩游戏、运动等等
3、类和对象
在Java语言中,最基本的组成单位是类,所以,我们都是通过类来体现事物的。
(1)类
类就是一组相关的属性和行为的集合,是用来描述现实世界事物的。
我们之前说,一个事物是由两个方面组成:属性和行为,那么,与之相对应的,我们的类包括两个方面:成员变量和成员方法。
成员变量:和我们之前变量的定义是一样的。
成员变量和局部变量的区别:
- 在类中的位置不同:
成员变量的定义在类中方法外
局部变量定义在方法内或者方法声明上 - 在内存中的位置不同
成员变量在堆内存
局部变量在栈内存 - 生命周期不同
成员变量随着对象的存在而存在,随着对象的消失而消失
局部变量随着方法的调用而存在,随着方法的调用完毕而消失 - 初始化值不同:
成员变量有默认的初始化值
局部变量没有默认的初始化值,必须先定义赋值才能使用
成员方法:和我们学习的方法的定义是一样的,但是有一个小区别:
- 去掉了修饰符中的static
例如:我们需要定义一个学生类
学生事物:
- 属性:姓名、年龄...
- 行为:学习、吃饭...
学生类:
- 成员变量:姓名,年龄...
- 成员方法:学习、吃饭...
(2)对象
我们是用一个类,其实就是使用该类的成员(成员变量和成员方法)。而我们想要使用一个类的成员,就必须先拥有该类的对象。创建对象的格式:
类名 对象名 = new 类名();
对象访问成员的格式:
对象名.成员变量;//访问成员变量
对象名.成员方法(...);//访问成员方法,省略号代表参数
示例:
//定义一个学生类
public class Student {
// 学生的属性:姓名、年龄
String name;
int age;
// 学生的行为:吃饭、学习
public void eat() {
System.out.println("吃饭");
}
public void study() {
System.out.println("学习");
}
}
//定义一个测试类,调用学生类
public class StudentTest {
public static void main(String[] args) {
// 定义一个Student类的对象 s
Student s = new Student();
// 输出对象s的成员变量
System.out.println("姓名:" + s.name);
System.out.println("年龄:" + s.age);
// 调用对象s的成员方法
s.eat();
s.study();
// 给成员变量赋值
s.name = "张三";
s.age = 30;
// 再次输出对象s的成员变量
System.out.println("姓名:" + s.name);
System.out.println("年龄:" + s.age);
}
}
(3)内存图解
首先定义一个手机类
//定义一个手机类
public class Phone {
//定义手机类的成员变量
String brand;
int price;
String color;
//定义手机类的成员方法
public void call(String name){
System.out.println("给"+name+"打电话");
}
public void sendMessage(String name){
System.out.println("给"+name+"发短信");
}
}
然后定义一个对象调用手机类
public class PhoneTest1 {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println("品牌:"+p.brand);//null
System.out.println("价格:"+p.price);//0
System.out.println("颜色:"+p.color);//null
System.out.println("------------");
p.brand = "锤子";
p.price = 2999;
p.color = "棕色";
System.out.println("品牌:"+p.brand);//"锤子"
System.out.println("价格:"+p.price);//2999
System.out.println("颜色:"+p.color);//"棕色"
p.call("张三");
p.sendMessage("张三");
}
}
然后是定义两个对象的内存图解(共用方法区)
public class PhoneTest2 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "小米5s";
p.price = 1999;
p.color = "银色";
System.out.println("品牌:" + p.brand);// "小米5s"
System.out.println("价格:" + p.price);// 1999
System.out.println("颜色:" + p.color);// "银色"
System.out.println("------------");
p.call("张三");
p.sendMessage("张三");
Phone p2 = new Phone();
p2.brand = "华为P9";
p2.price = 3288;
p2.color = "灰色";
System.out.println("品牌:" + p.brand);// "华为P9"
System.out.println("价格:" + p.price);// 3288
System.out.println("颜色:" + p.color);// "灰色"
p2.call("李四");
p2.sendMessage("李四");
}
}
最后是两个引用指向同一个堆内存
public class PhoneTest3 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "OPPO";
p.price = 2999;
p.color = "白色";
System.out.println("品牌:" + p.brand);// "OPPO"
System.out.println("价格:" + p.price);// 2999
System.out.println("颜色:" + p.color);// "白色"
System.out.println("------------");
Phone p2 = p;
p2.brand = "魅族";
p2.price = 1999;
p2.color = "蓝色";
System.out.println("品牌:" + p.brand);// "魅族"
System.out.println("价格:" + p.price);// 1999
System.out.println("颜色:" + p.color);// "蓝色"
System.out.println("----------");
System.out.println("品牌:" + p2.brand);// "魅族"
System.out.println("价格:" + p2.price);// 1999
System.out.println("颜色:" + p2.color);// "蓝色"
}
}