【云驻共创】Java面向对象编程初识与初知

举报
多米诺的古牌 发表于 2021/09/17 20:01:18 2021/09/17
【摘要】 1. Java面向对象1.1 面向过程        面向过程编程是分析出解决问题的步骤,然后使用函数把这些步骤一步步实现,重心放在完成的每个步骤上。        是按照一定顺序进行执行,其程序结构也是按照功能划分为若干个基本模块(步骤),在每个功能上都是相对独立的,而每个模块实现的具体方法则是使用子程序来进行实现的,如下图示例:        厨师炒菜==》检查食材(检查有没有十八个头的...

1. Java面向对象

1.1 面向过程

        面向过程编程是分析出解决问题的步骤,然后使用函数把这些步骤一步步实现,重心放在完成的每个步骤上。

        是按照一定顺序进行执行,其程序结构也是按照功能划分为若干个基本模块(步骤),在每个功能上都是相对独立的,而每个模块实现的具体方法则是使用子程序来进行实现的,如下图示例:

        厨师炒菜==》检查食材(检查有没有十八个头的鲍鱼、检查有没有极品刺身。。。)==》没有就再去市场买(买鲍鱼、买澳龙。。。)==》洗菜(洗青菜、洗萝卜。。。)==》开火(打开燃气阀、扭动点火按钮。。。)==》炒菜(大火爆炒、小火煸炒。。。)==》出锅装盘(小炒装小盘、炖菜装盆。。。);

1.2 面向对象

       构成问题事物分解成各个对象,描述某个事物在整个解决问题的步骤中的行为。

       是把数据以及对数据的操作放在一起,作为一个相互依存的整体,程序流程实现由使用者在使用的过程中进行具体定义,如下图示例:

       厨师炒菜==》将这件事分为三个方面去做(厨师、采购员、厨具)

       厨师包含检查食材和炒菜的责任;

       采购员包含选菜和买菜的责任;

       使用厨具来完成洗菜、切菜和备菜的任务;

       这样各司其责,互相通过信息来进行沟通交互,每个方面可以在完成的时候自行定义各自的具体实现;

1.3 面向过程和面向对象的区别

       面向过程是步骤,是按部就班的解决问题;面向对象关注的是解决问题所关注的对象;面向过程是自己办事,面向对象是托人办事。

1.4 类和对象

1.4.1 类的定义

       类是对象抽象产生出来的模板,如果对同类对象抽象出其中的共性就形成了用于描述一类对象的行为和状态

1.4.2 对象的定义

       对象是具体的,是通过这一系列抽象出来的类模板,进行自定义的填充而形成的实例。

       例1:人具有身高,体重,年龄,血型性别等一些特征,人会劳动,会行走,会吃饭等这些方法,人仅仅是一个抽象的概念,它是不存在的实体,但是所有具备人这个群体的属性与方法的对象都叫做人,其中人就是抽象出来的类模板而具体的某张三、李四、小助手。。。是实际存在的实体即为对象因此我们可以总结出来每个人具体的人,张三、李四、小助手。。。都是人这个群体的一个对象。


1.4.3 Java的类和对象的创建

对象的创建过程,必须先有类,然后通过类创建对象,格式是:类名 对象 = new 类名();,例如:Person person = new Person();。

       如下图是先创建了一个Person类,再在main函数中(主函数)进行new操作,即创建对象(对象都有了,那还不想干啥干啥嘛~),给她起了名字、给她设置个身高、设置个年龄,这些都是对象的属性而设定具体值的过程是给对象的属性进行赋值。

1.4.4 new关键字

       从上面的例子我们可以知道new关键字,可以通过类来创建对象,表示具体的实例化对象以及申请内存空间,下图为创建对象的过程与内存空间之间的表现:

       首先是person在栈内存中被声明,然后通过new关键字,在堆内存申请开辟内存空间,并且实例化赋初始值(age=0,name=null),最后给对象的属性赋值(person.name=“小张”;person.age = 20;)

       如果我们创建了多个对象,在内存中是如何表现的呢?只要通过new关键字创建对象了,就会在堆内存开辟一个新的内存空间,因此他们之间的值是相互隔离的,互相不影响的,如下图所示:


1.5 实例变量和静态变量

1.5.1 实例变量

       (1) 声明在一个类中,但在方法、构造方法和语句块之外。

       (2) 无static关键词修饰;

       (3) 数值类型的默认值为0;

       (4) 布尔类型的默认值false;

       (5) 引用类型的默认值为null;

       (6) 实例变量属于该类的对象,必须产生该类对象,才能进行调用;

       其中age、name、flag就是实例变量。


1.5.2 静态变量

       独立于方法之外的变量,用static关键字修饰,也叫类变量。

       注:方法中的变量叫做局部变量不能用static修饰;

1.5.3 静态变量和静态变量何时设置

       属于所有对象所共享的公共属性的就设置为静态变量,属于具体对象的个性化的属性就设置为实例变量。

1.6 匿名构造块和构造函数

1.6.1 构造函数

       Java构造函数也叫构造方法是Java中特殊的函数,没有返回值并且函数名和类名保持一致。new对象产生后,就调用了对象的属性和方法,一般来初始化成员属性和成员方法。

1.6.1.1构造函数的格式

       (1)修饰符 类名(参数列表){}    

       (2)类名 (参数列表){}

       其中参数列表可有可无,无参数列表的构造函数为默认构造函数,无论有参还是无参的构造函数都不能有返回值,但是可以有return;关键字(后面不能跟具体的值);


1.6.1.2构造函数注意事项

       (1)构造函数不能手动调用,是对象被创建的时候JVM调用的;

       (2)如果一个类没有构造函数,JVM在编译的时候回默认的添加一个无参的构造函数;

       (3)如果定义了构造函数,JVM不会再创建无参构造方法;

       (4)创建对象的时候,所需要的参数需要与构造函数中的参数一一对应,构造函数里有几个参数就要提供几个参数;

       (5)构造函数可以调用构造函数;(金糊涂银糊涂我家有个老老糊涂。。。O(∩_∩)O哈哈~)

1.6.2 匿名构造块

       构造代码块的格式:{具体代码}

       代码块的作用是用于对象统一初始化;

       对象创造(调用构造函数)之前都会执行这个代码块;

1.6.3 构造函数重载

       构造函数重载是多态的一个典型的特例,其中类中有多个构造函数并且参数列表不同,重载的构造函数用来表达对象的多种初始化行为,格式如下图:


1.7 方法的定义和调用

1.7.1 方法的定义

       方法是类或对象的行为特征的抽象;

       Java中方法不能单独存在,必须存在在类中(有了人,才能有人吃饭、睡觉、发博客这些动作);

       语法格式:

       权限修饰符 返回值类型 方法名 (参数列表){

              //方法体

              //返回值

       }

1.7.2 方法定义的注意事项

       (1)方法定义的先后顺序是不影响调用的;

       (2)方法定义不能产生嵌套包含关系,即在方法的内部不能再定义别的方法;

       (3)方法定义中的返回值与传递的参数类型均为Java中定义的数据类型;

       (4)在方法中可以进行返回数据的处理,格式:

       return:返回数据类型(必须和方法声明的类型保持一致);

       void:不返回数据类型;

1.7.3 方法调用

       (1)方法定义后,不会自动执行,如果需要执行,必须进行调用(大鱼大肉就在那里,不做不叫外卖,咋能进肚子嘛~);

       (2)本类的方法调用格式是:方法名(参数列表);

       (3)外部类的方法调用格式是:调用类的对象.方法名(参数列表);

1.7.4 构造函数和普通方法(函数)的区别

       构造函数是初始化对象的,普通函数是描述事物的公共行为的。

1.8 方法的重载和编译时多态

1.8.1 方法的重载

       一个类中如果有多个方法名称相同(与修饰符无关),并且参数列表不同,返回值类型不同,这类形式称为方法的重载,即同一个方法不同的使用形式得到不同的实现结果(一虾多吃的既视感),如下图示例:

1.8.2 编译时多态

       方法重载也叫编译时多态。

       为什么这样叫呢?因为方法重载是早期绑定完成的,如果去调用一个重载的方法,那么在编译时就会根据参数列表来确定具体使用的方法。

       而早期绑定就是指被调用的目标方法如果在编译期(编译成.class文件)可以确定,且运行期(运行编译后的.class文件)保持不变时,即可将这个方法与所属的类型进行绑定,即早期绑定。

1.9 面向对象的封装

1.9.1 封装

       封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

1.9.1.1封装的原则

       将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

1.9.1.2封装的好处

       提高数据访问的安全性,隐藏了实现细节;

       从数据安全角度考虑没有封装,在外部类中就可以直接访问,并且修改数据,造成数据的不安全性;

1.9.1.3封装的实现

       可以对需要隐藏的属性增加private修饰词(变成私有的),外部不能直接修改,然后提供公共的修改方法(当然在里面会设置自定义的条件),外部类通过这个公共方法,在满足条件的情况下才会修改私有的属性,如下图示例:

1.9.1.4封装的机制

       即该露的露,该藏的藏。

       程序设定追求的是“高内聚,低耦合”(各干各的,如果你想参合,我给你提供工具啊~);

       高内聚就是类的内部数据操作细节自己完成,不允许外部干涉(能够完美形成一个整体);

       低耦合就是仅暴露方法给外部使用(互不干扰);

       注:应禁止直接访问一个对象中数据的实际表示,而是通过操作方法来访问(数据的隐藏)。

1.10 this关键字

       this关键字代表当前对象的一个引用,而所谓当前对象,指的是调用类中的方法或属性的对象。

1.10.1 this访问本类属性

       this只能在方法内使用,表示对“调用方法的对象”的引用;

       this.属性名,表示本对象自己的属性。

       下面示例,即表示为p1.name = 小张;p1.age=20;p2.name = 小李;p2.age=22;可以看出this指代的是调用各自有参构造方法的对象的引用。

1.10.2 this调用方法

       this(参数列表)表示调用本类的构造函数,参数列表为空时表示调用无参构造函数,并且this关键字必须位于构造函数的第一行;

       this.方法名(参数列表)表示调用当前对象自己的方法。

1.10.3 this使用注意事项

       this不能用于静态方法和静态快,由于main方法也是静态的,所以this也不能用于main方法,只能在实例方法中使用。

1.11 static关键字

1.11.1 静态变量

       由static关键词修饰的变量也称为静态变量或者类变量(从名字可以看出静态变量是属于类的),被所有的对象所共享,在内存中只有一个副本,当且仅当类初次加载时会被初始化(意味着最先被初始化),通过类名就可以直接调用(建议使用),也可以通过对象名.静态变量名进行调用。

1.11.2 静态方法

       由static关键词修饰的方法叫做静态方法也叫做类方法。需要注意如下几点:

       (1)在静态方法中不能直接访问类的非静态成员变量和非静态成员方法,即不能直接去访问实例方法和实例变量,只能通过创建类的对象来进行访问;

       (2)静态方法中不能使用this关键字;

       (3)通过类名可以直接调用静态方法(建议使用),也可以通过对象名.静态方法名进行调用。

1.11.3 静态块

       静态代码块在类加载时执行并且只执行一次,在类中可以有多个静态代码块(按照顺序执行),并且静态代码块中不能有this关键字。

1.11.4 静态块、匿名构造块、构造函数的执行顺序

       他们的执行顺序为:静态代码块最先执行并且无论创建多少次该类对象都只调用一次,接着调用匿名构造块,最后调用构造方法,并且每次创建对象的时候都会调用一次匿名构造块和构造方法。

       

1.12 类的生命周期和设计

1.12.1 java的一个类的生命周期

       (1)加载:是将源文件编译成.class文件,JVM将.class文件中的二进制数据读入内存,放于方法区,并且在堆中创建class对象;(2)验证:验证字节码格式是否正确、变量和方法是否有重复、继承和实现是否符合标准;

       (3)准备:为类的静态变量分配内存并设置初始值;

       (4)解析:接口名、字段名、方法名解析成内存地址方便调用;

       (5)初始化:执行静态变量初始化和静态代码块并初始化自定义的变量值;

       (6)使用:分为直接引用(会触发类的初始化,比如new一个实例对象、访问和设置静态变量、访问类的静态方法、反射、启动类的入口main方法)和间接引用(引用常量、定义数组);

       (7)卸载:java中不存在该类的任何实例,已经被GC回收,无法在任何地方通过反射来访问任何方法;

1.12.2 类的设计和分析

       下面是几个类设计的实践案例:

       学生类设计和实现:


       教师类设计和实现:




       课程类设计和实现:

       成绩类设计和实现:


1.13 java的方法参数和值传递

1.13.1 java的方法的参数类型

       方法参数的类型分为基本类型和引用类型。

       基本数据类型,传过来的是这个参数的一个副本,对原来的值是没有影响的;

       引用类型传过来的是这个引用参数的副本,这个副本存放的是参数的地址。

       

       

       下图中为可变参数列表,其中int...a为可以传0个参数,也可以传多个参数。

       注:可变参数列表只能有一个,如果有多个参数时只能放在末尾。

1.13.2 Java参数传递基本数据类型和引用数据类型的区别

       本文整理自华为云社区内容共创活动《科普教程内容输出:Java面向对象编程 》,《【内容共创系列】中秋月圆至,人间好时节——签约作者征集令,推荐/参与活动有奖https://bbs.huaweicloud.com/blogs/298594

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。