面向对象编程
Java提供的属性
Math.PI
:接近于pi
的double
型的值,是圆的周长与圆的直径的比值。
面向过程(Procedure Oriented Programming)与面向对象(Object Oriented Programming)编程思想
它们都是一种编程思想
,面向对象
是相对于面向过程
而言的。
面向过程
,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象
,是将功能封装进对象,强调的是具备功能的对象,以类/对象为最小单位,考虑谁来做。
编程思想,是在将解决问题的方案用代码实现时的统一思路。换句话说,是编写代码时的一种统一思想。
当然,编程不一定是编写解决方案的代码,因此这里的解决方案只是用来方便理解,实际上并不局限于解决方案,总之只要是用代码来实现就是编程。
面向过程
的编程思想是指,在将一个解决方案转换为代码实现时,思想是将解决方案中的每个解决步骤分为一个个过程,通过对一个个过程的编码来完成对这个解决方案的实现。面向对象
的编程思想是指,在将一个解决方案转换为代码实现时,思想是将解决方案中的每个解决步骤及做这个步骤的对象抽离出来,通过对一个个具备解决某些解决步骤的对象的实现,来完成对这个解决方案的代码实现。
因此,面向
可以理解为在编程时的以...为基础
,面向过程
就是编程时以过程
为基础,面向对象
就是编程时以对象
为基础。
面向对象
实际上包含着面向过程
的思想,但面向过程
并不包含面向对象
的思想。
可以这样类比:比如一堆人在做各种行为,面向对象
就会将人类
抽离出来,让人类
具备所有这些行为,而人类
实现具体这些行为时会存在面向过程
的思想,就是一步步的完成这些行为,最后不同具体的人都通过人类
来生成,实现一堆人在做各种行为。
面向对象的三大特征
- 封装(Encapsulation)
- 继承(Inheritance)
- 多态(Polymorphism)
面向对象的思想概述
类和对象
类,是对一种类型的定义。
比如,可以将同时具备有五官、会说话等这些特点定义为一个类型,人类类型。
对象,也称为实例,是一个具体的存在。
比如,llluna
是一个具体的人,是属于人类
这个类的,因此具有这个类的所定义的所有内容,但这些内容的具体,五官是什么样的、会说哪种语言,是随具体的人不同而不同的。
类的实例化,就是创建属于该类的对象。
因此,类可以理解为一种模板,对象就是用具体内容填充了模板的具体的存在。
面向对象程序设计的重点是类的设计,因为具备功能的对象
是依赖于类
的,先有了具备某类功能的类
,才能有属于该类的对象,才能有具备某个具体功能的对象
。
类
设计类,就是设计类的成员。
这里主要说明两个成员(其他的成员后续学习后再补充):
- 属性:理解为这个类具备的变量,比如人这个类有年龄、姓名等。
属性
也称成员变量
或field
或域
或字段
。 - 方法:理解为一个类具备的功能,比如人这个类能说话等。
方法
也称成员方法
或函数
或method
。
创建类
的格式为:[权限修饰符] 类名{成员}
。
类的创建当前只包括两部分,类的属性创建和类的方法的创建。
1 属性的创建属性
是类
中所定义的变量,也称为成员变量
。
可以理解为,由一系列成员
构成一种类型
,通过对一个类型的成员
设计来设计出一个类
,一个类
中的成员
中的变量
就是成员变量
。
局部变量
是指定义在方法中的变量,通常所说的变量是指局部变量
,通常是说main
方法中的变量。
变量有其作用域。
- 对于
局部变量
,即属于方法中的变量,其作用域就是该方法范围内。 对于
属性
,其作用域可以从两方面讨论:类
:类本身在定义其他成员时,可以适用其属性
。对象
:该类的实例有自己的一套该类的成员,该对象可以使用其属性
。
但属性
的使用会受到权限修饰符
的限定,也就是有的属性
只能类
中的成员用,有的属性不能用,有的属性对象和成员都能用。后续补充。
实际上方法
、类
的成员
包括类
本身都有权限修饰符
,即会受到权限修饰符
的限定,主要是限定作用域
,也就是说java
中所有都有作用域。
常用的权限修饰符
包括:private
, public
, default
,protected
。后续补充。
2 方法的创建
方法本质上就是一段能够实现某种功能的代码。利用方法能够提高代码的可重用性。
定义方法的格式为:权限修饰符 [关键字] 返回值类型 方法名([参数1][,参数2][,...]){方法体}
,其中[]
表示可选部分。
- Java中规定了4种
权限修饰符
:private
,public
,default
,protecred
,权限修饰符的作用是限定作用域,这里先都使用public
,之后学习了再补充。 - Java种规定了修饰方法的
关键字
:static
,final
,abstract
,这里先不考虑,之后学习了再补充。 返回值类型
就是指该方法返回的数据的数据类型
。- 若该方法不返回数据,则表示返回空数据,这种数据类型定义为
void
。 - 若方法返回数据,则在方法体中通过
return
关键字实现返回数据,格式为return 数据
。
- 若该方法不返回数据,则表示返回空数据,这种数据类型定义为
return
关键字,是用于方法体中结束方法的,其有两种形式:return;
:这种关键字后面没有接任何数据的形式,表示直接结束方法。return 数据;
:这种关键字后面接了数据的形式,表示通过返回一个数据结束方法。
方法名
即为标识符
,满足标识符命名规则和规范即可。参数
对于任何一个方法都是可选的,有多个参数时用逗号分隔,每个参数的格式为:数据类型 参数名
。方法体
,实现功能的一段代码。方法体
中可以使用成员变量
。方法体
中不能定义方法。
对象
类的实例化就是创建对象。
对象实质上也是数据,类实质上也是类型,因此类可以理解为一种数据类型
,创建对象或者说类的实例化,实际上等同于创建一个被赋值为一个类型的对象数据的变量。
创建对象也包含声明
和初始化
两部分:
- 声明:格式为
类 变量名
; - 初始化:格式为
new 类()
。
但对于对象,通常都是声明
和初始化
同时进行,即类 变量名 = new 类();
。
创建对象后,该对象就具备了其类定义的所有内容,即该对象具有类中的属性和方法,当要对该对象所具有的某些属性赋值或者调用某些方法时,其格式为:对象.属性
或对象.方法
。
可以直接把类和其对应的对象和数组等同起来理解,类和对象等同于引用数据类型和对应的数据变量。
类中定义的属性同样具有默认值,即类的实例,或者说属于该类的对象没有对所属的类的某个属性赋值,该对象的这个属性值为该属性的默认值。
同属于一个类的两个对象,进行=
赋值操作,结果就是指针指向同一块空间,即共享一个对象数据。
对象的内存解析也等同于数组的内存解析,这里仅仅涉及变量问题,并没有说明方法。
- 对象对应的变量属于局部变量,在栈中的一个空间中。对象是
new
出来的,因此如果对象完成初始化,那么该空间存储一个内存地址,而真正的对象数据在堆
中,属于该对象的所有变量即属性,都在堆
空间中。
匿名对象
- 匿名对象本质上就是没有赋给变量的对象数据,即
new 类()
。 - 匿名对象是没有
标识符
的对象,因此对匿名对象的使用是一次性的。
总结
Java的代码是由类
构成的,本质是由变量
和方法
构成,任何变量
和方法
都有其作用域,要么由权限修饰符
限定,要么直接限定在一个方法中。
类
是一个模板,因此其中的成员变量
要么是类
设置的默认值,要么是由对象
赋值,无法通过自己调用方法
动态计算出一个值。
类
中的方法可以被其对象
所使用,因此在main
方法中出现非static
方法不能调用时,先创建对象,通过对象使用方法。
练习
普通版代码:
改进版代码: