【云驻共创】Java面向对象编程初识与初知
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.cn/blogs/298594
- 点赞
- 收藏
- 关注作者
评论(0)