面向对象
面向对象是一种思想,以对象为基础
(一)为什么要面向对象
**OO **(Object Oriented ):面向对象, 是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
OOP(Object Oriented Programming ):面向对象编程, 是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
PO (Procedure Oriented) :面向过程,是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
举例
1、吃饭
面向过程:买菜->洗菜->切菜->炒菜->吃菜
面向对象:找对象(饭店,外卖,妈妈)->点菜->吃菜
2、洗衣服:
面向过程:将脏衣服放入盆子->放水->放洗衣粉->洗->脱水->晒衣服
面向对象:将脏衣服放入洗衣机->放洗衣粉->洗衣->晒衣服
1、面向对象的特点:
- 更符合我们的思考习惯
- 把复杂问题简单化
- 让执行者变成指挥者
2、程序中如何去使用面向对象的思想
-
有对象??
-
什么是对象?:万物皆是对象
对象太多了,每个实现起来不方便?那就对对象进行划分类别(分类)
3、面向对象怎么开发?
-
对象怎么产生???===》通过类,生产对象
模型 创建具体对象
-
怎么写类??? ====》把相同对象的信息,行为给抽象出来
- 创建类(一般找名词(实体))
- 写属性(变量)(该实体具有的信息)
- 写方法(实体的行为)
-
类的内容有哪些???信息和行为
例如
学生类
信息:姓名、年龄、地址、学号、学院、专业、班级
行为:上课、考试...
经典案例
把大象装进冰箱面向过程:
打开冰箱,把大象放进冰箱,关闭冰箱面向对象
冰箱类:
信息:体积、颜色、品牌(项目需要的信息)
行为:打开冰箱、关闭冰箱
大象类:
信息:体积
行为:进冰箱
实现类:
冰箱类 冰箱1 = new 冰箱类();
大象类 大象1 = new 大象类();冰箱1:打开冰箱 大象1:进入冰箱 冰箱1:关闭冰箱
java是一门面向对象的语言,它提供了class关键字
(二)类和对象
类:具有相同属性和行为的一组对象的集合
对象:一个具体的事物(万物皆对象)
1、类和对象的关系:
类是对象的抽象,对象是类的实例
2、类的组成:
-
属性(信息):变量
-
方法(行为):方法
3、创建类
语法:
修饰符 class 类名{
// 属性
// 方法
}
// 类名规范:符合标识符命名规范;行业规范,大驼峰命名
// 修饰符 public:公共的,暂时只写这个
注:一个java文件中可以写多个类但是一个java文件中只能写一个public修饰的类,并且public修饰的类名和文件名必须相同
规范:一个java文件只写一个类,前期为了理解,会在一个文件里写多个类
定义类的属性
// 修饰符 数据类型 属性名;
public int age;
public String name;
// 属性也必须符合命名规范,小驼峰命名
定义类的方法(行为)
修饰符 返回值类型 方法名(参数类型1 参数1,参数类型2 参数2,...){
// 方法体;
return 返回值; // 如果返回值类型是void可以不写renturn;
}
4、创建对象
对象:对象是类的实例化
怎么产生对象??? ===》new一个
// 类名 对象名 = new 类名();
注:new对象时,会给属性给默认值
// 基本类型:
int,long,byte,short默认值:0
float,double默认值:0.0
char默认值:\u0000
boolean默认值:false
// 引用类型默认值:null
类相当于一个模型,new 类名()相当于根据模型产生的一个具体的对象
获取对象属性
对象.属性
// 调用对象属性使用"."
给对象属性赋值
属性相当于一个变量,给变量赋值
对象.属性 = 值;
调用对象方法
对象.方法名() // 无参方法
对象.方法名(实际参数) // 有参方法
**5、对象在内存中的存储过程
public class Demo {
public static void main(String[] args) {
Cat cat = new Cat();//实例化一个Cat对象
//给成员变量赋值
cat.name = "招财";
cat.age = 2;
cat.weight = 2.02;
//打印属性
System.out.println("小猫的名字:"+cat.name + " 小猫的年龄:"+cat.age);
cat.say();//调用成员方法
}
}
class Cat {
String name;//成员变量 name
int age;// 成员变量 age
double weight;//成员变量 weight
public void say(){ // 方法
System.out.println("喵喵~~");
}
}
-
在程序的执行过程中,首先Demo类中的成员属性和成员方法会加载到方法区
-
程序执行main() 方法时,main()函数方法体会进入栈区,这一过程叫做进栈(压栈)。
-
Cat cat = new Cat();
首先会把Cat类的成员属性和成员方法加载到方法区,此时方法的内存空间地址为1x000000
,同时在在堆内存开辟一块内存空间74a14482
,用于存放 Cat 实例对象,并给成员属性及成员方法分配对应的地址空间 -
对 cat 对象进行赋值
-
执行到
cat.say() ;
方法时,会先到栈区找到cat这个引用变量 , 在堆内存中找到 new Cat() 对象里面的say()
方法进行调用,在调用say()
方法时,会**在栈区开辟一块空间进行运行**。 -
say()
被调用完成后,就会立刻马上从栈内弹出(出栈 ),最后,在main()函数完成后,main()函数也会出栈
(三)全局变量和局部变量
以变量在类中的位置来划分:
-
全局变量(成员变量)
方法外的变量
-
局部变量
方法的内部(方法里,方法声明(形参))
1、全局变量(成员变量)与局部变量的区别
-
位置不同
全局变量:在方法外
局部变量:方法里或方法声明(形参)
-
作用范围不同
全局变量:类中都可以使用
局部变量:只有定义该变量的方法可以使用
-
在内存中的位置不同
全局变量:全局变量是创建对象时new出来的,存放在堆中
局部变量:在栈内存中
-
初始值不同
全局变量:有默认值
局部变量:没有默认值,必须赋值后才能使用
-
生命周期不同
全局变量:随着对象的创建而存在,随着对象的销毁而销毁
局部变量:随着方法的调用而存在,随着方法的执行完成而消失
2、什么时候用成员变量?
- 当变量是用来描述类的属性时
(四)匿名对象
平时对象在创建时,都会取一个名字
类名 对象名 = new 类名();
匿名对象就是不给对象取名字:
new 类名();
应用场景
-
调用方法:仅仅只调用一次的时候
如:
new Student().study();
-
可以作为实际参数进行传递
xx.show(new Student());
2、什么时候用成员变量?
- 当变量是用来描述类的属性时
(四)匿名对象
平时对象在创建时,都会取一个名字
类名 对象名 = new 类名();
匿名对象就是不给对象取名字:
new 类名();
应用场景
-
调用方法:仅仅只调用一次的时候
如:
new Student().study();
-
可以作为实际参数进行传递
xx.show(new Student());