一、全局变量 局部变量
1)成员变量(属性):直接定义在类中
成员变量有默认值,如果给成员变量不赋值,采用的就是默认值
整形为0 小数位0.0 布尔为false char类型的为’ \u0000’(二进制的0),引用类型的为null
2)局部变量:在方法中定义的变量,使用之前必须赋值
二、对象内存结构
1.对象头(Header)
Mark Word(标记字段):对象的Mark Word部分占4个字节,其内容是一系列的标记位,hash码,
比如轻量级锁的标记位,偏向锁标记位等等。
Klass Pointer(Class对象指针):Class对象指针的大小也是4(8)个字节,其指向的位置是对象
对应的Class对象(其对应的元数据对象)的内存地址
2.实例数据(Instance Date)
对象实际数据:这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定
3.对其填充(Padding)
最后一部分是对齐填充的字节,按8个字节填充。
三、getter setter方法
问题:在这之前,对象的属性可以直接赋值(属性可以直接被访问到),可能会出现安全性问题。
解决方法:对属性进行私有化,通过setter和getter进行设置属性和获得属性。
四、封装
1.概念
隐藏复杂,暴露简单
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将类的某些信息隐藏在类的内部,不允许外部程序
直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。
2.好处:
(1)只能通过规定的方法访问数据,可以有效的保护数据
(2)隐藏类的实现细节,方便修改和实现。
3.封装的实现步骤
(1)修改属性的可见性设为(private)
(2)创建getter/setter方法(用于属性的读写)(通过这两种方法对数据进行获取和设定,对象通过调
用这两种发方法实现对数据的读写)
(3)在getter/setter方法中加入属性控制语句(对属性值的合法性进行判断)(不是必须要加)
五、类和对象应用
六、关于引用类型参数
调用带参数的方法的过程
1. 给形参在内存中开辟空间
2. 将实参的值赋值给形参
3. 执行test方法方法体中的代码
引用类型的参数传递的是地址信息
基本数据类型传的是值
七、方法重载(overload)
如果有一系列方法,它们的功能都是类似的,只有参数有所不同,那么,可以把这一组方法名做成同名
方法。
1.方法重载概念:
在同一个类中
方法名称一样
方法参数不一样(参数的个数、类型顺序、类型不一样)
和其他的因素无关
2.示例
注:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错,这叫做重载分辨。
八、构造方法:
1. 概念知识
名称和类名一样,无返回声明
在创建对象的时候调用(每次创建对象都会调用)
每一个类都有一个默认的隐式的无参数的构造方法,如果写了其他带参数的构造方法,那么默认的无
参数的构造方法会消失。
我们经常使用构造方法给属性赋值,但是构造方法赋值侧重于给属性赋初值,Set方法侧重于修改
属性的值
2.示例
测试类
九、初始化块
在创建对象的时候自动调用,每创建一个对象,都会调用一次,一般用来给属性赋初始值,执行时机先
于构造方法
{
代码….
}
声明的时候可以赋初始值:时间点最早,但是创建所有的对象的初始值都是一样的
代码块中可以赋初始值:不能带参数,所以如果初始值写死,或者是经过一个运算得到初始值,可以放
在代码块中赋值,所有对象的初始值都一样
构造方法可以赋初始值:可以带参数,初始值可以由调用者确定
全局变量的初始化及三种初始化运行之间的关系
十、创建对象的过程:
1. 给属性开辟空间,给属性赋默认值
2. 如果声明属性的时候给属性赋初始值
3. 如果类中有代码块,会执行代码块(每创建一次对象都会执行一次)
4. 执行构造方法中的代码
十一、this关键字
1. 概念
This代表的是当前类的对象(谁调用this所处的方法,this就指哪一个对象)
2. this的应用场合(第一种普遍使用)
this.属性(大部分情况下用于区分局部变量的名称和属性名称,this如果用在构造方法中,指当前
创建的对象)
this.方法(参数列表)(在当前类的一个方法中调用当前类的其它方法)
this(参数列表):用于在当前类的一个构造方法中调用当前类的另外一个构造方法,调用代码必须放
在构造方法的第一行(在构造方法中不可以使用名称调用另外一个构造方法)
十二、练习