面向对象的三个特性:封装、继承、多态
封装
含义:就是将实现程序细节给隐藏,然后再提供公开的方式实现访问
好处:1、方便我们使用和调用者调用。2、封装能提高代码的安全性;3、封装能够提高代码的复用性。
封装的内容:所有成员都可以被我们进行封装。
封装的方式:就是用private关键字来修饰我们的成员
private:
含义:隐藏的 私有的
修饰的内容:1、成员变量;2、成员方法;3、构造方法;4、成员内部类
修饰的结果:被修饰的成员只能在本类中访问,其他类是访问不到的
注意事项:private修饰只是我们封装的一种方式,并不代表这就是封装。
Setters and Getters
就是get和set方法
我们通过private队成员进行封装之后,其他类就无法再去操作成员,实现了不能使用,我们需要通过一些公共的方式来提供给用户操作数据。
Set方法:作用就是提供给用户去操作数据的方法(赋值)
Get方法:作用就是提供给用户去获取我们赋值完成后的数据的方法
内存分析:加载主类,main方法进栈,p1加载进栈,per类加载进方法区(他需要一个字节码),per中的内容都加载进方法区,创建对象,去堆内存中开辟空间,per,有一个内存地址,去栈中有一个引用,联系上以后就可以操作了,加载默认值,set方法进栈开辟空间,
变量的访问原则和this关键字的使用:
变量的访问原则:就近原则
变量在访问时会先去离自己声明最近的那个变量名中进行操作,指的是我们方法中声明的变量或者是形参,如果在这个方法中寻找不到当前需要变量,就会去成员变量中寻找,如果成员变量依旧没有找到,就会去自己的父类寻找,如果父类没有,继续想上寻找,直到顶级父类(Object)也没有,就报错
this:含义:就是表示当前引用的对象
作用:1、就是解决程序中出现的二义性的问题;2、就是代表当前引用的对象
类比:在生活中this就相当于语句中的我,主语。
this的指向场景:
调用方法时this指向当前调用方法的对象;
构造方法 this指向当前被创建的这个对象
构造方法:
含义:constructor构造器
作用就是用来创建对象的方法,在创建对象的同时,希望这个对象能够具有有意义的初始值。对象中的属性在被创建的同时完成赋值。
格式:
修饰符 方法名(形参){
方法体;
}
定义的说明:
方法的返回值类型:构造方法不需要返回值,void都不需要写
方法名:必须要与类名保持一致
方法体:方法体的内容就是给成员变量进行赋值,不需要返回值,如果一定要写return,那么这个关键字只有结束方法的功能
使用说明:1、构造方法不是我们自己调用的,由jvm自动调用;2、构造方法不能够在创建对象之后被调用;3、构造方法的执行是在创建对象的同时执行;4、因为每个对象只需要被创建一次,所以构造方法只执行一次。
构造方法的注意事项:
1、如果我们自己不去写构造方法那么系统会默认提供给我们一个无参构造,这个无参构造只用于创建对象,没有其他功能;2、如果我们自己在类中写了构造方法那么系统提供的那个无参构造就没有了;3、无参构造建议我们在类中去声明构造方法最好是把无参和有参构造都要声明,形成构造函数的重载;4、构造函数的重载:方法名一致(都是类名),参数列表不一致(有参,无参),与返回值类型无关(构造方法就没有返回值)
构造方法和set的区别
相同点:都是用于给变量进行赋值
不同点:1、调用者不同:构造方法的调用者是jvm;set方法的调用者是对象
2、执行时机不同:构造方法是创建对象地同时执行,set是在对象创建完成之后被对象调用
3、执行次数不同:构造方法只执行一次,set方法可以被对象调用多次
4、作用的不同:构造方法的作用是给成员变量进行初始化;set方法是对于初始化完成的成员变量进行值的修改。
有构造方法的内存情况
初始的几种方式:
1、显示赋值的方式:int age=18;
2、默认赋值的方式
3、构造器赋值
几种初始化赋值的顺序:1、显示初始化在默认初始化之后;2、构造初始化在显示初始化之后
默认初始化--显示初始化--构造器初始化
内存分析:
静态
静态的概述:
没有静态修饰的情况:
代码层面:没有成员被static修饰
弊端:造成空间的浪费,如果需要修改成员的值,必须修改多次
内存层面:都需要在堆内存开辟空间储存
有静态修饰的情况:
代码层面:静态的成员需要加上static关键字来修饰。
好处:空间的利用率更高,修改起来只需要修改一次就可以。
内存层面: 在方法区中开辟静态空间存放。
特点:
调用:可以使用变量来调用也可以使用类名直接调用。
生成的时机:是在对象创建之前被生成,所以他是根据类的加载而被创建。
存在方法区中,静态资源可以被共享。
静态的注意事项
1、静态的方法没有办法调用非静态的方法
原因:静态的方法会跟随类的加载信息而加载,非静态的方法只能在调用时进栈才能被加载。
如果使用静态的方法去调用非静态的方法时间上是矛盾的。
2、静态的方法没有办法调用非静态的变量
在静态方法加载之后我们非静态的变量还没有进栈。时间上也是矛盾的。
3、静态的方法可以使用静态的变量
符合加载的时机。
总结:静态优先于非静态。