前言
为什么要用面向对象的思想设计程序呢?什么是面向对象?面向对象有哪些特征?
面向对象(面向对象编程的简称,Object Oriented Programming,OOP)是一种对现实世界理解和抽象的方法。
OOP以对象来划分系统;将属性和行为放入对象;通过呼叫对象使其执行行为来完成功能;使程序易于维护和扩展。
提示:以下是本篇文章正文内容,下面案例可供参考
一、类和对象的概念
1.对象
在编程世界中,万物皆对象。
在Java面向对象编程中,将这些对象的属性仍然称为属性,将对象具有的行为称为方法。
方法是一种动态的行为,而属性是一种静态的特征。
属性通常是名词,行为或方法通常是动词。
2.类
什么是类?
类是对具有相同属性和相同行为的对象的抽象。
通过一个类,可以创建出一个一个具体的对象,通常也被称为实例化出一个一个对象。
总的来说:
对象是具体事物,类是对一类对象的抽象。
对象有属性和行为,对象和行为由对象由对象所属的类统一描述。
从类产生对象的过程,被称为实例化。
二、Java中的类
在 Java 中,class 是用来定义类的关键字,class 关键字后面是要定义的类的名称,然后有一对大括号,大括号里写的是类的主要内容。
类的主要内容分两部分,第一部分是类的属性定义,在前面的课程中学习过,在类内部、方法外部定义的变量称为成员变量,也可以称为成员属性,或简称为“属性”。第二部分是类的方法定义,通过方法的定义,描述类(对象)具有的动态行为,这些方法也可以称为成员方法,或简称为“方法”。
创建对象:
类名 对象名=new 类名();
创建对象时,要使用 new 关键字,后面要跟着类名(构造方法名),类名后的括号内可传递构造参数。
在Java语言中,通过.操作符来引用对象的属性和方法:
对象名.属性;
对象名.方法();
封装
面向对象的基本特性:封装、继承和多态。
封装的目的是简化编程和增强安全性。
- 简化编程是指,封装可以让使用者不必了解具体类的内部实现细节,而只是通过提供给外部访问的方法来访问类中的属性和方法。
- 增强安全性是指,封装可以使某个属性只能被当前类使用,从而避免其他类或对象进行误操作。
以年龄属性为例,先用private修饰stuAge属性,然后再给该属性提供两个public修饰的、保证属性安全的访问方法(setter方法和getter方法)。
实际上,使用 setter 和 getter 的解决方案用到了一个程序设计的基本原则:逻辑代码不能写在变量中,而必须写在方法或代码块中。
三、构造方法
构造方法(也称为构造函数)是一种特殊的方法,它具有以下特点。
- 构造方法的方法名必须与类名相同。
- 构造方法没有返回类型,在方法名前不声明返回类型(包括 void)。
构造方法的语法:
[访问修饰符] 类名([参数列表]) ;
this关键字
this 是 Java 的一个关键字,它表示“指向当前对象的引用(后文简称为‘当前对象’)”。
- 区分成员变量和局部变量,避免命名的烦恼。
- 调用其他构造方法。
如何使用this调用其他构造方法?
使用this调用类中其他的构造方法,this()语句必须写在构造方法的第一行。
需要注意的是,所有的构造方法之间不能循环调用,否则会出现类似“死循环”的现象。例如以上代码,如果在最后一个构造方法的第一行也加上this(),那么三个构造方法就会无限制的彼此调用。
构造方法有一个约定:如果在定义类时没有定义构造方法,编译系统会自动插入一个无参数的默认构造方法,这个构造方法不执行任何代码。如果在定义类时定义了有参的构造方法,没有显式地定义无参的构造方法,那么在使用构造方法创建类对象时,则不能使用默认的无参构造方法。
四、对象的初始化过程
对象的初始化,实际就是先在堆内存中申请一块用于存放对象属性值的空间,然后再给这些属性值赋上默认值、程序员期望的数据或者用户指定的数据。当堆内存中的这块空间有了值以后,再在栈空间中申请一块空间并存放引用变量,然后用栈中的引用变量指向堆中的对象,最终就可以通过栈中的引用变量访问或者修改堆中的对象了。
对象初始化时的内存演变过程如下:
1.Student temp= new Student();执行时,首先需要在堆内存中申请空间,用于存放对象的实例,这片空间上成员变量的值全部为默认值:name 的值是 null、age 的值是 0……,如图所示。
2.紧接着,执行声明初始化(由设计该类的开发者指定),例如在 Student 类中private int age = -1;代表程序员希望 age 属性用值-1 覆盖默认值,如图所示。
3.初始化块初始化。
初始化块就是在类的下一级(与成员变量和成员方法同级)用一对大括号括起来的代码块,语法形式如下:
{
代码块
}
初始化块可以用来覆盖类的成员变量的值,初始化块的执行时机是发生在“声明初始化”之后,在“构造器初始化”之前。例如,如下的初始化代码,就用于给成员变量再次赋值,如图所示。
{
this.name="张三";
this.age=20;
this.sex=1;
}
4.构造器初始化,例如Student temp = new Student(“李四”, 22, 1, 4);,在默认初始化,声明初始化,初始化块之后,再使用构造器覆盖各个属性的值,如图所示。
五、重载
在同一个类中,可以有两个或两个以上的方法具有相同的方法名,但它们的参数列表不同。这种形式被称为重载(overload)。所谓参数列表不同包括以下三种情形。
- 参数的数量不同。
- 参数的类型不同。
- 参数的顺序不同。
注意,一个类的多个构造方法被视为重载,因为多个构造方法的方法名相同,而参数列表不同,符合重载的定义。