第四天:面向对象思想(oop) 封装 构造方法 static关键字
面向对象:是一种编程思想,符合人类做事方式的思想。
别人帮我们帮把事情的过程(步骤)都做好了,我们直接拿过来用就可以了。
例如:点外卖,去饭店吃饭(去饭店吃饭不需要我们去考虑去做那些做饭的过程(例如:买菜,洗菜,切菜,炒菜等等这一系列的过程)直接就饭店厨师帮我们做好,我们直接拿过来吃就可以了)
找中介买房......
面向过程:做某件事情,事情的每一个步骤都需要我们直接亲力亲为自己去完成.例如:C语言,C++
面向对象,那到底什么是对象?现实世界中客观存在的事物都可以把它称为对象(实实在在存在的事物就是一个对象),也可以说万物皆对象(例如:一个桌子,一直猫,一条鱼,一个人等等)
那么到底我们怎么去区分两个不同对象?
例如:区分冰箱和洗衣机?可以通过外观特征或者它们本身的功能去区分
区分张三和李四?通过身高,胖瘦,肤色等一些外观特征可以去区分
区分桌子和凳子?
通过外观特征(属性)可以去区分(外观特征我们也叫做属性)
例如:区分王五和赵六两个人?可以他们的 姓名 身高 体重 性别
通过这些属性值去区分
在比如有一个白色的物体 高80cm,宽50cm 我们就不知道他是冰箱还是洗衣机,如果说它有洗涤的功能的话,我们就知道了它是洗衣机。
所以区分一个对象我们要通过外观体征(属性)和行为功能(方法)。
对象说完了,在讲一个新的概念?对象往往是与类联系在一起的?
那么什么是类?由多个对象组成的一个集合的称呼,举个例子:人类 人类是由全球所有的人组成的,而每一个单个的人就可以看成是一个对象。
动物类,花类(所有的花就可以看成是一个花类),树类,鱼类(所有的鱼就可以看成是鱼类)
类与对象的关系是什么?对象是类的一个具体表现形式(叫实例化也就是说类中的每个实例就是对象)
在实际生活中是先有对象在有类
在程序中是先有类再有对象的,在通过该类去创建该类具体的对象
那么怎么去创建对象?Person p =new Person();
1.先创键类文件(注意:类名每个单词的首字母要大写(规范))
2.在写类的属性和方法(类里面封装属性和方法)
3.在到测试类中(main方法中)创建类的对象
4.通过对象名可以调用对象的属性并赋值(或者调用方法),在从控制台输出结果
执行测试类(main方法)的时候,会把这个类文件加载方法区(内存),而执行这个类文件的时候,相当于把person也加载进了内存,在里面创建person对象,执行的时候,相当于也把person也记载进了内存,两个都会生成.class文件,mian方法会加载进栈内存里面去,main方法有new person();,new一下,就会创建了person对象,就会在堆内存中开辟一块空间,这块空间有一个地址值,例如:可以叫001,这个地址值,可以复制一份给对象名(p1),那p1通过这个地址值001指向了堆中对应那个地址值001,对象里面的属性也会加载进堆里面,并且这些属性都会有默认值,如果你给这些属性赋了值,它就会覆盖堆中对应属性的值,如果又创建一个对象p2,又会从堆中开辟一块新的内存空间,地址值可以叫002,把002赋值给p2,指向了堆内存中的那块内存空间,p2里面如果又属性也会加载进堆内存,并且这些内存也会有默认值。
那么对象在内存中是怎么存储的?如图所示:
面向对象总结:
1.面向对象:是一种编程思想, 符合人类做事的习惯。让别人把事情做好,自己直接使用结果
2.对象是一个实实在在的事物(万物皆对象)
3对象与类的联系?
类是对象的集合的称呼,对象是类的实例化
对象具有属性(特征) 和方法(功能)
4.在程序中先要创建类文件,然后创建测试类文件,在测试类文件中创建该类的对象。可以通过对象调用属性并赋值,也可以调用方法
直接打印对象名时,想打印的是对象内容吗?
对象直接调用toString()方法,调用的是Object这个类中的toString(),Object是所有类的超类(根类),其他类的对象都调用Object类中的方法。
5.如果没有重写toString方法而直接输出对象名的话,会输出什么?会输出对象名在堆内存中的地址值全类名+@+哈希值(Ib6d3569),这个地址值是个哈希值由@和哈希值(Ib6d3569)组成。
想要输出对象的成员属性值的话,需要我们重新Object的toString()。
把类的成员属性私有化之后,在测试类中就不能对对象进行赋值了,可以用set和get进行赋值和取值
get和set方法?可以用getXXX()和setXX()进行赋值和取值
赋值是有参无返,取值是无参有返。
在setXXX()中可以添加逻辑判断
局部变量和成员变量的区别?
1.默认值----成员变量都有默认值,局部变量没有默认值(必须赋值,再使用)
2.作用域----成员变量在整个类中都有效,局部变量只在方法声明中有效。
3.在内存中的位置---成员变量的值存储在堆内存中,局部变量的值存储在栈中。
4.类中的位置----成员变量在类中方法外,局部变量在方法内或者方法声明上。
面向对象的三大特征?
封装 继承 多态
那么什么是封装?隐藏类的内部细节
那些方面可以看成是封装?
1.类好可以看成是一种封装,封装了类的成员属性和成员方法
2.方法也可以看成是一种封装,封装了具体功能
3.属性私有化也是一种封装,可以使用set和get方法对成员属性进行赋值和取值。
为什么要封装?
封装的好处?
1.提高代码的复用性
2.提高程序的安全性(把属性私有化)
扩展:堆内存泄漏?栈内存溢出?
构造方法
类名 对象名=new 类名();
类名();实际上是构造方法,类中没有定义任何构造方法时,默认是调用的是无参构造方法
无参构造方法作用:
1.用来创建对象用的
2.给成员属性初始化赋值,属性都有默认值
无参构造方法格式:
public 类名(){
}
建议创建类的时候把有参和无参构造方法都加上(防止出错)
有参构造方法作用:1.也可以创建对象
2.给成员变量进行二次赋值。
有参构造方法格式:
public 类名(参数...){
}
Person p=new Person();
给属性赋值有几种方式?分别是?
有三种 1.对象调用属性并赋值
2.用set方法进行赋值
3.用有参构造方法进行赋值
1.构造方法中调用其他的构造方法使用this关键字
只能放到构造方法中的有效代码第一行)
2.构造方法不能相互调用
this:代表当前对象的引用(就可以看成是当前对象)
super:代表父类的引用(不能看成是父类)
final:修饰的变量变常量(常量一般都会默认使用final修饰)
static:静态的(修饰的成员属于类)static修饰的成员变量存储在方法去的共享数据区中,而不是堆内存中,是被所有的对象所共享的资源。
什么时候成员变量用static修饰?看成员是否被所有的对象共享。
static关键字?直接上图:
static的特点:
1,static是一个修饰符,用于修饰成员。
2,static修饰的成员被所有的对象所共享。
3,static优先于对象存在。
原因:因为static的成员随着类的加载就已经存在了。而对象是先把main方法从方法区中加载到栈中,再去在堆中生成具体的对象
4, static修饰的成员多了一种调用方式,就可以直接被类名所调用 。
5, Static修饰的成员属于类,成员变量属于对象
原因:因为static修饰的成员是随着类的加载而存在,是属于类的(成员变量是属于对象的),所以可以通过类名调用static修饰的成 推荐使用:类名.静态成员 。
5,static修饰的数据是共享数据,对象中的存储的是特有数据。
静态方法---static修饰的方法
1.static修饰的成员(成员属性和成员方法)是属于类的
2.类是优先于对象存在的----所以static修饰的成员方法是无法访问成员变量的
3.成员变量和成员方法都是属于对象的,但是成员方法最终都会进栈和弹栈
4.静态方法无法访问非静态成员,因为类优先于对象存在。
5.静态方法可以访问静态成员
成员方法可以访问那些成员?静态的和非静态的都可以访问
因为成员方法是属于对象的,在对象之前,已经完成了类文件加载到方法区的步骤了(静态成员早就已经存在了)
成员变量和静态变量的区别
1,两个变量的生命周期不同。
成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
类什么时候消失?关闭JVM可以让类消失(并不能完全)
变量要存储的数据量比较大的时候建议不要使用static
局部变量是方法执行的时候会在栈内存中分配内存空间,方法执行完毕后释放空间
2,调用方式不同。
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3,别名不同。
成员变量也称为实例变量。
静态变量称为类变量。
4,数据存储位置不同。
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.
局部变量存储在栈内存中
静态方法使用的注意事项:
1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
2,静态方法中不可以使用this
3,主函数是静态的。
主函数特殊之处:
1,格式是固定的。
2,被jvm所识别和调用。是任何java程序的入口
public:要被jvm虚拟机执行,权限必须是最大的。
static:不需要对象的,直接用主函数所属类名调用即可。
void:主函数没有具体的返回值。
main:函数名,不是关键字,只是一个jvm识别的固定的名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。
今日学习感受:坚持真的很累,有时候会被很多事分心,就会难以静下心去学习,但是自己还是要咬牙坚持下去,自己选择的路,选择的方向,一定要努力前进。学习这些java基础技术内容很多,需要自己反复去学习,最重要的是要有自己的理解,自己的思考,这样才会把它学好。最后一句话激励自己和看到这篇博客同样奋斗的小伙伴们:冰冻三尺非一日之寒。坚持下去,加油!定能不负韶华!