[学习笔记] Java对象和类
Java是一种面向对象语言(Object-oriented Programming,OOP);
面向对象编程
面向对象编程与面向过程编程不同,面向过程编程将模型分解为达到最终结果所需要经过的一步步过程,而面向对象编程将现实世界的事物映射为计算机中的对象;
对象和类
Class本身也是一个种数据类型,在Java中定义一个Class(类)就是定义了一种数据;
Class ClassName{ …… }
类是创建对象的模板,描述一类对象的属性和行为对象是类的实例,拥有属性和行为;
一个类可以包含多个字段,字段就是属性,用于描述类所代表的对象的特征;
通过类可以把一组数据集合到一类对象上,实现数据封装;
一个Java源文件可以包含多个类,但只能有一个public类且源文件名必须与被修饰为public的类名一致;
实例
实例是对象的实例,它是以类为模板创建的对象;
可以用模板创建多个实例,每个实例的类型相同,但属性会有差异;
每个实例互相独立,拥有各自的同名但不同数据的属性,互不干扰;
属性
属性在类中以成员变量的形式定义;
访问实例属性的方式:实例变量名.字段名;
变量可以分为:局部变量、成员变量和类变量。
局部变量:变量在方法/代码块中定义,方法结束变量也会被销毁;
成员变量 / 实例变量:
在类中的方法体之外定义且无static修饰符修饰的变量;
变量随对象创建而创建,该变量可以被类中的方法、语句块访问;
成员变量为对象所独有,不同的对象的成员变量在对象实例化时被分配至不同的内存空间;
类变量 / 静态变量:
在类中的方法体之外定义且用static修饰符的变量;
类变量为所有类对象所共享,一旦值发生改变,所有对象获取到的都是修改后的值;
成员变量 vs 类变量
定义方式不同:类变量需要用static修饰,而成员变量不用;
调用方式不同:成员变量由对象调用,类变量可以被对象调用,也可以被类调用;
存储位置不同:成员变量存储在堆内存的对象中,数据为该对象特有;
类变量存储在方法区(共享数据区)的静态区中,是对象共有的数据;
生命周期不同:成员变量的生命周期随对象的创建开始,随对象的回收而结束;
类变量的生命周期随类的加载开始,随类的消失而结束;
成员变量 vs 局部变量
声明位置不同:成员变量在类中的方法之外声明,局部变量在方法或语句块中声明;
初始值不同:成员变量若没有赋值则会根据数据类型产生不同的默认值;
局部变量则没有默认值,必须先声明并赋值后再使用;
在同一个类当中,局部变量可以与成员变量同名,但在方法和语句块中局部变量的优先级高于成员变量,要使用成员变量,需要借助this关键字来指明为当前对象调用该成员变量;
this关键字
在方法内部,可以使用隐含的this关键字,它始终指向当前实例;
若在方法中定义的局部变量与实例变量重名,在方法内调用实例变量,需要在变量前加上this关键字说明调用的是实例变量;
方法
行为在类中以方法的形式定义,方法可以分为普通方法和构造方法;
方法是语句的集合,是解决一类问题的步骤的有序组合,用于执行一个功能;
定义方法的语法:
修饰符 方法返回类型 方法名(方法参数列表){ //方法语句; return 方法返回值; }
方法包含一个方法头和一个方法体;
访问方法的方式:实例变量名.方法名(参数);
构造方法
一个类可以拥有零个或多个普通方法,但每个类都至少有一个构造方法,用于初始化类对象;
创建对象时需要同时对对象的属性进行初始化,这个任务就是由构造函数来完成的;
构造方法的名字与类名一致;
相比于普通方法,构造方法没有返回值包括void;
若没有显式定义类的构造方法,则Java虚拟机会为该类提供一个默认的无参构造方法;
若定义了有参构造函数而没有定义无参构造函数,编译器不会自动创建无参的构造函数,此时无参的构造方法必须显式的定义;
构造方法不能直接被调用,创建对象时,会通过new关键字调用构造方法;
方法参数
方法可以包含任意个参数;
通过使用参数可以给方法传递变量值;
调用方法时,必须根据参数的定义依次传递;
可变参数
定义可变参数:
类型… 参数名
可变参数相当于数组,String...names可以改写为String[] names;
创建对象
Java使用关键字new根据模板类创建对象;
Person per=new Person();
对象创建步骤:
声明 -- 声明对象的类型和对象名;
实例化 -- 使用new关键字创建对象;
初始化 -- 调用构造方法为对象进行初始化;
new关键字完成的操作:
-- 为对象分配内存空间;
-- 调用构造方法完成对象初始化;
-- 返回一个对象的引用;
对象vs引用
对象是根据类创建的具体的实例,会在内存堆中开辟一块存储空间;
引用代表了对象所存放的地址,通过将引用赋一个实例变量,就可以通过这个变量操作实例;
package
包用于对类进行分类和管理,包中可以包含多个类;
通过包名可以避免名字相同的类产生冲突;
通过包名、类名组成的完整限定名(包名.类名),编译器可以很容易定位到类;
包可以是多层结构,每层结构用 . 隔开;
包没有父子关系,不存在继承关系;
package语句
package语句放在源文件首部,用于说明源文件定义在哪个包里;
import语句
编写类的源代码时,可以通过import语句提供的路径引用其他包中的某个类从而将其导入;