Day06
昨日回顾
数组
异常:下标越界异常 空指针异常
数组中数据默认
整数 0
小数 0.0
字符 空
布尔 false
String null
数组中内存
Jvm
栈 堆 方法区
一个数组的内存 两个。。。 两个引用指向同一个
数组的使用
遍历 索从0开始 长度.length 索引最大值 长度-1
最值 擂台思想
反转 倒序
查找
今日内容
面向对象思想介绍
类和对象
面向对象中其他
封装
面向对象思想介绍
1、对象:万物皆对象
2、面向对象:编程使用的一种编程思路,编程思想,强调的是调用对象的行为来实现功能
3、面向过程:强调解决问题的基本步骤,强调问题的解决方式,更强调的是方法。
面向过程的编程思路:自顶向下、不断分解
面向对象:更强调解决问题的主体,更强调谁来解决这个问题,更强调的是数据,更强调的是对象,更强调的是谁拥有数据和操作数据的权力。面向对象的编程思路:自底向上,不断拼装
洗衣服:
面向过程:衣服 找个盆 接水 放衣服 洗衣液 脚踩 拧干 晾晒
面向对象:衣服 放到洗衣机 启动 洗衣液 晾晒
4、面向对象好处:
(1)更符合人类的思想习惯:凡事喜欢找对象、找工具、找人,而不是找方法
(2)复杂的问题简单化
(3)由执行者变成了指挥者
4、面向对象的特征:(三)
封装 继承 多态
5、面向对象是面向过程更高层次的编程思想、面向过程是面向对象的基础。面向对象基于面向过程。
类和对象
类和对象的比较
1、类:
生活中的类:代表了一类事物(这一类事物具有相同的特征)
电商网站,用代码抽象出现实中的买家、卖家、商品…实现了交易的信息化。
那么我们该如何表示一个现实世界事物呢?它可以抽取出属性和行为!
属性就是该事物的描述信息
行为就是该事物能够做什么
比如:手机……
Java中的类:对一类具有相同特征的对象进行共性的抽取,形成一个概念,
是一组相关属性和行为的集合。
代码:
class 类名{
属性(又称为成员变量)
行为(又称为成员方法)
}
抽象:抽取事物中,像的相同的相似的内容出来,在人脑中形成一个概念
2、对象:是一类事物的具体体现。(现实生活中存在的事物都是对象)
对象是类的一个实例,必然具备该类事物的属性和行为。
3、总结
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体/实例。
类的说明
现实世界的一类事物:
属性:事物的状态信息。
行为:事物能够做什么。
Java中用class描述事物也是如此:
成员变量:对应事物的属性
成员方法:对应事物的行为
那么用代码来表示就应该这样写:
class 类名{
//成员变量
//成员方法
}
总结:
定义类:就是定义类的成员,包括成员变量和成员方法。
成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
成员方法:和以前定义方法几乎是一样的。只不过把static去掉,static的作用在后面 课程中再详细讲解。
功能:方法,表示能做什么事情,或者能完成什么功能
方法的定义:
修饰符 返回值类型 方法名(形参){
方法体语句;
return;
}
现在修饰符方面:以前用public static 现在直接定义成public
代码:
练习:
定义一个学生类,姓名,性别,年龄,吃饭,学习
//定义一个学生类,姓名,性别,年龄,吃饭,学习
public class Student {
//成员变量 属性 姓名 性别 年龄
//姓名
String name;
//性别
String gender;
//年龄
int age;
//成员方法 行为 吃饭 学习
//吃饭
public void eat() {
System.out.println(“吃饭不积极,脑子有问题!”);
}
//学习
public void study() {
System.out.println(“good good study,day day up!”);
}
}
对象的创建和使用
对象创建的格式:
类名 对象名 = new 类名(); //创建对象,实例化对象
例如:Scanner类 Scanner sc = new Scanner(System.in);
格式内容解释:
类名:要创建的对象所属的类型,例如Scanner、Person
对象名:是一个合法的标识符即可,用于表示创建的对象
=:将对象的地址,赋值给对象名
new:在堆内存中开辟一段空间,用于存储该类型的数据
类名:和前面声明引用的类名一样。
():表示调用一个方法,构造方法。
例如:Person类
Person p = new Person();
属性的访问(获取):
对象名.属性名
属性的赋值:
对象名.属性名 = 属性值;
属性的使用范围:
自成员变量定义开始,可以使用在整个类中
访问方法(方法的使用):
对象名.方法名();
面向对象中的其他内容
成员变量和局部变量的比较
1、成员变量:定义在类中的成员位置的变量,就是成员变量;
局部变量,定义在方法中的变量,就是局部变量。
2、不同点:
代码层面:定义位置不同
局部变量:定义在方法中,或者方法声明上(方法的形式参数)
成员变量:定义在类中方法外。
内存层面:空间不同
局部变量:属于方法,和方法的位置相同,在栈内存中
成员变量:属于对象,和对象的位置相同,在堆内存的对象中
内存层面:时间不同,生命周期不同
局部变量:随着方法的调用而存在,随着方法的调用结束而消失
成员变量:随着对象的创建而存在,随着对象的消失而消失(栈内存中没有任何引 用指向该对象时,该对象就变成了垃圾,片刻之后就会被垃圾回收线程回收掉)
初始化状态不同:
局部变量:没有默认的初始化值,必须先手动赋值,才能使用
成员变量:有默认的初始化值
匿名对象的理解和使用
匿名对象:没有名字的对象。
定义格式:
new 类名(); //只有对象的实体
匿名对象的使用场景:
(1)如果某个对象在创建之后,其方法只调用一次,那么就可以使用匿名对象来调用。 这种写法会节省一些内存空间。
(2)可以作为某个方法的实际参数。
(3)可以作为某个方法的返回值。
注意事项:
匿名对象可以给成员变量赋值,但是这样做没有任何意义。因为匿名对象一旦被赋值,匿名对象就变成了垃圾,很快被回收掉。即使没有被回收,我们也无法使用这个匿名对象。
封装
封装的概述
1、封装:隐藏事物的属性和实现细节,对外提供公共的访问方式。
现实中:比如电脑,它是由CPU、主板、显卡、内存、硬盘、电源等部件组成,其实我 们 将这些部件组装在一起就可以使用电脑了,但是发现这些部件都散落在外面,很容造 成不安全因素,于是,使用机箱壳子,把这些部件都装在里面,并在机箱壳上留下一些 插口等供外界使用。
总结:机箱其实就是隐藏了设备的细节,对外提供了插口以及开关等访问内部细节的方式。
代码中:封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。 要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护, 也加强了代码的安全性。所以,我们需要将代码中的属性隐藏起来,若需要访问某个属 性,提供公共方法对其访问。这就是封装。
2、封装的好处:
隐藏了事物的实现细节
提高了代码的复用性
提高了安全性
3、封装的原则:
隐藏事物的属性
隐藏事物的实现细节
对外提供公共的访问方式
4、封装的操作步骤(重点)
- 使用 private 关键字来修饰成员变量。
- 对需要访问的成员变量,提供对应的一对 getXxx 方法(获取值) 、setXxx(设置值/赋值) 方法。
- 其他地方要操作可以通过getXxx和setXxx方法来操作。
private关键字
1、private单词:私有的,私密的,是权限修饰符,代表最小的权限。
2、可以修饰成员变量和成员方法。
3、被private修饰的成员,只能在本类中被访问。
4、private关键字的注意事项;
private只是封装的一种体现形式,封装还可以使用其他的修饰符来完成。
5、private使用格式: private 数据类型 变量名;
Getter和Setter
1、当属性被私有之后,外界无法直接访问,所以需要提供公共的访问方式,让外界可以间接的访问属性。对于当前类,就可以控制外界访问属性的方式。(我让你怎么访问,你就只能怎么访问)
2、一般提供get方法,获取成员变量的值、提供set方法,设置成员变量的值
在main方法中执行到s.setName(“王老五”);这一步时,并不是s在调用这个方法,而是s根据对象给他的地址值,去堆内存中找到相应的对象,再用对象去方法区中找到setName()方法,然后setName()方法入栈,然后根据地址值给堆内存中的变量赋值,调用完毕setName()方法会出栈。
变量访问原则和this关键字
1、我们发现 setXxx 方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变 量名一致,是否就见名知意了呢?代码如下:
经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了setXxx() 的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。
2、this的含义-this表示当前对象
this代表所在类的当前对象的引用(地址值),即对象自己的引用。
记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。
3、this的使用格式
this.成员变量名;
4、问题的解决:
构造方法概述
1、引入:
当一个对象被创建时候,构造方法可以用来初始化该对象,给对象的成员变量赋初始值,就不用在一个个的手动调用set方法了。
小贴士:
(1)无论你是否自定义了构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法。
(2)一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。
2、构造方法:构造函数,构造器,Constructor
3、构造方法的定义格式:
修饰符 方法名称(参数列表) {
方法体
}
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。
简单记法:构造方法与类名相同且没有返回值
4、注意事项
1. 如果你不提供构造方法,系统会默认给出无参数构造方法。
2. 如果你提供了构造方法,会把系统提供的无参构造覆盖掉。
3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数,可以同时提供多个。
4. 在开发中,如果要提供有参构造,建议同时提供无参构造!除非你就是确定不让人 家直接new。
方法重载:
总结:
成员方法:public void eat(){} 只是删除了static
构造方法:public 类名(){} 删除了static 删除了返回值类型
创建对象内存理解
1、创建对象的过程中,有三个初始化的步骤:
构造方法初始化
默认的初始化
显式初始化
2、三者的顺序:
顺序:默认初始化、显式初始化、构造方法初始化
3、创建对象的过程:
(1)将创建的对象所属类型加载到方法区
(2)在栈内存中创建对象的引用,将来用于存储对象的地址
(3)在堆内存中开辟内存空间,给成员变量分配内存
(4)给成员变量默认初始化赋值
(5)给成员变量显式初始化赋值
(6)给构造方法初始化赋值
(7)将对象的地址,赋值给栈内存中的引用