9-01面向对象和面向过程的思想
1.面向过程与面向对象都是我们编程中,编写程序的一种思维方式
2.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。
3.面向对象的程序设计方式,是遇到一件事时,思考“我该让谁来做”,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。
9-02面向对象好处
1.面向对象思维方式是一种更符合人们思考习惯的思想
2.面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多的体现是指挥者(指挥对象做事情)。
3.面向对象思维方式将复杂的问题简单化。
9-03大象装进冰箱的代码案例
需求:把大象装冰箱里
1.面向过程
*自己打开冰箱门
* 自己将大象装进去
* 自己关闭冰箱门
2.面向对象
* 分析发现打开、装、关闭都是冰箱的功能。即冰箱对象具 备如下功能
* 冰箱打开
* 冰箱存储
* 冰箱关闭
9-04小汽车类
1.小汽车的属性: 颜色、轮胎个数
2.小汽车的功能:运行
3.定义代码:
public class Car {
String color;
int number;
void run() {
System.out.println(color + ":" + number);
}
}
4.测试代码
public class CarDemo {
public static void main(String[] args) {
/*
测试:Car类中的run方法。
*/
// 1,创建Car的对象。给对象起个名字。
Car c = new Car();// c是类类型的变量。c指向了一个具体的Car类型的对象。
// 2,通过已有的对象调用该对象的功能。格式:对象.对象成员;
// 3,可以该对象的属性赋值。
c.color = "red";
c.number = 4;
c.run();
}
}
9-05对象的内存图
9-06类和对象的关系
1.类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体
9-07成员变量和局部变量的区别
-
定义位置上的区别
成员变量,定义在类中,方法外
局部变量,方法内,语句内 -
作用域不同
成员变量,作用范围是整个类
局部变量,方法内,语句内 -
默认值不同
成员变量,有自己的默认值
局部变量,没有默认值,不赋值不能使用 -
内存位置不同
成员变量,跟随对象进入堆内存存储
局部变量,跟随自己的方法,进入栈内存 -
生命周期不同
成员变量,跟随对象,在堆中存储,内存等待JVM清理 , 生命相对较长
局部变量,跟随方法,方法出栈 生命相对较短
9-08方法参数是基本数据类型和引用数据类型
对于基本类型形式参数改变不会影响到实际参数
对于引用类型形式参数改变会影响到实际参数
9-10 封装的概述
1.面向对象三大特征:封装、继承、多态
2.封装表现
* 方法就是一个最基本封装体
* 类其实也是一个封装体
3.封装的好处
* 提高了代码的复用性
* 隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念
* 提高了安全性
4. 举例
一台电脑,它是由CPU、主板、显卡、内存、硬盘、电源等部件组长,其实我们将这些部件组装在一起就可以使用电脑了,但是发现这些部件都散落在外面,很容造成不安全因素,于是,使用机箱壳子把这些部件都装在里面(隐藏了实现细节),并在机箱壳上留下一些插口等(对外提供可以访问的方式)。
9-11 private关键字
- private可以修饰成员内容包括成员方法和成员变量,被private修饰的内容不能在其他类访问
- 举例
private int age;
private String name;
9-12 get和set方法
- 一般对成员属性的访问动作:赋值(设置 set),取值(获取 get),因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法
- 代码举例
package cn.itcast.demo05;
/*
* 类描述人:
* 属性: 姓名和年龄
* 方法: 说话
*
* 私有化所有的属性 (成员变量) ,必须写对应的get/set方法
* 凡是自定义的类,自定义成员变量,应该私有化,提供get/set
*
* this关键字:
* 区分成员变量和局部变量同名情况
* 方法中,方位成员变量,写this.
*/
public class Person {
private String name;
private int age;
// set方法,变量name,age赋值
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
// get方法,变量name,age获取值
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void speak() {
String name = "哈哈";
int age = 16;
System.out.println("人在说话 " + this.name + "..." + this.age);
}
}
- 类中不需要对外提供的内容都私有化,包括属性和方法。
9-13 this关键字
1.当类中存在成员变量和局部变量同名的时候为了区分,就需要使用this关键字
2.this关键字表示成员变量
3.一般遇到相同变量采取就近原则
9-14this内存图
9-15 this的年龄比较
- 需求:在Person类中定义功能,判断两个人是否是同龄人
9-16随机点名器案例重构
1.需求:随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息
它具备以下3个内容:
存储所有同学姓名
总览全班同学姓名
随机点名其中一人,打印到控制台
2.代码
package cn.itcast.demo07;
/*
* 学生类:
* 属性: 姓名,年龄
*/
public class Student {
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
package cn.itcast.demo07;
import java.util.ArrayList;
import java.util.Random;
/*
* 随机点名器案例
* 1. 创建集合,将Student对象存储到集合中
* 2. 总览所有学生的信息
* 将存储到集合中的Student对象遍历出来
* 3. 随机学生
* 随机数,作为索引,到集合中去查找元素
*/
public class CallName {
public static void main(String[] args) {
//定义集合ArrayList,存储Student类型
ArrayList<Student> array = new ArrayList<Student>();
addStudent(array);
printStudent(array);
randomStudent(array);
}
/*
* 随机数生成学生信息
*/
public static void randomStudent(ArrayList<Student> array){
Random r = new Random();
int index = r.nextInt(array.size());
Student s = array.get(index);
System.out.println(s.getName());
}
/*
* 定义方法,总览学生信息
* 遍历集合
*/
public static void printStudent(ArrayList<Student> array){
for(int i = 0 ; i < array.size();i++){
Student s = array.get(i);
System.out.println(s.getName()+"..."+s.getAge());
}
}
/*
* 定义方法,存储Student对象,到集合中
*/
public static void addStudent(ArrayList<Student> array){
Student s1 = new Student();
s1.setName("lisi1");
s1.setAge(151);
Student s2 = new Student();
s2.setName("lisi2");
s2.setAge(152);
Student s3 = new Student();
s3.setName("lisi3");
s3.setAge(153);
Student s4 = new Student();
s4.setName("lisi4");
s4.setAge(154);
Student s5 = new Student();
s5.setName("lisi5");
s5.setAge(155);
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
array.add(s5);
}
}