面向对象概念

在学习面向对象之前,我们可以先了解一下面向过程。
面向过程是一种编程思想,它强调的是过程,意思是我们做任何事,都需要亲力亲为。
面向对象也是一种编程思想,相对于面向过程,我们的身份可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化。

面向过程强调的是过程,比如,把大象装冰箱,一共分3步:
第1步:打开冰箱门
第2步:把大象放进去
第3步:关上冰箱门
而面向对象强调的是结果,比如:
谁负责把大象装进去?
有没有发现,如果是面向对象的话,干这件事的主体并不是你自己,你变成了一个指挥者?

再比如,衣服脏了,我们可以让女盆友帮忙洗,不需要关注中间过程是怎么洗的,就可以拿到干净的衣服,当然,这首先需要有一个对象(加油哦)~

还有,当我们想吃一道菜,其实并不需考虑这道菜是怎么做的,怎么送达的,只需点菜即可.传菜和做菜都有具体的对象来完成具体的功能.我们不需要关注实现的过程,只需要关注结果就好。

这就是我们所说的面向对象的编程思想(OOP,Object Oriented Programming)

如果面试官问什么是面向对象?你答万物皆对象!额,不建议这样做哈,因为我们还没到大佬的这个高度,还是最好举例。
就像是你说 : 空即是色 色即是空…信你个鬼鬼

2 面向对象的三大特征

  1. 封装: 把相关的数据封装成一个“类”组件
  2. 继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
  3. 多态: 增强软件的灵活性和重用性

3 类和对象

3.1 类

  1. Java语言最基本单位就是类,相当于类型。
  2. 类是一类事物抽取共同属性与功能形成的。
  3. 可以理解为模板或者设计图纸。
    注意:类在现实世界并不存在,它只是一种对象的数据类型

3.2 对象

每个对象具有三个特点:对象的属性,对象的功能和对象的标识。

  1. 对象的属性用来描述对象的基本特征。
  2. 对象的功能用来描述对象的可以完成的操作。
  3. 对象的标识是指每个对象在内存中都有一个唯一的地址值用于与其他对象进行区分,类似于我们的身份证号。

3.3 类和对象的关系

  1. 我们先创建类,再通过类创建出对象
  2. 我们可以通过一个类创建出多个对象
  3. 类是抽象的,对象是具体的

3.4 练习:类的创建使用

在编写代码之前,我们需要分析下需求:
比如我们要把手机这一类事物抽象成代码:
那么这个事物的类型就是"手机",可以用类来描述.
类中包含的就是手机抽取出来的共性的属性与功能.

手机的属性:颜色,尺寸,品牌,价格
手机的功能功能:打电话,发短信,听音乐

我们通过class关键字创建类,通过new关键字创建对象。
接下来我们开始编码吧!
创建包: cn.tedu.oop
创建类: TestCreateClass.java

package cn.tedu.oop;
/**本类用作面向对象入门案例* 设计手机这一类事物:* 分析属性:品牌 价格 尺寸 颜色* 分析功能:打电话 发短信 看直播*/
/**在一个java文件中可以写多个class`,但是,被public修饰的class只能有一个* 而且要求这个公共类的名字必须与文件的名字保持一致*/
public class TestCreateClass {public static void main(String[] args) {//help-findAction 或者 Alt+7//4.创建手机类的对象p1Phone p1 = new Phone();//5.通过手机类对象调用手机类的功能p1.call();p1.message();p1.video();//6.通过手机类对象打印查看属性值System.out.println(p1.color);//nullSystem.out.println(p1.price);//0.0System.out.println(p1.size);//0.0System.out.println(p1.brand);//null}
}//1.通过class关键字创建手机类--用来描述手机这一类事物--属性+功能
class Phone{//2.定义手机类的属性--用成员变量来描述--位置:类里方法外String brand;//品牌double price;//价格double size;//尺寸String color;//颜色//3.定义手机类的功能--用方法来描述--格式:修饰符 返回值类型 方法名(参数列表){方法体}public void call(){System.out.println("正在打电话~");}public void message(){System.out.println("正在发短信!");}public void video(){System.out.println("正在看直播~");}
}

3.5 对象在内存中的存储

Java把内存分成5大区域,我们重点关注栈和堆。

