一. 面向对象的思想
- 定义
- 面向对象区别于面向过程而存在的, 在早期的编程语言中, 我们是先固定功能,然后根据功能来编写代码, 每一个功能对应一段代码. 这段代码只能完成本功能
- 这样做的方式及其繁琐, 代码量太大, 而且检查代码会发给巨额的时间, 为了提高效率, 人们将一些可以重复使用的代码提取出来, 封装成一个方法, 这样就达到 了重复使用的目的
- 再后来, 我们将一些性质相近的方法放到一起, 就出现了一个类. 我们将可以完成一系列功能的类称之为对象
- 所谓的对象, 就是具有一定功能的独立个体
- 不再局限于完成固定功能, 不在局限于代码的实现, 以创造具备某些功能的个 体, 让这些个体去完成我们的指令为编程方式, 这就是面向对象的思想
- 说明
- 早期的编程语言更像是程序员自己去执行命令, 比如说扫地, 我需要先拿到扫把,然后从一个地方开始, 挥舞扫把, 到一个地方结束, 然后回头,重复扫地动作,直到结束,然后将扫把放回原处. 每次扫地都需要重复这样的步骤
- 面向对象的变成语言更像是创造一个仆人, 你只需要告诉仆人, 将那个地方打扫 干净,仆人就会自己去做这件事.中间的步骤我只要设定一次就行. 这样的结果就是, 程序员得到了解放
- 特点
- 更符合人类的思想习惯
- 将复杂的事情简单化
- 将我们从执行者变成了指挥者
- 开发过程和设计
- 就是不断的创造对象, 使用对象,指挥对象去做事情
- 面向对象编程的设计其实就是在管理和维护对象之间的关系
- 面向对象的特点
- 封装 : 分类整理 和 保护
- 继承
- 多态
- 抽象
二. 类的使用
-
定义
- 我们学习编程的目的就是为了将生活中的事和物用程序语言描述出来
-
如何描述
- 生活中的描述
- 属性 就是该实物的信息(事物身上的名词)
- 行为 就是该事物能够做什么(事物身上的动词)
- java中的描述
- 成员变量 就是事物的属性
- 成员方法 就是事物的行为
- 我们描述的是一类事物
- 生活中的描述
-
如何用java定义
- 成员变量 等同于局部变量 , 只是位置发生了变化 , 在类中, 方法外
- 成员方法 等同于以前定义的方法 , static 暂时不要了
-
演示
-
定义学生类
- 学生有学号, 姓名, 年龄, 班级 , 成绩
- 学生会吃饭, 睡觉, 学习
public class Student { //定义学号 String num = "H001"; //定义姓名 String name = "小明"; //定义年龄 int age = 18; //定义班级 String calssnum = "1710"; //定义成绩 int score = 100; //定义吃饭方法 public void eat(){ System.out.println("吃饭"); } //定义睡觉方法 public void sleep(){ System.out.println("睡觉"); } //定义学习方法 public void study(){ System.out.println("学java"); } }
-
-
测试题
- 定义手机类
- 手机有品牌, 型号属性
- 手机有上网, 打电话的功能
- 定义老师类
- 老师有 姓名, 年龄, 颜值属性
- 老师有 教学,审批作业的功能
- 定义手机类
-
注意事项
-
类的作用是用来封装变量和方法
-
类是死物, 不能直接使用, 类似于图纸
-
三. 对象
-
定义
- 在java中, 我们想要使用定义的类来做工作, 就必须先将这个类激活
- 激活之后的类叫做对象, 一个类可以有多个对应的对象,就像是拿图纸造出实物
-
格式
- 通过new关键字来创建对象
- 类名 对象名 = new 类名();
- Student student = new Student();
-
对象中成员的调用
- 通过对象名来调用
- 对象名.变量名
- 对象名.方法名();
-
演示
public static void main(String[] args) { Student student = new Student(); //调用对象的属性 String name = student.name; System.out.println(name); //调用对象的方法 student.eat(); student.sleep(); student.study(); }
-
对象中属性值
- 定义类的时候, 如果类中的属性有值, 创建的对象中的属性也会是这个值
- 定义类的时候, 如果类中的属性没有具体指, 创建的对象中的属性会有一个默认值
- 一般来说, 类描述的应该是一类事物, 而不应该简简单单是一个具体的事物
-
对象属性赋值
-
我可以对对象中属性的值作出更改
-
对象名.属性名 = 值;
public static void main(String[] args) { //一个对象名引用一个实例对象 Student student = new Student(); //打印结果是小明 System.out.println(student.name); //给对象赋值 student.name = "小刚"; //打印结果是小刚 System.out.println(student.name); }
-
-
测试题
- 定义汽车类的属性 品牌 , 颜色 , 长度
- 定义汽车类的方法, 点火, 开动
- 创建不同品牌的汽车实例, 并调用方法
-
测试题
- 定义人类的属性, 姓名, 年龄, 性别
- 定义人类的方法, 工作, 睡觉, 自我介绍
- 创建不同的人的实例对象, 并调用方法,打印属性数据
四. 对象和类的内存
-
存储位置
- 类存储于内存中的方法区内, 只有一份
- new出来的对象存储于内存中的堆内存中, 同一个类的对象可以有多个
-
使用问题
- 类无法直接使用, 是一个骨架,图纸
- 对象可以使用其中的成员, 是活的, 具体实物
-
引用问题
- 一个对象名引用一个实例对象
- 多个对象名引用不同的实例对象
- 多个对象名引用相同的实例对象
public static void main(String[] args) { //一个对象名引用一个实例对象 Student student = new Student(); //多个对象名引用不同的实例对象 Student student2 = new Student(); //比较两个对象表示的地址值 System.out.println(student==student2); //多个对项名引用相同的实例对象 Student student3 = student; System.out.println(student==student3); }
五. 成员变量和局部变量
-
定义
- 成员变量属于类或对象, 使用对象名可以直接掉用
- 局部变量属于方法, 对象无法直接调用, 只能在运行方法的时候运行
-
区别
-
在类中的位置不同
- 成员变量:在类中方法外
- 局部变量:定义在方法中或者方法声明上
public class Student { String name ; public void method(){ //方法内的局部变量 String name ; } //方法声明上的局部变量 public void method(String name){ } }
-
在内存中的位置不同
- 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
- 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
-
生命周期不同 (诞生 - 活着 - 消亡)
- 成员变量 : 随着对象的创建而存在 , 随着对象的消亡而消亡
- 局部变量 : 随着方法的调用而存在 , 随着方法的结束而消亡
-
初始化值不同
- 成员变量 : 有默认值, 是在对象创建的过程中jvm设置的默认值
- 局部变量 : 没有默认值, 必须在使用之前赋值
public class Student { //可以不赋值, 创建对象的时候会有一个默认值 String name ; public void method(){ //使用前必须赋值 String name ; //这里会报错 //System.out.println(name); } //在调用方法执行之前必须给参数赋值,不然会报错 public void method(String name){ } }
-
-
注意事项
- 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
- 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
- 引用数据类型变量包括哪些:数组,类,接口,枚举,注解
-
测试题
- 判断结果
public class Student { String name = "小明"; } public class TestDemo{ public static void main(String[] args) { Student student = new Student(); System.out.println(student.name);//判断结果 student.name = "张三"; Student student2 = new Student(); System.out.println(student2.name); //判断结果 } }
- 判断结果
public class Student { String name = "小明"; public void method(){ String name = "张三"; System.out.println(name); } public void method(int age){ System.out.println(name); } } public static void main(String[] args) { Student student = new Student(); student.method(); //判断结果 student.method(15); //判断结果 }
六. 匿名对象
-
定义
- 没有名字的对象
-
应用场景
- 当前方法内, 对象只使用一次的情况
-
演示
- 司机开车
public class Car { public void fire(){ System.out.println("车子启动了"); } public void run(){ System.out.println("车子飞驰而去"); } } public class Driver { public void drive(Car car){ //调用汽车的点火和开动方法 car.fire(); car.run(); } } public static void main(String[] args) { Driver driver = new Driver(); //调用司机的开车方法 driver.drive(new Car()); }
七. private 关键字
-
定义
- 一个权限修饰符
- 可以修饰成员变量和成员方法
- 被其修饰的成员只能在本类中使用
-
作用
- 限定使用范围, 禁止别人调用类的成员
- 保证数据的安全性, 可以通过方法中的代码对有害数据进行过滤
-
演示
- 对年龄的有害信息进行过滤
public class Person { private int age; public void setAge(int age2){ //符合规则的信息才去赋值 if (age2 > 0 && age2 < 150) { age = age2; }else{ System.out.println("年龄信息不对"); } } //获取年龄信息 public int getAge(){ return age; } }
-
JavaBean POJO
- 类中的属性全部私有化
- 通过getter 和 setter方法进行设置
- 提供toString方法用来描述对象
- javabean的主要作用是运送数据
public class Person { private String name; private int age; //name的getter方法 public String getName() { return name; } //name的setter方法 public void setName(String name) { this.name = name; } //age的getter方法 public int getAge() { return age; } //age的setter方法 public void setAge(int age) { this.age = age; } public String toString(){ return name +","+ age; } }
-
测试题
-
判断结果
public class Person { private String name = "小明"; public void method(){ System.out.println(name);//判断是或否成立 } } public static void main(String[] args) { Person person = new Person(); person.method(); }
-
判断结果
public class Person { private String name = "小明"; private void method(){ System.out.println(name); } } public static void main(String[] args) { Person person = new Person(); person.method(); }
-
八. this关键字
-
定义
- 代表本类对象的引用
- 用来区分重名的成员变量和局部变量
-
注意事项
- 只能在本类方法中使用
- 本类的静态方法中无法使用
- 当我们创建对象并调用对象的方法时, 方法中如果出现了this,指的调用这个方法的对象
- 本类对象中的方法调用本类中的其他方法时, 其实被调用方法的前面就有一个省略的this
-
演示
public class Person { private String name = "小明"; public void method(){ String name = "李四"; System.out.println(name); System.out.println(this.name); //这里就有一个省略的this method2();//this.method2(); } public void method2(){ System.out.println("方法2"); } } public static void main(String[] args) { Person person = new Person(); person.method(); }
总结
-
定义类
类的作用 : 对变量和方法进行封装
单独封装方法
单独封装变量
封装方法和变量
-
对象
类是一个模板, 不能直接使用, 需要创建对象
类名 对象名 = new 类名();
-
使用对象
对象名.成员变量
对象名.方法()
-
面向对象
我们java开发人员每天都在跟对象打交道, 所以我们称之为 面向对象编程
-
成员变量和局部变量
书写的位置不同 成员变量在类中方法外, 局部变量在方法内
内存中的位置不同 : 成员变量在堆, 局部变量在栈
生命周期不同 : 成员变量随着对象走, 局部变量随着方法走(方法进栈了才有意义)
初始化值不同 : 成员变量有默认值, 局部变量没有, 必须手动赋值
-
匿名对象
当一个对象在当前方法内只使用一次, 那么我们可以直接使用, 不用定义对象名
优点 : 少写代码
缺点 : 对象只能使用一次
-
private关键字
私有化 ,保护成员
JavaBean : 但一个类只被用于存储运输数据, 没有任何功能性方法 ,
一般来说, 我们需要对所有成员变量私有化, 提供getter和setter方法,提供toString方法
这样类的创建的对象, 我们称之为 JavaBean
-
this
用于区分成员变量和局部变量
作业
- 第一题
- 使用编程语言描述小狗,并调用方法打印属性
- 属性 : 品种 , 性别 , 年龄
- 方法 : 吃饭, 看门 , toString()
- 使用编程语言描述小狗,并调用方法打印属性
- 第二题
- 使用编程语言描述桌子, 并调用方法
- 属性 : 材质, 高度 , 形状
- 方法 : 存放物品 , toString()
- 使用编程语言描述桌子, 并调用方法
- 第三题
- 创建一个动物类
- 属性 : 物种, 年龄, 性别
- 方法 : 吃饭, 睡觉
- 创建小猫和小狗两个对象, 分别调用其方法
- 创建一个动物类
- 第四题
- 创建一个人类
- 属性 : 姓名, 年龄, 性别
- 方法 : 睡觉, 工作 , 自我介绍
- 定义不同的方法内容, 并调用
- 创建一个人类
- 扩展题
- 学校有教学功能, 但是需要先聘请老师来授课, 现在一个学校有java , h5两门课程, 编程模拟
- 扩展题
- 创建一个学生的javabean, 从键盘接受数据存储到学生对象中,打印学生对象信息