面向对象(一)
一、面向对象思想
概述
面向对象是基于面向过程的编程思想
特点
是一种更符合我们思想习惯的思想
可以将复杂的事情简单化
将我们从执行者变成了指挥者
特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
二、类与对象的关系
类:是一组相关的属性和行为的集合
类的定义
Java中描述事物的类中
成员变量 就是事物的属性
成员方法 就是事物的行为
定义类其实就是定义类的成员(成员变量和成员方法)
类的使用
创建对象:
类名 对象名 = new 类名();
对象名.成员变量
对象名.成员方法
类的初始化过程
举例:
Person s = new Person ();
加载Person .class文件进内存
在栈内存为s开辟空间
在堆内存为人类对象开辟空间
对人类对象的成员变量进行默认初始化
对人类对象的成员变量进行显示初始化
通过构造方法对人类对象的成员变量赋值
人类对象初始化完毕,把对象地址赋值给s变量
对象:是该类事物的具体体现
对象内存图
栈:基础数据类型,对象的引用(地址),方法的执行,执行完之后就会回收
堆:new出来的对象
方法区:方法区包含所有的class和static变量一共两块区域,方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量,class中的非static变量会在new的时候创建一份新的存放在堆中,方法在使时是会根据地址值加在到栈内存中允许完从内存回收掉,存在堆中的是方法的地址
三、变量之间的区别
成员变量和局部变量区别
在类中的位置不同
成员变量 方法外类内
局部变量 方法内或者方法声明上(方法列表)
在内存中的位置不同
成员变量 堆内存
局部变量 栈内存
生命周期不同
成员变量 随着对象的存在而存在,随着对象的消失而消失
局部变量 随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不同
成员变量 有默认的初始化值
局部变量 没有默认的初始化值,必须先定义,赋值,才能使用。
静态变量和成员变量的区别
所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
生命周期不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
四、形式参数问题
基本类型:形式参数的值改变不影响实际参数的值
引用类型:形式参数的值改变直接改变实际参数的值,因为指向的是同一块内存区域
五、匿名对象
匿名对象:就是没有名字的对象。
是对象的一种简化表示形式
匿名对象的两种使用情况
对象调用方法仅仅一次的时候
作为实际参数传递
六、封装
概述
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性。
封装原则:
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
七、private关键字
概述
是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问
应用
把成员变量用private修饰
提供对应的getXxx()/setXxx()方法
八、this关键字
this:
代表所在类的对象引用
记住:
this所在的方法正在被哪个对象调用,this就代表哪个对象
应用:
局部变量隐藏成员变量
其他用法后面和super一起讲解
九、构造方法
构造方法作用概述
给对象的数据进行初始化
构造方法格式
方法名与类名相同
没有返回值类型,连void都没有
没有具体的返回值
构造方法注意事项
如果你不提供构造方法,系统会给出默认构造方法
如果你提供了构造方法,系统将不再提供
构造方法也是可以重载的
十、类的成员方法分类
根据返回值
有明确返回值方法
返回void类型的方法
根据形式参数
无参方法
带参方法
十一、JavaBean标准代码
类
成员变量
构造方法
无参构造方法
带参构造方法
成员方法
getXxx()
setXxx()
初始化时给成员变量赋值的方式
setXxx()
带参构造方法
十二、static关键字
可以修饰成员变量和成员方法
static关键字特点
随着类的加载而加载
优先于对象存在
被类的所有对象共享
这也是我们判断是否使用静态关键字的条件
可以通过类名调用
static关键字注意事项
在静态方法中是没有this关键字的
静态方法只能访问静态的成员变量和静态的成员方法
十三、main方法
main方法是静态的
public static void main(String[] args) {}
public 被jvm调用,访问权限足够大。
static 被jvm调用,不用创建对象,直接类名访问
void被jvm调用,不需要给jvm返回值
main 一个通用的名称,虽然不是关键字,但是被jvm识别
String[] args 以前用于接收键盘录入的