第三章  Java面向对象程序设计
3.1  了解面向对象程序设计的基本概念
3.2  掌握类的使用方法
3.3  熟悉对象的创建与使用方法
3.4  了解包的创建与使用方法
3.1  了解面向对象程序设计的基本概念
一、对象
现实世界中,对象(Object)就是客观存在的某一事物。一辆自行车,一台计算机,它们都可以视为对象。对象普遍具有两个特征:状态(属性)和行为。比如,小鸟有名称、体重、颜等状态和飞行、觅食等行为;同样,自行车也有品牌、外观、重量等状态和刹车、加速、减速等行为。
        在面向对象程序设计中,对象是一组数据和相关方法的集合。程序中可通过变量向其传递或获取数据,而通过调用其中的方法执行某些操作。在Java中,对象必须基于类来创建。
类是用来描述一组具有共同状态和行为的对象的原型,是对这组对象的概括、归纳与抽象表达。
      在面向对象程序设计中,可以让具有共同特征的对象形成类,它定义了同类对象共有的变量和方法。通过类可以生成具有特定状态和行为的实例,这便是对象。
        从某种程度上讲,Java编程就是设计类,在编程中可以采用自定义方法或继承方法设计一个类。此外,还可在编程时利用类来创建对象,然后改变对象变量值和调用对象方法来实现程序的某些功能。
二、类
三、封  装
封装(Encapsulation )是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证
了程序和数据都不受外部干扰且不被误用。理解封装性的一个方法就是把它想成一个黑匣子,它可以阻止在外部定义的代码随意访问内部代码和数据。对黑匣子内代码和数据的访问通过一个适当定义的接口严格控制。
封装的目的在于使对象的设计者和使用者分开,使用者不必知道对象行为实现的细节,只需要使用设计者提供的接口来访问对象。
      封装是OOP设计者追求的理想境界,它可以为开发员带来两个好处:模块化和数据隐藏。模块化意味着对象代码的编写和维护可以独立进行,不会影响到其他模块,而且有很好的重用性;数据隐藏则使对象有能力保护自己,它可以自行维护自身的数据和方法。因此,封装机制提高了程序的安全性和可维护性。
四、继承
继承是面向对象程序设计中两个类之间的一种关系,是一个类可以继承另一个类(即它的父类)的状态和行为。被继承的类称为超类或父类,继承父类的类称为子类。
一个父类可以同时拥有多个子类,这时这个父类实际上是所有子类的公共变量和方法的集合,
每一个子类从父类中继承了这些变量和方法。
      然而,子类也可以不受父类提供的状态和行为的限制。子类除了具有从父类继承而来的变量和方法外,还可以增加自己的变量和方法。子类也可以改变从父类继承来的方法,即可以覆盖继承的方法。
继承使父类的代码得到重用,在继承父类提供的共同特性的基础上增加新的代码,从而使编程不必一切从头开始,进而有效提高了编程效率。
五、多态
多态性可以用“一个对外接口,多个内在实现方法”来表示。也就是说,我们可以在一个类中定义多个同名方法,程序在调用某个方法时,系统会自动根据参数类型和个数的不同调用不同的方法,这种机制被称为方法重载。
此外,当我们利用继承由父类创建子类时,如果父类中的某些方法不适合子类,我们无法删除它们,但可以重新定义它们,这被称为覆盖。如此一来,当我们利用子类创建对象时,如果调用对象的某个方法,系统会首先在子类中查此方法。如果到,则调用子类的方法;
否则,将向上查,即在父类中查此方法。这种情况被称为父类与子类之间方法的多态性。
3.2  掌握类的使用方法
下面我们结合Java程序的格式来详细介绍类的声明方法:
package 包名      // 声明程序所在包
import 包名.*      // 导入外部包,可包含多条import语句,以导入多个外部包中的类
import 包名.类名
// 声明和定义类
[类修饰符] class 类名[extends 父类名称][implements 接口名称列表]{
    // 声明成员变量或常量
    [访问控制修饰符][static][final]<数据类型> 变量名或常量名。
……            // 定义其他成员变量或常量
    // 声明和定义成员方法
    [访问控制修饰符][abstract][static][final][native][synchronized]
        返回类型 方法名(参数列表) [throws 异常类型列表]
    {
……        // 方法体
    }
……            // 定义其他方法
}
……                // 定义其他类
解释说明:
(1)在一个Java文档中可以包含多个类,但最多只能有一个为公
          共类(即public class,也可以没有)。
(2)如果存在public class的话,该类的类名必须与文档名相同。
(3)main方法是Java应用程序的入口,如果文档中存在public
        class和main方法,则main方法必须位于public class中。
        main方法的格式如下:
    public class 类名 {
        // 成员变量列表
        public static void main(String[] args) {
            // 局部变量声明
            // 方法体
        }
    }
