欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面向对象详解---进阶篇

程序员文章站 2022-04-01 10:43:18
...

认识篇: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面向对象详解---进阶篇

        从上面的图可以看出,动物是个父类,而食草动物和肉食动物都是动物的子类,他们之下分别都是实际存在的个体,即对象。相同子类的对象之间既有相同的特征和行为(继承而来),又有自身特有的特征和行为,例如:就食草动物来说,他们像是的行为就是都吃草,但是兔子个体小能钻洞,但是牛羊就不可以。

 

二、对象的实例化

        对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下步骤:

        ①、声明:声明一个引用对象变量,包括变量名称和变量的数据类型。(非常规数据类型)

        ②、实例化:使用关键字new创建一个对象,使用new创建对象时,如果带参数,则调用类的指定带参构造方法;若不带参数,这默认调用类的无参构造方法。

        ③、赋值:将new出来的对象赋值给刚才声明的对象变量。

        语法类名 变量名 = new 类名();

 

三、方法(method)

        方法是完成某个功能的一组多种操作的语句合集,一个类中可以存在多种方法。一个方法中存在如下几种关键词。

Java面向对象详解---进阶篇

        方法的种类包括实例方法、类方法、构造方法,它们之间的区别如下。

        ①、实例方法:属于每个实例的方法,必须由对象来调用,方法前不加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)

        方法的重载就是在同一个类中允许同时存在一个或多个同名的方法。方法的名称相同,但是方法的参数必须不同,其中包括:参数的个数不同或者参数类型不同、参数的名称均不同。

        传参个数相同,且参数的数据类型相同,虽然参数名不相同,但是程序无法识别调用那一个构造方法,所以程序报错。

 Java面向对象详解---进阶篇

 

        传参个数不同,而且不存在相同参数个数、对应参数的数据类型也相同的构造方法。所以程序都能识别调用那一个构造方法,所以程序能够正常运行。这就是方法的重载

 Java面向对象详解---进阶篇

 

六、关键字this

        this表示调用者为当前对象,所以this不能用使用在static修饰符的方法中。因为它的值是当前的对象引用,而static修饰的变量或方法是属于类的,而无法使用对象进行调用,所以this自然无法在static修饰的方法中使用。同理,super()也无法在使用static的方法中使用。

 Java面向对象详解---进阶篇


        注意:this调用的时对象自身的变量或方法,而static修饰的方法,在程序编译时就被加载到内存当中,而对象只有在创建实例的时候才能产生。

Java面向对象详解---进阶篇 

 

七、属性(filed,也叫成员变量)

        每个类都有独特的成员变量(成员变量包括类变量与实例变量),对象的状态由这些成员变量的值决定。Java中有三种变量:类变量、实例变量、局部变量。

 Java面向对象详解---进阶篇

        全局变量是存在类中,方法之外的变量。而局部变量时是存在方法体内的非静变量。非类变量创建对象的时候分配内存类变量是在类加载时分配内存。过程如下 

 Java面向对象详解---进阶篇


        初始化的前提就是分配内存空间。非类变量的全局变量是在创建对象的时候分配内存空间的。

      静态变量是在类被加载时分配内存空间,静态变量和对象没有关系,是在类被JVM初次加载时分配的。

      局部变量是在对象调用自身方法时才会被JVM分配内存空间,当方法调用完毕之后,会等待JVM的垃圾回收机制进行回收。Java允许局部变量可以和成员变量同名,如果在方法中使用同名变量,则局部变量会覆盖成员变量,如果想要使用成员变量,则可使用this关键字(实例变量)或类名(静态变量)做为调用者来访问成员变量。

        局部变量除了形参以外,必须初始化之后才能使用并且访问修饰符不能用于局部变量。定义了局部变量以后,系统并没有给局部变量进行初始化,直到程序给这个局部变量赋给初值时,系统才会为这个局部变量分配内存空间。局部变量不属于任何类或者实例,因此它总是保存在方法的栈内存中。如果局部变量是基本数据类型,则该变量直接存储在方法的栈内存中,如果是引用变量则将引用的地址存储在方法的栈内存中。

       栈内存中的变量无需系统垃圾回收,随着方法或者代码块的运行结束而结束。局部变量通常只保存了具体的值或者引用地址,所以所占的内存比较小。


------  图片以后补充  ------  

END