面向对象概念
在学习面向对象之前,我们可以先了解一下面向过程。面向过程是一种思想,意思是我们要做任何事,都需要亲力亲为,强调的是过程。
面向对象也是一种编程思想,相对于面向过程,我们可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化。
面向过程强调的是过程,比如,把大象装冰箱,一共分3步:
第1步:打开冰箱门
第2步:把大象放进去
第3步:关上冰箱门
而面向对象强调的是结果,比如:
什么样的冰箱?什么样的大象?谁负责把大象装进去?
有没有发现,如果是面向对象的话,干这件事的主体并不是你自己,你变成了一个指挥者?
再比如,衣服脏了,我们可以让女盆友帮忙洗,不需要关注中间过程是怎么洗的,就可以拿到干净的衣服,当然,这首先需要有一个对象(加油哦)~
还有,当我们想吃一道菜,其实并不需考虑这道菜是怎么做的,怎么送达的,只需点菜即可.传菜和做菜都有具体的对象来完成具体的功能.我们不需要关注实现的过程,只需要关注结果就好。
这就是我们所说的面向对象的编程思想(OOP,Object Oriented Programming)
如果面试官问什么是面向对象?你答万物皆对象!额,不建议这样做哈,因为我们还没到大佬的这个高度,还是最好举例。
就像是你说 : 空即是色 色即是空…信你个鬼鬼
2 面向对象的三大特征
- 封装: 把相关的数据封装成一个“类”组件
- 继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
- 多态: 增强软件的灵活性和重用性
3 类和对象
3.1 类
- Java语言最基本单位就是类,类似于类型。
- 类是一类事物的抽象。
- 可以理解为模板或者设计图纸。
3.2 对象
每个对象具有三个特点:对象的状态,对象的行为和对象的标识。
- 对象的状态用来描述对象的基本特征。
- 对象的行为用来描述对象的功能。
- 对象的标识是指对象在内存中都有一个唯一的地址值用来和其他对象区分开来。
- 类是一类事物的抽象,对象是具体的实现。
3.3 类和对象的关系
- 计算机语言来怎么描述现实世界中的事物的? 属性 + 行为
- 那怎么通过java语言来描述呢?
我们可以通过类来描述一类事物,用成员变量描述事物的属性,用方法描述事物的行为.
3.4 练习:类的创建使用
在编写代码之前,我们需要分析下需求:
比如我们要把手机这一类事物抽象成代码:
那么这个事物的类型就是"手机",可以用类来描述.
类中包含的就是手机抽取出来的共性的属性与功能.
手机的属性:颜色,尺寸,品牌,价格
手机的功能功能:打电话,发短信,听音乐
对象:除此之外,我们还可以创建对象,就相当于是照着图纸制造出来的一个个的手机,比如1号手机对象,包含特有的成员变量和方法
我们通过class关键字创建类,通过new关键字创建对象。
接下来我们开始编码吧!
创建包: cn.tedu.oop
创建类: TestCreateClass.java
package cn.tedu.oop;
/**本类用来练习面向对象
* 分析手机事物:--通过类来描述
* 属性:品牌 价格 尺寸 颜色
* 功能:打电话 发短信 听直播
* */
//在一个java文件中可以写多个class,但是被public修饰的只能有一个,而且这个类的名字就是文件名
public class TestCreateClass {
public static void main(String[] args) {
//2.在main()中通过new关键字来创建对应类的对象
Phone p = new Phone();
//3.通过.来完成对象功能的调用
p.call();
p.message();
p.learn();
//4.通过.来查看对象的属性值
System.out.println(p.brand);
System.out.println(p.price);
System.out.println(p.size);
System.out.println(p.color);
}
}
//1.通过class关键字创建手机类--用来描述手机这一类事物--特征+行为
//类是一类事物的抽象,只抽象的规定这一类事物的特征和行为
class Phone{
//特征(属性)--类的成员变量来描述--位置:类里方法外
String brand;//品牌
double price;//价格
double size;//尺寸
String color;//颜色
//行为(功能)--类的方法来描述--修饰符 返回值类型 方法名(参数列表){方法体}
public void call() {
System.out.println("正在打电话");
}
public void message() {
System.out.println("正在发短信");
}
public void learn() {
System.out.println("正在看直播");
}
}
3.5 对象在内存中的存储
Java把内存分成5大区域,我们重点关注栈和堆。
- 一般来讲局部变量存在栈中,方法执行完毕内存就被释放
- 对象(new出来的东西)存在堆中,对象不再被使用时,内存才会被释放
- 每个堆内存的元素都有地址值
- 对象中的属性都是有默认值的
TIPS: 栈与队列指的是一种数据的结构。
栈:先进后出(FILO – First In Last Out)
队列:先进先出(FIFO – First In First Out)
3.6 练习2:创建多个对象
package cn.tedu.oop;
/**本类用来练习面向对象
* 分析手机事物:--通过类来描述
* 属性:品牌 价格 尺寸 颜色
* 功能:打电话 发短信 听直播
* */
//在一个java文件中可以写多个class,但是被public修饰的只能有一个,而且这个类的名字就是文件名
public class TestCreateClass {
public static void main(String[] args) {
//2.在main()中通过new关键字来创建对应类的对象
Phone p = new Phone();
//3.通过.来完成对象功能的调用
p.call();
p.message();
p.learn();
//4.通过.来查看对象的属性值
System.out.println(p.brand);
System.out.println(p.price);
System.out.println(p.size);
System.out.println(p.color);
//5.创建第二个对象
Phone p2 = new Phone();
//5.1调用模板里的功能
p2.call();
p2.message();
p2.learn();
//5.2给对象的属性设置值
p2.brand = "HUAWEI";
p2.price = 8888.88;
p2.size = 5.6;
p2.color = "中国红";
//5.3通过.来查看对象的属性值
System.out.println(p2.brand);
System.out.println(p2.price);
System.out.println(p2.size);
System.out.println(p2.color);
}
}
//1.通过class关键字创建手机类--用来描述手机这一类事物--特征+行为
//类是一类事物的抽象,只抽象的规定这一类事物的特征和行为
class Phone{
//特征(属性)--类的成员变量来描述--位置:类里方法外
String brand;//品牌
double price;//价格
double size;//尺寸
String color;//颜色
//行为(功能)--类的方法来描述--修饰符 返回值类型 方法名(参数列表){方法体}
public void call() {
System.out.println("正在打电话");
}
public void message() {
System.out.println("正在发短信");
}
public void learn() {
System.out.println("正在看直播");
}
}
p2.brand = “HUAWEI”;
就是先到栈内存中找到p2中保存的唯一的地址值
然后根据地址值找到对应的Phone对象,并对其对应的属性值进行修改
p2.eat();
也是先到栈内存中找到p2中保存的唯一的地址值
然后根据地址值找到对应Phone对象,执行Phone对象的eat()方法
4 封装
4.1 概述
封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
好处:
- 提高安全性
- 提高重用性
4.2 private关键字
是一个权限修饰符 ,可以用来修饰成员变量和成员方法.被私有化的成员只能在本类中访问
4.3 练习:封装学生案例
创建包: cn.tedu.oop
创建类: TestPrivate.java
package cn.tedu.oop;
/**本类用于测试封装*/
public class TestPrivate 函数main
public static void main(String[] args) {
//5.创建学生类对象--通过new关键字创建学生类对象
Student s = new Student();
//6.初步测试Student类对象s
System.out.println(s.name);//可以通过"."来调用s对象的name属性,查看它的值
s.study();//可以通过"."来调用s对象的study()
//7.给s对象的属性赋值
s.name = "程序猿";
s.sno = 666;
//s.subject = "Java培优";
//8.查看赋值后的属性值
System.out.println(s.name);
System.out.println(s.sno);
//System.out.println(s.subject);
//10.通过Student类中提供 的公共的subject属性的设置与访问方法来给subject属性赋值并查看
s.setSubject("JavaCGB");
System.out.println(s.getSubject());
//eat();
s.study();
}
}
//1.通过class关键字创建学生类--用来描述学生这一类型--属性+行为
/***
* 封装:通过private关键字(权限修饰符)来修饰成员变量/成员方法
* 被修饰的成员就实现了私有化,访问权限只能在本类中访问
*/
class Student{
//2.定义属性--成员变量
String name;//姓名
int sno;//学号
//9.对成员变量进行封装
private String subject;//科目
/**对外提供公共的属性值设置方式*/
public void setSubject(String s) {
subject = s;
}
/**对外提供公共的属性值查看方式*/
public String getSubject() {
return subject;
}
//3.定义行为--方法
public void study() {
System.out.println("正在学习JAVA");
/**我们可以在公共的方法里调用私有方法*/
eat();
}
//11.封装方法
private 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.创建汽车类对象c
Car 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();//又创建了一个对象调方法