一、类声明
类声明定义了类的名字及其他属性。类声明的一般格式如下:
  [类修饰符] class 类名[extends 父类名称][implements 接口名称列表]{
    ……
  }
      其中,class关键字和类名是必需的,[]表示可选项。类名是要声明的类的名字,它必须是一个合法的Java标识符,习惯上首字母要大写。
1.类修饰符
类修饰符有public、abstract和final。如果没有声明这些类修饰符,Java编译器默认该类为friendly类,对于这些类,只有同一包中的类可以访问。
public(公共的):带有public修饰符的类称为公共类,公共类可以被
  任何包中的类访问。不过,要在一个类中使用其他包中的类,必须在
    程序中增加import语句 。
abstract(抽象的):带有abstract修饰符的类称为抽象类,相当于类
    的抽象。一个抽象类可以包含抽象方法,而抽象方法是没有方法体的
    方法,所以抽象类不具备具体功能,只用于衍生出子类。因此,抽象
    类不能被实例化。
final(最终的) :带有final修饰符的类称为最终类。不能通过扩展最
    终类来创建新类。也就是说,它不能被继承,或者说它不能派生子类。
2.说明一个类的父类
extends关键字用来告诉编译器创建的类是从父类继承来的子类,父类必须是Java系统的预定义类或用户已经定义好的类。一个类只能有一个父类,但一个父类可以有多个子类。
3.说明一个类所实现的接口
implements关键字用来告诉编译器类实现的接口,一个类可以实现多个接口,多个接口之间用逗号分隔,其形式为:
    implements interface1,interface2,…。
    使用接口的主要目的是为了使程序的功能描述和功能的具体实现相分离,从而使程序结构更清晰。
4.类体
类体是类功能实现的主体,是Java语句的集合。类体中一般定义三类要素:成员变量和常量、构造方法和方法。其中,成员变量和常量用来刻画对象的状态,方法用来描述对象的行为,而构造方法一般用来初始化成员变量。
1.访问控制修饰符
使用访问控制修饰符可以限制访问成员变量或常量的权限。访问控制修饰符有4个等级:private、protected、public以及默认(即不指定修饰符)。
二、成员变量与常量
成员变量或常量声明必须放在类体中,其一般形式为:
      [访问控制修饰符][static]<数据类型> 变量名。
      [访问控制修饰符][static][final]<数据类型> 常量名。
java重载
类型
private
protected
public
默认
所属类
可访问
可访问
可访问
可访问
同一个包中的其他类
不可访问
可访问
可访问
可访问
同一个包中的子类
不可访问
可访问
可访问
可访问
不同包中的子类
不可访问
可访问
可访问
不可访问
不同包中的非子类
不可访问
不可访问
可访问
不可访问
2.static变量(类变量或静态变量)
Java中包括两种类型的成员变量:实例成员变量和类成员变量,简称实例变量和类变量。如果用static关键字修饰成员变量,则该变量是一个类变量(又称静态变量)。不加static修饰的成员变量称为实例变量。
package Chapter3
class ConcentCircle{
    public static int x=100,y=100。    //定义圆心坐标变量
    public int r。        //定义半径变量
    public static void main(String args[]){
        ConcentCircle t1=new ConcentCircle()。    //创建对象
        ConcentCircle t2=new ConcentCircle()。
        t1.x+=100。        //设置圆心的横坐标
        t1.r=50。        //初始化半径变量
        t2.x+=200。
        t2.r=150。
        System.out.println("Circle1:x="+t1.x+",y="+t1.y+",r="+t1.r)。
        System.out.println("Circle2:x="+t2.x+",y="+t2.y+",r="+t2.r)。
                  }
}
三、方法的声明与实现
1.方法定义的一般形式
在Java中,方法在类体中定义。与类一样,方法的定义也包括两个部分:方法声明和方法体。
方法声明的一般形式为:
[访问控制修][abstract][static][final][native][synchronized]
    返回类型 方法名(参数列表) [throws 异常类型]{
……//方法体
}
2.方法的修饰符
方法的修饰符分为访问控制修饰符和非访问控制修饰符。方法的访问控制修饰符与成员变量的访问控制修饰符的用法是一样的 。
(1)abstract方法(抽象方法)
        带有abstract修饰的方法称为抽象方法,是指没有方法体的方法。不过,抽象方法只能出现在抽象类中。
(2)static方法(类方法或静态方法)
        方法与成员变量类似,也分为实例方法和类方法(又称静态方法)。带有static修饰符的方法称为类方法,不加static修饰的方法称为实例方法。