学习目标:
一、目标
- 面向对象思想
- 类和对象
- 对象的创建和使用
- 属性和方法
- 封装
开始学习:
二、编程思想
2.1 什么是编程思想
做人有做人的原则,编程也有编程的原则。这些编程的原则,就叫做编程思想。
2.2 面向过程和面向对象
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
图分析:人把大象装进冰箱
2.3 面向过程(Procedure Oriented)编程思想
2.3.1面向过程思想
以过程为中心的编程思想 以什么正在发生为主要目标进行编程
2.3.2 面向过程实现
分析出解决问题所需要的每一个步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用
2.3. 3 应用场景
适合于功能简单、业务逻辑单一的场景,优势比较明显,效率较高
2.3.4 面向过程特点
参与每一个步骤 参与每一个实现 参与每一个细节
2.3.5 面向过程代表语言
fortan语言、C语言
2.4 面向对象介绍
2.4.1 面向对象(Object Oriented,OO)编程思想
以对象为核心编程思想,对象是指现实世界中所有事物。强调对象所具备的功能,需求通过对象来实现。 面向对象思想分类: 面向对象分析(Object Oriented Analysis)简称:OOA 面向对象设计(Object Oriented Design)简称:OOD 面向对象开发(Object Oriented Programming)简称:OOP
2.4.2 面向对象的三大特征
封装(Encapsulation)
继承(Inheritance)
多态(Polymorphism)
2.4.3 案例分析
案例一:吃饭
自己做: 打开地图搜索菜市场位置或找个大爷大妈问下菜市场在哪里->去菜市场->选菜->付款->拧菜回家->摘菜->洗菜->切菜->配菜—>炒菜 去餐馆: 老板,我要吃饭,老板说你吃啥,我说来个夫妻肺片,过了一会儿夫妻肺片就做好了 O2O外卖: 打开手机找到外卖app下单即可,外卖小哥回去商家取餐送上门。
案例二:洗衣服
自己洗: 准备工具(盆、桶、洗衣粉、搓衣板)->加水(考虑水温)->衣服放进去(浸泡、分颜色防止染色)->......->拧干水分->找地方用晾衣架晾起来 洗衣机洗: 衣服直接扔进洗衣机->加入洗衣粉->设定好洗衣模式->等待洗衣机洗完后通知声音->取出衣服晾起来 干洗店洗: 找到干洗店->把衣服给到美丽的老板娘->等待通知->取回衣服 O2O互联网洗衣: 打开app下单->抠脚大汉上门服务取衣服->洗完以后以后再送上门
2.4.5 面向对象思想总结
简单化:让复杂的事情简单化 角色转变:执行者 —> 指挥者 人性化:更加符合人类习惯思想
2.5 什么是编程
编程的目的是将现实世界的事物实现信息化,如:超市收银软件
做记号时代 --> 做算术时代 --> 使用纸和笔时代 --> 使用算盘时代 --> 超市收银机器
编程是人类发明的,编程思想源于现实世界,现实世界中所看到的的事物比较具体,编程将现实世界中的事物抽取到虚拟世界通过一种更加抽象方式展现;
先理解清楚现实世界的事物,实现信息化的过程就是软件开发
2.6 面向对象分析方法分析问题的思路和步骤
① 根据问题需要,选择问题所针对的现实世界中的实体
② 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类
③ 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构
④ 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具
三、类和对象
3.1 类
3.1.1 类的概述
编程都是为了将现实世界事物实现信息化,在Java语言中是以类(class)为单位描述现实世界的事物,将现实世界事物的属性和行为抽取到Java类中,可以理解为类是现实世界事物的抽象化
3.1.2 类如何描述现实世界的事物
JAVA类 | 现实世界事物 |
---|---|
成员变量 | 属性 |
成员方法 | 行为 |
成员变量:定义在类中方法外,描述现实世界某一类事物的属性。 成员方法:用于描述现实世界事物中的行为进行封装。
3.1.3 类的定义
格式:
修饰符 class 类名 { // 成员变量 // 成员方法 }举例:用类描述学生类
public class Student { String name; // 学生姓名 int age; // 学生年龄 String gender; // 学生性别 // 吃饭行为 public void eat() { System.out.println("我会吃饭"); } // 学习行为 public void study() { System.out.println("我会学习"); } // 睡觉行为 public void sleep() { System.out.println("我会睡觉"); } }
3.2 对象
3.2.1 对象的概述
对象是实际存在的该类事物的每个个体,因而也被称为实例。万事万物皆对象。
3.2.2 对象和类之间的关系
理解:
-
类 = 抽象概念的人 对象 = 实实在在某个人
-
类是描述现实世界事物的一组相关属性和行为的集合,对象是该类事物中的某一个具体对象
-
类只能存在想象阶段,对象比较具体,可以操作阶段
3.2.3 对象的创建和使用
3.2.3.1 对象创建
格式:
类名 对象名 = new 类名();
举例:
Person person = new Person();
3.2.3.2 使用对象
操作成员变量 赋值:
对象名.变量名 = 赋值; person.age = 10;
取值:
数据类型 变量名 = 对象名.变量名; int age = person.age;
直接输出:
输出语句(对象名.变量名); System.out.println(person.age);
操作成员方法
调用方法:
对象名.方法名(); person.sleep();
3.3 成员变量的初始化
类型 | 数据类型 | 默认初始化值 |
---|---|---|
基本类型(整数) | byte、short、int、long | 0 |
基本类型(浮点数) | float、double | 0.0 |
基本类型(字符型) | char | '\u0000' |
基本类型(布尔型) | boolean | false |
引用类型 | 数组、类、接口 | null |
3.4 类的访问机制
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量(static方法访问非static成员变量,编译不通过)
不在一个类中的访问机制:先创建要访问类的对象,再用对象访问类中的成员
3.5 练习
1、分析汽车的属性和行为,创建汽车对象和操作汽车对象 2、分析手机的属性和行为,创建手机对象和操作手机对象 3、分析狗的属性和行为,创建狗对象和操作狗对象
3.6 对象运行时内存图
Person类
class Person { // 人类 String name;// 姓名 int age = 10;// 年龄 boolean isMale;// 是否男性 }
一个对象内存图
两个对象内存图
三个对象内存图(不同的引用指向同一个对象)
3.7 匿名对象
匿名对象即没有名字的对象
举例:
//以下是两个对象分别调用了sleep和study方法 new Person().sleep(); new Person().study(); //以下是同一个对象调用了sleep又调用了study方法 Person p = new Person(); p.study(); p.sleep();
使用场景:
① 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象
new 类名().sleep();
② 将匿名对象作为实参传递给一个方法调用
方法名(new 类名());
四、属性
4.1 成员变量(属性)
在方法体外,类体内声明的变量称为成员变量
4.2 局部变量
在方法上或方法体内部声明的变量称为局部变量
4.3 成员变量和局部变量的区别
成员变量 | 局部变量 | |
---|---|---|
声明位置 | 直接声明在类中方法外 | 方法形参或内部、代码块内、构造器内等 |
修饰符 | private、public、static、final等 | 不能用权限修饰符修饰,可以用final修饰 |
初始化值 | 有默认初始化值 | 没有默认初始化值,必须先赋值,方可使用 |
内存加载位置 | 堆内存空间 或 方法区内存空间静态域内 | 栈内存空间 |
生命周期 | 随着类的加载或对象的存在而存在,随类的销毁或对象的销毁而销毁 | 局部变量是随着方法的调用而存在,方法的调用完毕而消失 |
使用范围 | 在整个类中都可以使用 | 只能在当前代码块的范围使用 |
注:
static关键字修饰的内容随着类的加载而加载,如果定义了一个static修饰的变量会在类加载的时候就已经存在。static后面详细讲解
五、this关键字
5.1 什么是this
this表示当前对象引用,类中的成员被哪个对象调用,this就代表调用的这个对象。
5.2 this关键字应用
1.解决局部变量隐藏成员变量时的问题 当成员变量和局部变量同名时,就近原则优先使用局部变量。如果要明确调用的是成员变量,就在变量前面加上this即可。this.变量名。
class Student{ int age = 10; public void show(){ int age = 20; System.out.println("局部变量age的值:"+age); System.out.println("成员变量age的值:"+this.age); } }
2.调用本类中的其他构造方法 构造方法部分讲解(后面讲解)
六、封装
6.1 什么是封装
封装的原则:类中不想对外展示的属性和行为,将其隐藏起来,额外提供公共的访问方式。
6.2 为什么要封装
6.2.1 保证安全性
使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。封装防止了外部随意访问,增加了安全屏障。
6.2.2 隐藏复杂性
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的来说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装的设计思想。
6.3 信息的封装和隐藏
Java中通过将数据声明为私有的(private),再提供公共的(public)方法,getXxx()和setXxx()实现对该属性的操作
6.3.1 private关键字
什么是权限修饰符
权限修饰符可以修饰类、类中成员的权限做特定的限制,当被访问时必须满足特定的要求。
private关键字介绍
private是java中最小的权限修饰符,与public、默认、protected同类。 可以修饰类中的成员(成员变量、成员方法、构造方法、内部类)等。 被private关键字修饰的成员限定只能在本类中访问。
private关键字应用 修饰成员变量
格式:private 数据类型 变量名; 例:private int age;
修饰成员方法
格式:private 返回值类型 方法名(){} 例:private void show(){}
6.4 封装实现
封装:private关键字修饰隐藏修饰要隐藏的属性和方法。 访问: 成员变量:公共setXxx(参数列表)方法为成员变量赋值,公共getXxx()方法返回成员变量的值。 成员方法:公共方法中访问
封装成员变量:
class Student { public String name; // name定义为private,只能被Student类内部访问 private int age;// age定义为private,只能被Student类内部访问 // 提供getAge方法获取age的值 public int getAge() { return age; } // 提供setAge方法给age赋值 public void setAge(int age) { //可以在这里做一些判断,判断权限、判断数据合法性等 if(age <= 0 || age > 120){ System.out.println("您输入的数据不合法!"); return; } this.age = age; } }
封装成员方法
class Student { public String name; // name定义为private,只能被Student类内部访问 private int age;// age定义为private,只能被Student类内部访问 // 提供getAge方法获取age的值 public int getAge() { return age; } // 提供setAge方法给age赋值 public void setAge(int age) { //可以在这里做一些判断,判断权限、判断数据合法性等 if(age <= 0 || age > 120){ System.out.println("您输入的数据不合法!"); return; } this.age = age; } //以下是对成员方法进行封装 private void method(){ System.out.println("我是私有方法"); } public void method1(){ method();//调用私有方法 } }
测试
public class PersonTest { public static void main(String[] args) { Student student = new Student(); //错误姿势 student.age = 18;//报错,编译不通过 student.method();//报错,编译不通过 //正确姿势 student.setAge(18);//正确姿势设置变量值 int age = student.getAge();//获取变量值 System.out.println(age); student.method1();//访问method1方法,由方法内部调用method } }
七 方法的参数传递
7.1 参数列表-基本类型
将实参基本数据类型变量的”数据值“传递给形参
举例:
public static void main(String[] args) { int a = 10; System.out.println("修改之前的值为:" + a); // 10 change(a); System.out.println("修改之后的值为:" + a); // 10 } public static void change(int a) { System.out.println("a修改前的值为:" + a); // 10 a = 3; System.out.println("a修改后的值为:" + a); // 3 }
7.2 参数列表-引用类型
将实参基本数据类型变量的”地址值“传递给形参
举例:
public static void main(String[] args) { Person p = new Person(); p.name = "Tom"; System.out.println("修改之前的name值为:" + p.name); // Tom change(p); System.out.println("修改之后的name值为:" + p.name); // Jim } public static void change(Person p) { System.out.println("修改之前的name值为:" + p.name); // Tom p.name = 'Jim'; System.out.println("修改之后的name值为:" + p.name); // Jim }
学习时间:
- 同学们合理安排空余时间
学习产出:
例如:
- 抓重点,记好笔记.
- 跟着案例一起敲代码
- 完成每个章节的作业