1、面向对象。(其实就是JDK中已经有被封装好的类,我们可以直接调用相应功能的方法)
面向过程:当需要实现一个功能时,每一个具体的步骤都需要亲历亲为,详细处理每个细节。
面向对象:当需要实现一个功能时,不关心具体的实现步骤,而是找一个具有该功能的人,来帮我完成。
特点:封装(将一些细节信息隐藏起来,对外界不可用)、继承和多态
封装性的体现:(1)方法就是一种封装。(2)private也是一种封装。
2、类和对象。
类:是一组属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征和行为来描述该类事物。(属性:该事物的状态信息;行为:该事物能做什么)
对象:一类事物的具体体现。对象是类的一个实例,是具体的。
关系:(1)类是对一类事物的描述,是抽象的。(2)对象是一类事物的实例,是具体的。(3)类是对象的模板,对象是类的实体。(例如:手机图纸和真实手机)
3、类的定义。
类的定义格式:
public class ClassName{
//成员变量:对应事物的属性,和定义变量基本相同,只不过位置发生变化,在类中,方法外。
//成员方法:对应事物的行为,去掉了static。
}
4、创建对象。(通常情况,一个类是不能被直接使用的,需要根据类创建一个对象,才能使用)
步骤:
(1)导包。也就是指出需要使用的类,在什么位置。
(2)创建,格式:类名称 对象名 = new 类名称();
(3)使用,分为两种情况:
使用成员变量:对象名.成员变量名;
使用成员方法:对象名.成员方法名(参数);
下图是定义类并创建对象的过程:
定义类,创建一个对象,对应的内存图:
(1)main方法入栈(压栈),声明Phone one,然后new了一个新的对象,所以在堆中分配内存给新对象(地址:0x666.),成员变量从方法区获得,并赋默认值,成员方法就直接赋予方法区中的地址值(地址:0x333)
(2)当调用成员变量赋值时,通过地址找到堆中的对应成员变量,并直接修改。
(3)当调用成员方法时,先从栈->堆->方法区->让call方法入栈->调用方法->call方法出栈(sendMessage方法相同)
定义类,创建两个不同的对象,对应的内存图:(与上面不同的是,堆中会有两个不同地址的对象被创建,其实就是每个对象引用指向了一个,与下面形成对比)
定义类,创建两个对象引用指向同一个对象空间,对应的内存图:(第二个对象引用是一个对象直接赋值的,所以指向的都是同一个对象,也就是在栈中存放的对象地址是相同的)
使用对象类型作为方法的参:左边是代码实现,右边是内存分配。首先method方法是和main方法一同定义在Demo04PhoneParam类中的。而Phone class是已经在其他java文件中定义好的类。(当一个对象作为参数,传递到方法中时,实际上传递的就是对象的地址值)
使用对象类型作为方法的返回值:跟传参一样,其实就是getPhone中的one获取了传参来的对象的地址值,然后就可以找到对应的对象,然后返回时依然把对象所在地址值返回。使main方法中的two也得到了对象的地址值(0x666)。
注意事项:
(1)如果成员变量没有赋值,那么将会有一个默认值,规则和数组是一样的。
5.成员变量和局部变量的不同。
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
(1)定义的位置不一样。(局部变量:在方法内部;成员变量:在方法外部,在类中)
(2)作用范围。(局部变量:只有方法中可以使用,出了方法就不能用了;成员变量:整个类都可以通用)
(3)默认值不一样。(局部变量:没有默认值,需要手动赋值;成员变量:有默认值,规则和数组一样)
(4)内存的位置不一样。(局部变量:位于栈内存;成员变量:位于堆内存)
(5)生命周期不一样。(局部变量:随着方法入栈而诞生,随着方法出栈而消失;成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。)
6.private的用法
一旦使用private进行修饰,那么本类当中仍然可以随意访问,但是,超出本类之后就不能直接访问。
不能直接访问,但是还有间接访问的方法。首先在private修饰的自定义类中,定义setter/getter方法(如下)。然后用声明好的 类名.setter/getter来设置(获取)变量。(命名规则必须是:setXxxx / getXxxx)
注意:
对于 getXxxx,不能有参数,返回值类型和成员变量对应。
对于 setXxxx,不能有返回值,参数类型和成员变量对应。
对于基本数据类型的boolean值,Getter方法一定要写成isXxxx的形式,setter形式不变。
7.this关键字(解决重名,适用类的成员变量)
应用场景:当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。
如果要使用本类中的成员变量,需要使用格式: this.成员变量名
注意:“通过谁调用的方法,谁就是this” (在main方法中声明People类的引用 people,然后调用了People类中的某方法,其实就是people在调用方法,那这里的this其实就是people)
8.构造方法(创建对象,当我们new一个对象时,其实就是在调用构造方法)
格式:
public 类名称(参数类型 参数名称){
方法体
}
注意:
(1)构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样。
(2)构造方法不要写返回值类型,连void也不写。
(3)构造方法是不能return一个返回值的。0
(4)如果没有编写任何构造方法,编译器会赠送一个没有参数,方法体什么事都不做的构造方法。
(5)一旦编写至少一个构造方法,那么编译器就不会赠送了。
(6)构造方法也是可以重载的。会根据不同的参数列表选择对应的构造方法,
”