目录
面向对象
一、概述
面向:
看向,看中,面对。
对象:
帮你做事情的那个人。
“面向对象”(英语:Object Oriented,简称OO)是一种以事物为中心的编程思想。
如今主流的软件开发思想有两种:一个是面向过程,另一个是面向对象。面向过程出现得较早,典型代表为C语言,开发中小型项目的效率很高,但是很难适用于如今主流的大中型项目开发场景。面向对象则出现得更晚一些,典型代表为Java或C++等语言,更加适合用于大型开发场景。两种开发思想各有长短。
面向对象是相对于面向过程而言的(C则是一个典型的面向过程的语言),站在面向对象的角度去看问题,你则是对象的动作的指挥者。如果站在面向过程的角度去看问题,你则是动作的执行者。
对于面向过程的思想:当需要实现一个功能的时候,看中的是每一个步骤怎么做,整体的过程是怎样的。每一个操作都需要自己亲力亲为。
对于面向对象的思想:当需要实现一个功能的时候,不看重具体的过程和步骤是怎样的,而是关心“谁能帮我做这件事情”。(偷懒儿,找人帮我做事儿。)
面向对象的三大特征有:封装性、继承性、多态性。
二、生活举例
1、洗衣服
面向过程(手洗):脱衣服、找一个盆、加水、加洗衣粉、浸泡30分钟、搓洗、拧衣服、倒掉水、再加水、漂洗、拧衣服、倒掉水、晾衣服。
面向对象(机洗):脱衣服、放入洗衣机、按下开关、拿出衣服晾晒。
2、买电脑
面向过程(自己买):需要电脑、查询参数信息、横向比较机型、了解打折信息、与店家讨价还价、下单、收快递、开机验货、确认收货。
面向对象(找人买):需要电脑、找秘书帮我买、收电脑。
3、吃饭
面向过程(自己做):我饿了、买菜、洗菜择菜、切菜、起火、炒菜、盛菜、吃饭、刷碗。
面向对象(出去买):我饿了、买饭、吃饭。
import java.util.Arrays;
public class ObjectOrientedDemo01 {
public static void main(String[] args) {
int[] array = { 10, 20, 30, 40, 50 };
// 首先使用面向过程的思想,每一个步骤细节都要亲自处理
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) {
System.out.println(array[i] + "]");
} else {
System.out.print(array[i] + ", ");
}
}
System.out.println("==================");
// 使用面向对象的思想,达到同样的效果。
// 自己不处理详细的步骤,而是找人帮我做事儿。
// 在JDK当中已经给我们提供好了一个工具,叫做Arrays
// 通过这个工具就可以将数组转换成为指定格式的字符串
// 我自己不做,而是找Arrays帮我把数组转换成为指定格式的字符串
System.out.println(Arrays.toString(array));
}
}
三、类与对象的关系
类:
是用来描述现实世界中某一类事物的,描述那一类事物的共同的特点。
我们学习编程语言,就是为了模拟现实世界中的事物,实现信息化来提高工作效率。例如银行的业务系统、超市的结账系统等,都是如此。那么现实世界的事物通常分成两个组成部分:
属性:事物的特征描述信息,“是什么”。
行为:事物的能力行动方案,“能做什么”。
面向对象的语言当中,“类”就是用来模拟现实事物的。类中也有属性、行为两个组成部分,而“对象”是类的具体实例。例如:
类:抽象的,是一张“手机设计图”。
对象:具体的,是一个“真正的手机实例”。
类是如何描述 那一类事物的,从哪几方面描述的?
1、属性
是从静的一方面来描述的,是那一类事物都有的东西:
那一类学生都有 姓名, 年龄, 性别,这三个都是属性.
2、行为
是从动的一方面来描述的,是那一类事物都能做的事情:
那一类学生都学习,吃饭, 这两个都是行为.
在类中如何表示属性和行为?
属性:
使用变量来表示,这个变量需要定义在类的里面,方法的外面.
行为: 使用方法来表示.
对象:
是那一类事物中的一个 个体。
类和对象的关系:
1.先有类,后有对象;
2.对象是使用类创建出来,没类就没有对象;
3.想创建对象,必须先把类定义出来;
创建对象的目的,是为了调用对象方法.也就是调用对象的功能,帮我们做一件事情。
类就是创建对象的模板。
四、类的构成
类(Class) 由3个部分构成
- 类的名称:类名
- 类的属性:一组数据
- 类的方法:允许进行操作的方法 (行为)
五、类的定义
类是用来模拟现实事物的代码手段,事物分成属性、行为两个部分,类当中也对应地包含两个部分:
- 成员变量(属性):将变量位置直接定义在类中,在方法外,即为成员变量。
- 成员方法(行为):将普通的方法去掉static关键字,即为成员方法。
类的定义格式:
修饰符 class 类名{
定义属性
定义方法
}
类的属性
属性是指类(这类事物)拥有的特征。属性,通常是名词。
例如:定义一个学生类,拥有的属性有:学号,姓名,年龄,家庭住址...
通常,我们在定义类的属性时,遵循的原则是,需要什么属性就定义什么属性。
定义属性的语法:
[访问控制符] 数据类型 属性名 [=值]
public class Student {
int id;
String name;
int age;
}
类的方法
方法,指一个类的行为(动词)。
方法的四个要素:
1、访问控制符(修饰符)
2、返回值类型——(方法调用结束之后,返回给调用者的信息) void(方法没有返回值)
3、方法名——调用的时候用来区分
4、参数列表——参数--方法运行时,需要的额外的信息.方法有返回值,在方法中就一定要有return
public class Student {
int id; // id --成员变量
String name;
int age;
// 成员方法
public void eat(String food){
System.out.println("吃"+food);
}
}
创建实例(对象)
类创建对象的过程叫做实例化。
创建对象的格式 :
类名 对象名 = new 类名();
(对象名,通常叫做对象引用)。
内存分配图
一个对象
对象的名称其实就是一个局部变量,里面存放的是地址值。真正new出来的对象在堆内存当中,而且成员方法保存的是方法区中的地址。
两个对象
两个引用指向堆里面的同一个对象
六、对象的基本使用
访问属性的格式:
对象名.属性名;
调用方法的格式:
对象名.方法名(实参列表);
public class Student {
int id; // id --成员变量
String name;
int age;
public void study(){
System.out.println(name+"认真学习~~~");
}
}
public class Test02 {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "庄强";
stu.study();
}
}
七、局部变量与成员变量的区别
- 定义的位置不同:
- 局部变量定义在方法内
- 成员变量定义在方法外,直接在类中
- 内存的位置不同:
- 局部变量是在栈内存中的
- 成员变量是在堆内存中的
- 生命周期不同:
- 局部变量随着方法进栈而出现,随着方法出栈而消失
- 成员变量随着对象被创建而出现,随着对象被回收而消失
- 默认值不同:
- 局部变量没有默认值,必须赋值之后才能使用
- 成员变量如果没有赋值,那么会有默认值
八、面向对象练习
完成汽车修理功能。
汽车类(Car)和修理厂类(Factory)
Car的属性和方法:
属性:名字、颜色、轮胎数量
方法: 跑。方法要求: 如果汽车的轮子数量少于4个则显示汽车不能正常运行,如果是4个汽车则可以跑起来。
Factory的属性和方法。
属性:名字、地址
方法:修理汽车(修理汽车的轮胎数量)
编写汽车类、修理厂类和测试类。
public class Car {
String name;
String color;
int lunTaiNum;
public void run(){
if (lunTaiNum == 4){
System.out.println("汽车跑起来了~~~~");
}else {
System.out.println("汽车不能正常运行,请修理~~~~");
}
}
}
public class CarFactory {
String name;
String address;
public void repairCar(Car car){
car.lunTaiNum = 4; // 完成了修理工作
System.out.println("车修好了~~~");
}
}
public class Test {
public static void main(String[] args) {
Car car = new Car(); //创建汽车
car.name="奥迪"; // 设置属性
car.color="黑色";
car.lunTaiNum=3;
car.run();
CarFactory carFactory = new CarFactory(); // 创建修理厂
carFactory.repairCar(car);
car.run(); // 调用方法
}
}
九、方法的参数传递
1.传递的参数是基本类型:
基本类型的数据作为实参传递时,如果修改了形参的值,不会影响 实参的值.
传递参数时传递的是基本类型的实参的值,也叫值传递.
2.传递的参数是引用类型
引用类型的数据作为实参传递时,如果修改了形参的值,会影响 实参的值.
传递是 对象的地址,也叫引用传递.
十、匿名对象
匿名对象:没有名字的实体,也就是该实体没有对应的变量名引用。
创建匿名对象:只创建对象,没有给对象取名字。
匿名对象的用途
1、当对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化。
为什么只对方法,而不调用属性呢?因为匿名对象调用属性没意义。
如果对象要多成员进行多次调用,必须给对象起个名字。不能在使用匿名 对象。
2、匿名对象可以实际参数进行传递。
匿名对象只能被使用一次,使用完毕后会被垃圾回收器尽快回收。
通常情况下,创建匿名对象后立即调用它的方法。
在什么时候创建匿名对象?
当在一个方法中,只有那一个地方使用到对象,就可以创建一个匿名对象。
匿名对象可以用在哪些地方?
1.作为实际参数传递
2.作为方法的返回值
匿名对象的简单演示
new Car().num=5;
new Car().clor="blue";
两个new 是两个不同的对象,在堆内存中有不同的空间,相互不相互干扰。
匿名对象的使用
1、当只使用一次时可以使用匿名对象。执行完毕到;后该对象就变成了垃圾。
new Car().run();
2、执行方法时,可以将匿名对象作为实际参数,传递进去。
十一、形参和实参
形参:形式参数(声明方法时,方法中声明的参数)
实参:实际参数(调用方法时,实际传给方法的参数)
注意:形参的改变,不会影响实参
上一篇:(19)Java基础 --数组