  1. 一般来讲局部变量存在栈中,方法执行完毕内存就被释放
  2. 对象(new出来的东西)存在堆中,对象不再被使用时,内存才会被释放
  3. 每个堆内存的元素都有地址值
  4. 对象中的属性都是成员变量,是有默认值的
    TIPS: 栈与队列指的是一种数据的结构。
    栈:先进后出(FILO – First In Last Out)
    队列:先进先出(FIFO – First In First Out)

对象的创建过程分析:

Phone p = new Phone(); 这句代码,再内存中会发生什么呢?
1.在栈内存中开辟一块空间,存放引用类型Phone类型的变量p
2.在堆内存中开辟一块空间,存放Phone类型的对象
3.要给这个对象进行初始化,比如:String brand = null;
4.当对象准备好以后,会生成一个唯一的地址值,然后将此地址值交给引用类型的变量p来保存
5.如果以后想要操作此对象的各种资源,可以通过p变量保存的地址值找到该对象,比如:p.call(); p.price = 66.6;

3.6 练习2:创建多个对象

package cn.tedu.oop;
/**本类用作面向对象入门案例* 设计手机这一类事物:* 分析属性:品牌 价格 尺寸 颜色* 分析功能:打电话 发短信 看直播*/
/**在一个java文件中可以写多个class`,但是,被public修饰的class只能有一个* 而且要求这个公共类的名字必须与文件的名字保持一致*/
public class TestCreateClass {public static void main(String[] args) {//help-findAction 或者 Alt+7//4.创建手机类的对象p1Phone p1 = new Phone();//5.通过手机类对象调用手机类的功能p1.call();p1.message();p1.video();//6.通过手机类对象打印查看属性值System.out.println(p1.color);//nullSystem.out.println(p1.price);//0.0System.out.println(p1.size);//0.0System.out.println(p1.brand);//null//7.创建手机类的第2个对象p2Phone p2 = new Phone();//8.通过p2对象,调用Phone类的3个方法p2.call();p2.message();p2.video();//9.给p2对象的4个属性赋值p2.brand = "HUAWEI";p2.color = "中国红";p2.price = 6666.66;p2.size = 5.6;//10.打印查看p2对象的4个属性值System.out.println(p2.brand);System.out.println(p2.price);System.out.println(p2.color);System.out.println(p2.size);//11.查看两个对象的地址值System.out.println(p1);//cn.tedu.oop.Phone@1b6d3586System.out.println(p2);//cn.tedu.oop.Phone@4554617c}
}//1.通过class关键字创建手机类--用来描述手机这一类事物--属性+功能
class Phone{//2.定义手机类的属性--用成员变量来描述--位置:类里方法外String brand;//品牌double price;//价格double size;//尺寸String color;//颜色//3.定义手机类的功能--用方法来描述--格式:修饰符 返回值类型 方法名(参数列表){方法体}public void call(){System.out.println("正在打电话~");}public void message(){System.out.println("正在发短信!");}public void video(){System.out.println("正在看直播~");}
}


p2.brand = “HUAWEI”;
就是先到栈内存中找到p2中保存的唯一的地址值
然后根据地址值找到对应的Phone对象,并对其对应的属性值进行修改
p2.eat();
也是先到栈内存中找到p2中保存的唯一的地址值
然后根据地址值找到对应Phone对象,执行Phone对象的eat()方法

4 封装

4.1 概述

封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
好处:

