6.1 概述面向对象
软件工程追求的目标之一就是可维护性,主要表现在三个方面:可理解性、可测试性、可修改性。
在计算机的世界中,面向对象程序设计的思想
6.1.1 对象
对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。
人们通常会将对象划为两个部分:静态部分、动态部分。
静态部分:顾名思义就是不能动的部分,例如(高矮,胖瘦,性别,年龄等),这个被称为“属性”
动态部分:具有静态部分属性会执行的动作,例如(哭泣,说话,行走),这些个被称为“行为”。
6.1.2 类
1、类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。如鸟类、家禽类、人类等。
2、类是世间事物的抽象称呼,而对象则是这个事物相对应的实体。
3、类是封装对象的属性和行为的载体,反过来说具体相同属性和行为的一类实体被称为类。
6.1.3 封装
面向对象程序设计具有以下特点:封装性、继承性、多态性。
封装是面向对象编程的思想核心。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
6.1.4 继承
类与类之间同样具有关系,如一个百货公司类与销售员类相联系,类之间的这种关系被称为关联。关联主要描述两个类之间的一般二元关系。继承主要利用特定对象之间的共有属性。
6.1.5多态
其实将父类对应于子类的特征就是多态,多态的实现并不依赖具体类,而是依赖于抽象类和接口。
6.2 类与对象
java中定义类使用class关键字,其语法如下:
class 类的名称{
//类的成员
//类的成员方法
}
6.2.1 成员变量
在java中对象的属性也称为成员变量,成员变量的定义与普通变量的定义一样,语法如下:
数据类型 变量名称 [ = 值];
其中[ = 值]表示可选内容,即定义变量时可以为其赋值,也可以不为其赋值。
为了解成员变量,首先定义一个鸟类,成员变量对应于类对象的属性
pubilc class Bird {
String wing; //翅膀
String claw; //爪子
String beak; //啄
String feather; //羽毛
}
6.2.2 成员方法
在Java语言中,使用成员方法对应于类对象的行为。以Book类为例,它包含getName()和setName()两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法。
定义成员方法的语法格式如下:
权限修饰符 返回值数值 方法名(参数类型 参数名){
... //方法体
return 返回值;
}
6.2.3 权限修饰符
Java中的权限修饰符主要包括private、public和protected,这些修饰符控制着类与类的成员变量以及成员方法的访问,如下表:
访问包位置 | 类修饰符 | |||
private() | protected() | public() | ||
本类 | 可见 | 可见 | 可见 | |
同包的其他类或子类 | 不可见 | 可见 | 可见 | |
其他包的类或子类 | 不可见 | 不可见 | 可见 |
例如,在项目中的com.mr包中创建AnyClass类,该类使用默认的访问权限。
package com.mr;
class AnyClass{
public void doString(){
...//方法体
}
}
6.2.4 局部变量
如果在成员方法内定义一个变量,那么这个变量被称为局部变量。
局部变量在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或者被初始化,否则会出现编译错误。
public String getName () { //定义一个getName()方法
int id=0; //局部变量
setName("Java"); //调用类中其他方法
return id+this.name; //设置方法返回值
}
6.2.5 局部变量的有效范围
可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。
在互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量。
6.2.6 this关键字
this 关键字用于表示本类当前的对象,当前对象不是某个 new 出来的实体对象,而是当前正在辑的类。this关键字只能在本类中使用。例如,例6.1中图书类的setName0方法代码如下:
public void setName(String name){ //定义一个setName()方法
this.name=name; //将参数赋予类中的成员变量
}
在上述代码中可以看到,成员变量与 setName0方法中的形式参数的名称相同,都为 name,那该如何在类中区分使用的是哪一个变量呢?在 Java 语言中,规定使用this 关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法,如在上述代码中,this.name 指的就是 Bool类中的name成员变量,而this.name= name语句中的第二个name则指的是形参name。实质上,setNamel
方法实现的功能就是将形参name的值赋予成员变量name。
6.3:类的构造方法
在类中,除了成员方法外,还存在一种特殊类型的方法,那就是构造方法,构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,每当类实例化一个对象时,类都会自动调有构造方法。构造方法特点如下:
1、构造方法没有返回值。
2、构造方法的名称要与本类的名称相同。
构造方法的语句定义如下:
public Book(){
... //构造方法体
}
代码示例如下:
6.4:静态变量与静态方法
由static修饰的变量和方法被称为静态变量与静态方法。被声明static的变量和方法被称为成员变量。静态成员属于类所有,区别于个别对象,可以在本类或其它类使用类名和“.”运算符调用静态成员。语法如下:
类名.静态类成员
代码示例如下:
静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着 public、private和protected修饰符的约束。 在类中创建一个静态整数类型属性,在构造方法中让它自增,实例如下:
静态代码块的语法如下:
public class example{
static{
... //可以在这里写初始化的代码
}
}
6.5:类的主方法
主方法是类的入口点,它定义了程序从何开始。主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。主方法的语法如下:
public static void main(String[] arge){
... //方法体
}
在主方法的定义中可以看到其具有以下特性:
(1)主方法是静态的,所以如要在主方法中调用其他方法,则该方法也必须是静态的。(2)主方法没有返回值。(3)主方法的形参为数组。其中,args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数的个数。
获取主方法的参数值,代码实例如下:
public class MainDemo{
public static void main(String[] args){
for(int i = 0;i < args.length;i++){
System.out.println(args[i]);
}
}
}
6.6:对象
Java是一门面向对象的程序设计语言,对象是由类实例化而来的,所有问题都通过对象来处理。对象可以通过操作类的属性和方法来解决相应的问题。
6.1.1:对象的创建
在Java语言中,通过new操作符来创建对象,语法如下:
Test test = new Test();
Test test = new Test("a");
下面是参数表:
设置值 | 描述 | 设置值 | 描述 |
Test | 类名 | new | 创建对象操作符 |
test | 创建Test类对象 | "a" | 构造方法的参数 |
实例:
6.6.2:访问对象的属性和行为
在使用new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。对象的属性和行为在类中是通过类的成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应的获取了对象的属性和行为。
代码示例如下:
6.6.3:对象的引用
在Java语言中,尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用,引用在Java中的语法如下:
类名,对象的引用变量
例如:
People tom;
引用与对象相关联的语法如下:
People tom = new People();
上述代码中,它们的意思分别是:People~类名,tom~引用,new People~对象的实体。
实际上,真正的对象是:"new People()"这段代码,为了方便保存才创建了一个People类型、名叫tom的引用变量。既然tom是new People()的“代理人”,那么"new People()"对象能做的事,tom也能做。例如:
new People().getClass();
等价于:
People tom = new People();
tom.getClass();
6.6.4:对象的销毁
每个对象都有生命周期,但对象的生命周期结束时,分配给对象的内存地址需要被回收。在其他语言中,需要用户手动回收废弃的对象。Java拥有一套完整的垃圾回收机制,垃圾回收器会自动回收无用却占用内存的资源。