0%

Java对象和类—JAVA语言基础

  • 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
  • :类是一个模板,它描述一类对象的行为和状态。
object-class

下面我们大致具体了解一下在Java中类和面向对象

面向对象概述

对象

对象是事物存在的实体,如人、书桌、计算机、高楼大厦等。

人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即静态部分动态部分

静态部分:被称为“属性”。属性包括高矮、胖瘦、性别、年龄等

动态部分:个人具备的行为(动态部分)。哭泣、微笑、说话、行走

例如,现在面临一只大雁要从北方飞往南方这样一个实际问题

1.识别这个对象的属性。对象具备的属性都是静态属性, 如大雁有一对翅膀、黑色的羽毛等

2.接着识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行、觅食等,这些行为都是这个对象基于其属性而具有的动作

3.识别出这个对象的属性和行为后,这个对象就被定义完成了。

所有的大雁都具有以上的属性和行为,可以将这些属性和行为封装起来,以描述大雁这类动物。

类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例

大雁(类)

类就是同一类事物的统称,如鸟类、家禽类、人类等

类是构造对象时所依赖的规范,如一只鸟有一对翅膀,它可以用这对翅膀飞行,而基本上所有的鸟都具有有翅膀这个特性和飞行的技能,这样具有相同特性和行为的一类事物就称为类。

类的思想就是这样产生的

类是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类

类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。

封装

面向对象程序设计具有以下特点:

  • 封装性

  • 继承性

  • 多态性

封装是面向对象编程的核心思想。将对象的属性和行为封装起来, 其载体就是类

采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据。这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。

类

继承

类与类之间同样具有关系,这种关系被称为关联。

例如,一个百货公司类与销售员类就是一个关联,学生类与教师类也是一个关联。两个类之间的关系有很多种,继承是关联中的一种。

当处理一个问题时,可以将一些有用的类保留下来,在遇到同样问题时拿来复用。

由于鸽子属于鸟类,具有与鸟类相同的属性和行为,便可以在创建信鸽类时将鸟类拿来复用

此外还需要再添加一些信鸽具有的独特属性及行为

鸽子类保留了鸟类的属性和行为,这样就节省了定义鸟和鸽子共同具有的属性和行为的时间,这就是继承的基本思想

继承性主要利用特定对象之间的共有属性

这里可以将平行四边形类看作是从四边形类中继承的。在Java语言中将类似于平行四边形的类称为子类,将类似于四边形的类称为父类或超类。

image-20220509214849547

多态

将父类对象应用于子类的特征就是多态

如果将子类的对象统一看作是父类的实例对象,这样当绘制图形时,简单地调用父类也就是图形类绘制图形的方法即可绘制任何图形,这就是多态最基本的思想。

其优点是:由于整个事件的处理都只依赖于父类的方法, 所以日后只要维护和调整父类的方法即可,这样就降低了维护的难度, 节省了时间。

多态的实现并不依赖于具体类,而是依赖于抽象类和接口

图形类作为所有图形的父类,具有绘制图形的能力,这个方法可以称为“绘制图形”,但如果要执行这个“绘制图形”的命令,没有人知道应该画什么样的图形,并且如果要在图形类中抽象出一个图形对象,没有人能说清这个图形究竟是什么图形,所以使用“抽象”这个词来描述图形类比较恰当。在Java语言中称这样的类为抽象类,抽象类不能实例化对象。在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体流程。实质上这个方法也是抽象的,如图形类中的“绘制图形”方法只提供一个可以绘制图形的标准,并没有提供具体绘制图形的流程,因为没有人知道究竟需要绘制什么形状的图形。

也就是说,父类只给出绘制图形的方法,但是不给出如何准确的画一个准确的三角形或四边形等特定图形

比抽象类更方便的方式是将抽象类定义为接口。由抽象方法组成的集合就是接口。

可能螺丝帽和螺丝钉的厂家不同,但这两个物品可以轻易地组合在一起,这是因为生产螺丝帽和螺丝钉的厂家都遵循着一个标准,这个标准在Java中就是接口。

类是封装对象的属性和行为的载体

成员变量

在Java中对象的属性也称为成员变量。

首先定义一个图书类,成员变量对应于类对象的属性,在Book类中设置3个成员变量,分别为id、name和category,分别对应于图书编号、图书名称和图书类别3个图书属性。

在项目中创建Book类,在该类中定义并使用成员变量

根据以上代码,读者可以看到在Java中使用class关键字来定义类, Book是类的名称。同时在Book类中定义了3个成员变量,成员变量的类型可以设置为Java中合法的数据类型,其实成员变量就是普通的变量, 可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。读者应该注意到在3个成员变量前面的private关键字,它用来定义一个私有成员(文章后面会介绍)

成员方法

在Java语言中使用成员方法对应于类对象的行为。以Book类为例, 它包含getName()和setName()两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法。

定义成员方法的语法格式如下:

语法格式

一个个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值,可以在方法体中使用return关键字,使用这个关键字后,方法的执行将被终止。

Java中的成员方法无返回值,可以使用void关键字表示。

权限修饰符

Java语言中的修饰符权限

当声明类时不使用public、protected和private修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以调用这个类的成员变量或成员方法。

在项目中的com.lzw包下创建AnyClass类,该类使用默认的访问权限。

由于类的修饰符为默认修饰符,即只有一个包内的其他类和子类可以对该类进行访问,而AnyClass类中的doString()方法却又被设置为public访问权限,即使这样,doString()方法的访问权限依然与AnyClass类的访问权限相同,因为Java语言规定,类的权限设定会约束类成员的权限设定

image-20220509222330617

本实例等同于

本实例等同于

局部变量

在项目中创建Book类,在该类中定义并使用成员变量

定义的Book类中,getName()方法的id变量即为局部变量。实际上方法中的形参也可作为一个局部变量,如在定义setName(String name)方法时,String name这个形参就被看作是局部变量。

局部变量是在方法被执行时创建,在方法执行结束时被销毁。

使用时必须进行赋值操作或被初始化,否则会出现编译错误

在项目中创建一个类文件,在该类中定义getName()方法并进行调用

如果将id这个局部变量的初始值去掉,编译器将出现错误

局部变量的有效范围

可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。

描述了局部变量的作用范围

在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量

如图

但是在相互嵌套的区域中不可以这样声明,如果将局部变量id在方法体的for循环中再次定义,编译器将会报错

如图

this关键字

在项目中创建一个类文件,该类中定义了setName(),并将方法的参数值赋予类中的成员变量

类中定义了setName()

在Java语言中规定使用this关键字来代表本类对象的引用嘛,this.name指的就是Book类中的name成员变量,而this.name=name语句中的第二个name则指的是形参name。

this可以调用成员变量和成员方法,但Java语言中最常规的调用方式是使用“对象.成员变量”或“对象.成员方法”进行调用

事实上,this引用的就是本类的一个对象。在局部变量或方法参数覆盖了成员变量时,如上面代码的情况,就要添加this关键字明确引用的是类成员还是局部变量或方法参数。

如果省略this关键字直接写成name = name,那只是把参数name赋值给参数变量本身而已,成员变量name的值没有改变,因为参数name在方法的作用域中覆盖了成员变量name。

this除了可以调用成员变量或成员方法之外,还可以作为方法的返回值。

在项目中创建一个类文件,在该类中定义Book类型的方法,并通过this关键字进行返回

技术分享,如果您觉得内容不错的话不妨进行打赏,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道