  1. 提高安全性
  2. 提高重用性

4.2 private关键字

是一个权限修饰符 ,可以用来修饰成员变量和成员方法.被私有化的成员只能在本类中访问

4.3.1练习:封装的必要性

创建包: cn.tedu.oop
创建类: TestPrivate1.java

package cn.tedu.oop;
/*本类用于测试封装的必要性*/
public class TestPrivate1 {public static void main(String[] args) {//3.创建用户类的对象User u = new User();//4.修改对象的属性值u.name = "李逵";/*需要封装属性,如果不封装的话,就可以直接修改属性的值,不安全*///u.money = 999999999;//5.查看修改后的属性值System.out.println(u.name);//System.out.println(u.money);//6.4调用两个方法修改和查看属性值u.setMoney(8888888.88);System.out.println(u.queryMoney());}
}//1.创建一个用户类User
class User{//2.定义用户类的属性String name;//6.1封装属性--通过private关键字封装属性private double money = 10000;//6.2提供方法1:查询当前账户的余额public double queryMoney(){/*后续可以添加权限校验的操作*/return money;}//6.3提供方法2:修改当前账户的余额public void setMoney(double money){/*后续可以添加权限校验的操作*//*当本类的成员变量与局部变量同名时可以使用this关键字指定本类的成员变量*/this.money = money;}
}

4.3.2 练习:封装学生案例

创建包: cn.tedu.oop
创建类: TestPrivate2.java

package cn.tedu.oop;/*本类用于练习OOP的第一大特性:封装*/
public class TestPrivate2 {public static void main(String[] args) {//4.创建学生类对象sStudent s = new Student();//5.通过对象修改并查看属性值s.sno = 1;//s.name = "黄飞鸿";//s.subject = "Java培优";System.out.println(s.sno);//System.out.println(s.name);//System.out.println(s.subject);//6.通过对象调用方法s.study();s.eat();s.sleep();//7.3使用刚刚生成的set()设置值方法与get()获取值方法s.setName("十三姨");s.setSubject("美容美发");System.out.println(s.getName());System.out.println(s.getSubject());}
}//1.定义类描述学生这一类型Student
class Student {//2.特征:学号sno 姓名name 科目subject//7.1 封装属性--用private修饰属性int sno;private String name;private String subject;//7.2提供被封装属性的get与set方法//右键->Generate->Getter and Setter->Shift选择属性->OKpublic String getName() {return name;}public void setName(String name) {this.name = name;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}//3.定义学生的功能:学习 吃饭 睡觉public void study() {System.out.println("正在学习中...");}public void eat() {System.out.println("吃饭ing...");}public void sleep() {System.out.println("我一点也不想睡觉,就想学Java!");}
}

4.3.3 练习:封装方法测试

创建包: cn.tedu.oop
创建类: TestPrivate3.java

package cn.tedu.oop;
/*本类用于测试方法的封装*/
public class TestPrivate3 {public static void main(String[] args) {//4.创建对象测试Apple a = new Apple();//5.没有封装方法时,调用没有限制//a.eat();//封装eat(),此处调用报错a.clean();}
}
//1.创建苹果类
class Apple{//2.定义方法1public void clean(){System.out.println("苹果还是要洗洗的~");//6.在已有的公共方法clean()中调用被封装eat()方法的功能eat();}//3.定义方法2private void eat(){System.out.println("要吃苹果啦~");}
}

TIPS:如何封装?封装后的资源如何访问?
我们可以使用private关键字来封装成员变量与方法
如何访问私有资源?
关于成员变量:
setXxx – 对外提供公共的设置值方式
getXxx – 对外提供公共的获取值方式
关于成员方法:
把私有方法放在公共方法里供外界调用即可

5 拓展:OOP综合练习

创建包:cn.tedu.oop
创建类:TestCar

package cn.tedu.oop;
/*本类用于面向对象的巩固练习*/
public class TestCar {//创建程序的入口函数main()public static void main(String[] args) {//3.创建汽车类对象cCar c = new Car();//4.通过汽车类对象c设置属性值
//        c.color = "暗夜紫";
//        c.brand = "BMW";
//        c.price = 200;
//        c.length = 0.2;//5.查看刚刚设置好的属性值
//        System.out.println(c.brand);
//        System.out.println(c.price);
//        System.out.println(c.color);
//        System.out.println(c.length);//6.通过c对象调用汽车类的方法c.start();//c.stop();//7.3调用提供的set与get方法,设置并获取对应属性的值c.setBrand("特斯拉");c.setColor("black");c.setPrice(200.02);c.setLength(3);System.out.println(c.getBrand());System.out.println(c.getColor());System.out.println(c.getLength());System.out.println(c.getPrice());//8.3 调用公共方法来实现私有方法功能的使用c.start();}
}
//1.抽象汽车这一类事物的属性与行为,封装成一个类组件
class Car{//2.属性--用成员变量来描述//7.1封装所有的属性值--使用private修饰private String color;private String brand;private double price;private double length;//7.2 生成所有属性的get与set方法/*右键空白处->Generate->Getter and Setter->按住Shift全选所有属性生成即可*/public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public double getLength() {return length;}public void setLength(double length) {this.length = length;}//3.行为--用方法来描述//8.2 可以在本类公共的方法里,调用私有方法public void start(){System.out.println("汽车开动了~");stop();//我们通过方法名+参数列表确定要调用哪个方法}//8.1封装方法,通过private修饰符private void stop(){System.out.println("汽车停止了~");}
}

6 访问控制符

用来控制一个类,或者类中的成员的访问范围。

TIPS:default是表示不写修饰符,默认,如果写default单词来修饰会报错

拓展7 匿名对象

没有名字的对象,是对象的简化表示形式。
使用场景:
当被调用的对象只调用一次时(多次会创建多个对象浪费内存)
Demo d = new Demo();
d.sleep();
d.game();
//这个d就是对象的名字。
也可以写成:
new Demo().show();//创建了一个对象调方法
new Demo().game();//又创建了一个对象调方法

JAVA 面向对象 类 对象 封装相关推荐

