学习面向对象内容的三条主线
• Java 类及类的成员
:(重点)属性、方法、构造器;(熟悉)代码块、内部类
• 面向对象的特征
:封装、继承、多态、(抽象)
• 其他关键字的使用
:this、super、package、import、static、final、interface、
abstract 等
程序设计的思路
面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向
过程、指令式编程和函数式编程。在所有的编程范式中,我们接触最多的还是面
向过程和面向对象两种。
1. 面向对象编程概述(了解)
在学习面向对象之前,我们可以先了解一下面向过程。
面向过程是一种编程思想,它强调的是过程,意思是我们做任何事,都需要亲力亲为。
面向对象也是一种编程思想,相对于面向过程,我们的身份可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化。
面向过程强调的是过程
,比如,把大象装冰箱,一共分3步:
第1步:打开冰箱门
第2步:把大象放进去
第3步:关上冰箱门
而面向对象强调的是结果
,比如:
谁负责把大象装进去?
有没有发现,如果是面向对象的话,干这件事的主体并不是你自己,你变成了一个指挥者?
再比如,衣服脏了,我们可以让女盆友帮忙洗,不需要关注中间过程是怎么洗的,就可以拿到干净的衣服,当然,这首先需要有一个对象(加油哦)~
还有,当我们想吃一道菜,其实并不需考虑这道菜是怎么做的,怎么送达的,只需点菜即可.传菜和做菜都有具体的对象来完成具体的功能.我们不需要关注实现的过程,只需要关注结果就好。
这就是我们所说的面向对象的编程思想(OOP,Object Oriented Programming)
2 面向对象的三大特征
封装: 把相关的数据封装成一个“类”组件
继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
多态: 增强软件的灵活性和重用性
类的概述
面向对象程序设计的重点是类的设计
类是一类事物抽取属性与功能形成的。
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同理,Java 代码
世界是由诸多个不同功能的类构成的。
Java 中用类 class 来描述事物也是如此。类,是一组相关属性和行为的集合,这也是类最
基本的两个成员。
属性:该类事物的状态信息。对应类中的成员变量
行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
3.2 对象
每个对象具有三个特点:对象的属性,对象的功能和对象的标识。
对象的属性用来描述对象的基本特征。
对象的功能用来描述对象的可以完成的操作。
对象的标识是指每个对象在内存中都有一个唯一的地址值用于与其他对象进行区分,类似于我们的身份证号。
3.3 类和对象的关系
我们先创建类,再通过类创建出对象
我们可以通过一个类创建出多个对象
类是抽象的,对象是具体的
类就像设计图纸,而对象就是具体的事物
步骤 1:类的定义
类的定义使用关键字:class。格式如下:
[修饰符] class 类名{
属性声明;
方法声明;
}
步骤 2:对象的创建![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/ec067d508be6e24ccce48777b4d48dfe.png)
创建对象,使用关键字:new
创建对象语法:
方式一:
类名 对象名 = new 类名();
方式 2:
new 类名() //也称为匿名对象
3.4 练习:类的创建使用
手机的属性:颜色,尺寸,品牌,价格
手机的功能功能:打电话,发短信,听音乐
package cn.tedu.oop;
/**本类用作面向对象入门案例
* 设计手机这一类事物:
* 分析属性:品牌 价格 尺寸 颜色
* 分析功能:打电话 发短信 看直播*/
/**在一个java文件中可以写多个class,但是,被public修饰的class只能有一个
* 而且要求这个公共类的名字必须与文件的名字保持一致*/
public class TestCreateClass {
public static void main(String[] args) {
//help-findAction 或者 Alt+7
//4.创建手机类的对象p1
Phone p1 = new Phone();
//5.通过手机类对象调用手机类的功能
p1.call();
p1.message();
p1.video();
//6.通过手机类对象打印查看属性值
System.out.println(p1.color);//null
System.out.println(p1.price);//0.0
System.out.println(p1.size);//0.0
System.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大区域,我们重点关注栈和堆。
一般来讲局部变量存在栈中,方法执行完毕内存就被释放
对象(new出来的东西)存在堆中,对象不再被使用时,内存才会被释放
每个堆内存的元素都有地址值
对象中的属性都是成员变量,是有默认值的
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.创建手机类的对象p1
Phone p1 = new Phone();
//5.通过手机类对象调用手机类的功能
p1.call();
p1.message();
p1.video();
//6.通过手机类对象打印查看属性值
System.out.println(p1.color);//null
System.out.println(p1.price);//0.0
System.out.println(p1.size);//0.0
System.out.println(p1.brand);//null
//7.创建手机类的第2个对象p2
Phone 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@1b6d3586
System.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("正在看直播~");
}
}