概述
- 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细
节; - 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人
(对象), 来帮我做事;
特点
封装、继承、多态
类和对象
- 类:是一组相关属性和行为的集合。可以看成是一类事物的模板。
属性:该事物的状态信息;
行为:该事物能够做什么; - 类与对象的关系
- 类是一类事物的描述,是抽象的;
- 对象是一类事物的实例,是具体的;
- 类是对象的模板,对象是类的实体;
类的定义
- 格式
public class ClassName { //成员变量 //成员方法 }
一个对象的内存图解
1) Phone.class和Demo01PhoneOne.class加载进方法区;
2)main方法压栈;
3)new phone();在堆中创建phone对象,其中成员变量参考方法区引入堆中,赋默认值,而成员方法保存的是方法区中的地址值,再将
堆中phone对象的地址值返回给栈中的one变量;
4)调用one.brand;
根据one的找到堆中存放的brand变量,重新给brand赋值;
5)调用one.call(“乔布斯”);
根据one找到堆中的成员方法,根据成员方法找到方法区的方法;
将call()方法压栈;
执行完call()方法弹栈,即出栈;
6)调用one.sendMessage()跟5)一样;
7)main()方法执行完后,弹栈,程序执行结束;
两个对象使用同一方法内存图解
- 开辟两个对空间保存两个对象
两个引用指向同一对象内存图解
使用对象类型作为方法的参数内存图解
注意:当一个对象作为参数时,传递到方法当中时,实际上传递进去的是对象的地址值;
- 当在main方法中调用method方法时,method方法先压栈;
2)然后在main方法中先把one的地址值传给method的参数,即【1】;
3)然后在将地址值传给method在栈中的实际存放空间,即【2】;
4)在method方法中调用param对象(形参)时,再把地址值传给param对象(method方法里的实际对象),即【3】;
使用对象类型作为方法的返回值内存图解
注意:当使用一个对象类型作为方法的返回值时,返回值其实就是对象的地址值;
1)getPhone方法先压栈;
2) 在堆中创建Phone对象,返回地址值给one;
3) one作为返回值传递给two;
4) two和one就指向了同一片堆内存;
成员变量和局部变量的区别
- 定义的位置不一样【重要】
- 局部变量:在方法的内部;
- 成员变量:在方法的外部; - 作用范围不一样【重要】
-局部变量:只有方法当中才可以使用,出了方法就不可以再使用;
-成员变量:整个类全都可以使用; - 默认值不一样【重要】
-局部变量:没有默认值,如果想使用,必须手动进行赋值;
-成员变量:如果没有赋值,会有默认值,规则和数组一样; - 内存的位置不一样(了解)
-局部变量:位于栈内存;
-成员变量:位于堆内存; - 生命周期不一样(了解)
-局部变量:随着方法进栈而诞生,随着方法出栈而消失;
-成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失;
public void method(int num){ //方法的参数也是局部变量
int age;
System.out.println(age);//报错,局部变量age没赋初值
System.out.println(num);//不会出错,参数在方法被调用的时候,必然会被赋值;
}
三大特征之封装性
- 封装性在java中的体现
- 方法就是一种封装;
- 关键字private也是一种封装; - 封装就是将一些细节信息隐藏起来,对于外界不可见;
方法的封装
public static int getMax(int array){......};//方法的封装就是:你给我传一个数组参数进来,我就会返回你(main方法)一个最大值,
//而具体方法里是怎样执行的,你并不用关心,你也看不见怎么执行;
private关键字的封装和使用
/*
用private关键字将需要保护的成员变量进行修饰;
一旦使用了private进行了修饰,那么在本类当中仍然可以随意访问,但是超出本类范围就不能直接使用
*/
//间接访问private成员变量(超出本类范围),使用getXxx/setXxx方法;
//对于getXxx来说,不能有参数,返回值类型和成员变量对应;public int getAge{return age};
//对于setXxx来说,不能有返回值,参数类型和成员变量对应;public void setXxx(int age){age = age};
//注意:对于基本类型当中的boolean值,Get方法一定要写成isXxx的形式,set方法还是setXxx形式;
this关键字的作用
- 当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量;
- 如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名;
- 通过谁调用的方法,谁就是this;
构造方法
- 构造方法是用来创建对象的方法,当我们通过关键字new来创建对象时,其实在调用构造方法;
- 格式:
public 类名称(参数类型 参数名称){
方法体;
} - 注意事项
- 构造方法名称和所在类名称完全一样,就连大小写也要一样;
- 构造方法不要写返回值类型,连void都不写;
- 如果没有编写任何构造方法,那么编译器会自动赠送一个构造方法,没有参数,方法体什么事情都不做;public Student(){};
- 一旦编写了至少一个构造方法,那么编译器就不会赠送构造方法了;
- 构造方法也是可以进行重载的,也就是一个类中可以定义多个构造方法;
一个标准类的组成
- 所有的成员变量都需要使用private关键字修饰;
- 为每一个成员变量生成一对getXxx和setXxx方法;
- 编写一个无参数的构造方法;
- 编写一个全参数的构造方法;(全参数及包含全部成员变量)
这样的标准类也叫作:Java Bean