  1. Java大数据学习第六天------面向对象 类 对象 封装

    面向过程: ​ 强调的是过程, 面向对象: ​ 强调的是结果,只需要关注结果就好. 面向对象的三大特征: 封装: 把相关的数据封装成一个"类"组件 继承: 是子类自动共享父类属性和 ...

  2. 面向对象(类/对象/封装/继承/static/内存类加载)

    >面向对象:万物皆对象: >类和对象: 从代码的角度来说:类是代码的载体. 从逻辑角度来说:类是静态文件:对象是内存中的地址: 形象的来说,类就是一个模具,是用来生产对象的:对象是基于类产 ...

  3. java面向对象-类和对象

    Java面向对象笔记 文章目录 Java面向对象笔记 java面向对象 类和对象 什么是类 定义 创建和使用 公式 构造方法 什么是构造方 怎么定义和使用构造方法 实列 This关键字 什么是成员变量 ...

  4. java面向对象-------类属性和方法,不同类之间调用

    package java面向对象; /** * 类的创建 */public class Stu { //l类属性 int age; int id; String name; Computer comp ...

  5. Java 面向对象与对象的创建过程及变量

    Java 面向对象与对象的创建过程及变量: 1.面向对象和面向过程的思想对比 : ​ 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 ​ 面向对象 :是一种以对象为中心的编 ...

  6. C++ 面向对象(类对象)

    C++ 面向对象(类&对象) 转载于:https://www.cnblogs.com/guozepingboke/p/10823025.html

  7. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  8. 面向对象 详解笔记 方法 类 对象 封装 继承 重写 多态 接口

    文章目录 面向过程&面向对象 面向过程 面向对象 什么是面向对象 回顾方法及加深 方法的定义 修饰符 返回类型 break:跳出switch,结束循环和return的区别 方法名:注意规范就o ...

  9. 7.0_[Java 面向对象]-类和对象

    ################################################## 目录 面向对象扫盲 万物皆对象 分类思想 对象的属性与方法/实例的特征和行为 如何在 Java 中 ...

最新文章

  1. 编码(人类与机器间的语言)中
  2. Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处
  3. 建立Windows Embedded Compact 7开发环境
  4. matlab cuda的.cu文件应该放在那里_无人机基于Matlab/Simulink的模型开发(连载一)
  5. 【Vue 3.0 新特性(四)】Vue 3.0 响应式系统原理
  6. HTTP Status Code(Http状态码)
  7. Git初始化本地已有项目并上传到远端仓库
  8. 降采样_嫦娥五号探测器圆满完成我国首次月球采样返回任务
  9. linux篡改url命令,在Linux中更改Git远程URL(Git Remote URL)的方法
  10. 08TensorFlow2.0基础--8.1TensorFlow2.0特性
  11. detectmultiscale函数参数含义_OpenCV人脸识别--detectMultiScale函数
  12. 计算机网络技术教研活动,(2012.09.27)计算机网络技术专业教研活动(文本).doc...
  13. 自己动手写一个分库分表中间件(六)分布式事务问题解决思路<二>动态事务管理器
  14. 罗永浩“卖艺”还债:所有命运馈赠的礼物,都早已在暗中标好了价格
  15. python计算金星凌日
  16. 移动端 H5 概念术语(一)
  17. Facebook机密文件外泄或将终结这家社交媒体巨头
  18. Excel修改证件照图片背景色
  19. linux 多核cpu监控,Linux 下多核CPU知识
  20. 一文让你了解数据采集

热门文章

  1. 诛天者 pat basic 练习五十四 求平均值 测试点2错误
  2. opencv十四天入门学习——task2
  3. openGL API glProgramUniform详解
  4. 苹果MacBook Air 15.5英寸版本或将在3月末推出,并配备M2芯片
  5. 微型计算机i3,三款Core i3品牌台式电脑对比测试
  6. MSSQL之五 连接查询与子查询
  7. 《如何写好科研论文》作业or测试答案(5min速查版)
  8. 企业项目实战----CDN加速的实现
  9. 微信小程序遮罩层悬浮窗踩坑
  10. Java中类关键字super的用法详解