Java面向对象详解---进阶篇
认识篇:https://blog.csdn.net/Rao_Limon/article/details/80208853
进阶篇:https://blog.csdn.net/Rao_Limon/article/details/80322124
终极篇:https://blog.csdn.net/Rao_Limon/article/details/80358136
一、基本介绍
对象(object) 对象是系统用来描述客观事物的一个实体&个体,每个实体都具有自己的状态(即属性。状态是名称,如身高、体重、年龄等)与行为(即方法。行为是动词、如吃饭、睡觉、玩耍等)。每个对象都有自己的唯一标识(即使两个对象的状态与行为完全一致,对象在内存的存储也会不同)。
类(class) 类是将一些、一堆、一类或一组事物(实体%个体)中相同的部分(相同的状态或行为)提取出来,形成一个抽象的模板,模板就是对这一类事物的描述(描述这一类事物的行为和状态)。
强化理解:将所有对象所具有的相同属性和相同行为提取出来,归为一类。打个比喻就是人类就是一个类,人就是一个对象,每个人都是不同的对象,彼此之间互不相等(即使是克隆也不相等,因为你就是独一无二的存在)。不同人之间都具有姓名、性别、年龄、身高等状态,也都具有吃饭、睡觉、洗澡等行为。
类与对象的关系是类是对象的抽象,而对象是类的实体。类的作用是创建实体对象,每个对象都是类的一个实例。一个类可以有N个子类,但是子类只能有一个父类。一个子类或对象可以拥有N个对象。每个对象都拥有类的行为和状态,但也允许拥有属于自己的状态和行为。
状态和行为是现实中的叫法,在Java中的叫法变成了属性和方法。所谓的实例化就是创建对象,而这个创建的过程被称为实例化。将多个对象相同的状态和行为提取出来,形成一个类,这个过程被称为抽象。
从上面的图可以看出,动物是个父类,而食草动物和肉食动物都是动物的子类,他们之下分别都是实际存在的个体,即对象。相同子类的对象之间既有相同的特征和行为(继承而来),又有自身特有的特征和行为,例如:就食草动物来说,他们像是的行为就是都吃草,但是兔子个体小能钻洞,但是牛羊就不可以。
二、对象的实例化
对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下步骤:
①、声明:声明一个引用对象变量,包括变量名称和变量的数据类型。(非常规数据类型)
②、实例化:使用关键字new创建一个对象,使用new创建对象时,如果带参数,则调用类的指定带参构造方法;若不带参数,这默认调用类的无参构造方法。
③、赋值:将new出来的对象赋值给刚才声明的对象变量。
语法:类名 变量名 = new 类名();
三、方法(method)
方法是完成某个功能的一组多种操作的语句合集,一个类中可以存在多种方法。一个方法中存在如下几种关键词。
方法的种类包括实例方法、类方法、构造方法,它们之间的区别如下。
①、实例方法:属于每个实例的方法,必须由对象来调用,方法前不加static修饰。
②、类方法:属于类的方法,使用类名调用,必须加static修饰(当然,类方法也可以通过实例来调用,但是不建议这么做),之所以通过类名来访问一些方法,是因为不耗费内存,不用创建实例。
③、构造方法是一个类创建对象的根本途径。如果一个类没有构造方法,这个类通常无法创建实例。所以,如果程序员忘记定义构造方法的话,Java编辑器会为该类提供一个默认的无参构造方法,当然,如果程序员已经定义了构造方法(无参或有参),那么Java编译器将不再提供默认的构造方法。
构造方法的特点:
①、构造方法的名称必须和类名同名
②、一个类可以存在多个构造方法,主要区别在于参数列表的参数或参数数量不同,即方法的重载。
③、构造方法没有返回类型,所以不能使用关键字return
④、构造方法可以使用private访问控制符,使外部无法调用该类的构造方法。这是后面的单例模型。
四、构造函数
构造函数是个特殊的函数,它必须和类同名,且没有返回值,专门用来初始化实例对象。所以想要实例化一个对象,就必须要实例化这个类,那么就要用到构造函数。即,告诉程序我现在要实例化一个对象了,你给我分配一块内存空间,然后将内存的首地址赋给指定的类对象。
public class StaticTest{
private String name;
private int age;
public StaticTest(){
this.name = "vincent";
this.age = 20;
}
.
.
.
}
构造函数可以存在多个参数,用于传递实例化指定的参数,例如:
public class StaticTest{
private String name;
private int age;
public StaticTest(){
this.name = "vincent";
this.age = 20;
}
public StaticTest(String name,int age){
this.name = name;
this.age = age;
}
.
.
.
}
构造函数的声明分为隐式声明和显示声明。隐式声明的前提是开发人员并没有编写构造函数,在运行时Java编译器会默认添加一个无参的够着函数。而显式声明是开发人员在编写代码时,自己加上去的构造函数。请注意:在显示声明中,无论如何,Java编译器都不会自动的添加无参构造器,倘若开发人员只编写了有参构造器,而没有编写无参构造器。当程序在实例化无参对象时,程序就会因为查找不到类中的无参构造器从而程序报错。
五、方法的重载(overload)
方法的重载就是在同一个类中允许同时存在一个或多个同名的方法。方法的名称相同,但是方法的参数必须不同,其中包括:参数的个数不同或者参数类型不同、参数的名称均不同。
传参个数相同,且参数的数据类型相同,虽然参数名不相同,但是程序无法识别调用那一个构造方法,所以程序报错。
传参个数不同,而且不存在相同参数个数、对应参数的数据类型也相同的构造方法。所以程序都能识别调用那一个构造方法,所以程序能够正常运行。这就是方法的重载
六、关键字this
this表示调用者为当前对象,所以this不能用使用在static修饰符的方法中。因为它的值是当前的对象引用,而static修饰的变量或方法是属于类的,而无法使用对象进行调用,所以this自然无法在static修饰的方法中使用。同理,super()也无法在使用static的方法中使用。
注意:this调用的时对象自身的变量或方法,而static修饰的方法,在程序编译时就被加载到内存当中,而对象只有在创建实例的时候才能产生。
七、属性(filed,也叫成员变量)
每个类都有独特的成员变量(成员变量包括类变量与实例变量),对象的状态由这些成员变量的值决定。Java中有三种变量:类变量、实例变量、局部变量。
全局变量是存在类中,方法之外的变量。而局部变量时是存在方法体内的非静变量。非类变量在创建对象的时候分配内存;类变量是在类加载时分配内存。其过程如下:
初始化的前提就是分配内存空间。非类变量的全局变量是在创建对象的时候分配内存空间的。
静态变量是在类被加载时分配内存空间,静态变量和对象没有关系,是在类被JVM初次加载时分配的。
局部变量是在对象调用自身方法时才会被JVM分配内存空间,当方法调用完毕之后,会等待JVM的垃圾回收机制进行回收。Java允许局部变量可以和成员变量同名,如果在方法中使用同名变量,则局部变量会覆盖成员变量,如果想要使用成员变量,则可使用this关键字(实例变量)或类名(静态变量)做为调用者来访问成员变量。
局部变量除了形参以外,必须要初始化之后才能使用,并且访问修饰符不能用于局部变量。定义了局部变量以后,系统并没有给局部变量进行初始化,直到程序给这个局部变量赋给初值时,系统才会为这个局部变量分配内存空间。局部变量不属于任何类或者实例,因此它总是保存在方法的栈内存中。如果局部变量是基本数据类型,则该变量直接存储在方法的栈内存中,如果是引用变量则将引用的地址存储在方法的栈内存中。
栈内存中的变量无需系统垃圾回收,随着方法或者代码块的运行结束而结束。局部变量通常只保存了具体的值或者引用地址,所以所占的内存比较小。
------ 图片以后补充 ------
END