javaSE基础复习巩固

第四天:面向对象思想(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基础技术内容很多,需要自己反复去学习,最重要的是要有自己的理解,自己的思考,这样才会把它学好。最后一句话激励自己和看到这篇博客同样奋斗的小伙伴们:冰冻三尺非一日之寒。坚持下去,加油!定能不负韶华!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值