Java核心技术-对象与类

一.面向对象程序设计概述

类:构造对象的模板或蓝图

封装:数据隐藏。将数据和行为组合在一个包中,并对对象的使用者隐蔽了数据的实现方式。

           封装给对象赋予了“黑盒”特征,提高了重用性和可靠性。

更改器方法:对实例域做出修改的方法。如set和add方法就是修改对象的状态。

访问器方法:仅访问而不修改实例域的方法。如get方法仅查看并返回对象的状态。

继承:通过扩展一个类来建立另外一个类的过程。

对象的三个特征:行为、状态、标识。状态的改变必须通过调用方法实现。

 

二.使用预定义类

使用对象:1.构造对象,2.指定其初始状态,3.对对象应用方法

注意:一个对象变量是引用一个变量,并没有实际包含一个对象。对象变量的值是对存储在另一个地方的一个对象的引用。

实例程序:可以使用类的接口解决复杂问题,而不必知道其中的实现细节。

 

三.用户自定义类

1.在一个源文件中,只能有一个公有类public,且文件名必须与公有类的名字相匹配,但可以有任意数目的非公有类private。

public数据域允许任何方法对其读取修改,若这样会破环封装。因此建议将实例域标记为private。

2.构造器与方法有个重要的不同,即构造器总是伴随着new操作符的执行被调用,而不能对已经存在的对象调用构造器来重新设置实例域。注意:在构造器中不能定义与实例域重名的局部变量。

3.方法的参数可以是隐式参数或者显式参数,隐式参数是出现在方法名前的类对象,关键字this就可以表示隐式参数,这样可以将实例域与局部变量明显区分开;显示参数则是位于方法名后面括号中的数值。

4.封装,通过独立的域访问器、域更改器来获得或设置实例域的值。虽然比提供一个简单的公有数据域复杂,但却有着以下优点:1.可以改变内部实现,除了该类的方法之外,不会影响其他代码。2.更改器方法可以检查错误,若域值出现错误,只要调试该方法就可以了,而直接对域赋值就不能进行这些处理。

独立的域访问器,一旦在构造器中设置完毕,就没有任何一个方法可以对其进行修改,就可以确保域不会受到外界的破坏。

5.final修饰符一般应用于基本类型域或不可变类的域。

    a.final既可用在静态变量又可用在非静态变量。

    b.final的值一旦被赋值就不能更改。是常数,常数的名称要都是大写的。

    c.final的method不能被覆盖过。

    d.final的类不能被继承过,即不能创建它的子类。

     static{
           DOG_CODE = 420;         //final的静态变量值必须在声明或静态初始化程序中赋值
      }

 

四.静态域与静态方法:

    1.在静态Math类中,方法都是静态的,它们都不需要实例变量值,不需要对象,用到的只有它的类本身;非静态的方法必须以某种实例来操作。

    2.静态方法以类的名称来调用,非静态方法是以引用变量的名称来调用。可以以引用变量的名称来调用静态方法,但不可以以类的名称来调用非静态方法。

Math.min(13,14);          //调用静态方法

Song t2 = new Song();
t2.play();                     //调用非静态方法

    3.静态的方法不能调用非静态的变量、非静态的方法。main()方法就是静态的。

    4.静态变量是每个类一个(共享),实例变量是每个实例一个。

 

五.对象构造

1.重载:若多个方法有相同的名字、不同的参数,便产生了重载。Java允许重载任何方法,因此描述方法时一定要指出方法名和参数类型。

2.对于局部变量必须要初始化;对于域可以允许不初始化,若未初始化域,将会被初始化默认值:数值为0、布尔值为false、对象引用为null。

3.对于构造器,若没有写任何构造函数,系统会提供一个无参数的构造器;若已经写了一个带参数的构造器,但还需要一个无参数的构造器,则需要自己再写一个,系统不会提供无参的构造函数了。

4.实例域初始化,在执行构造器之前,先执行赋值操作,初始值不一定是常量。

5.a.this引用方法的隐式参数;b.用this()调用另一个构造器:若构造器的第一个语句使用this(),那么这个构造器将调用同一个类的另一个构造器,这样对公共构造器代码部分只编写一次即可。

6.实例域的初始化方法:方法a.在声明中赋值;方法b.在构造器中设置值;c.初始化块。

只要构造类的对象,先运行初始化块,然后才运行构造器的主体部分。通常将初始化块代码放在构造器中。

对有初始化的构造函数的调用的具体步骤:(1)所有数据初始化为默认值;(2)按出现的次序,依次执行域初始化语句和初始化块;(3)若构造函数第一行用this()调用另一个构造器,则执行第二个构造器主体;(4)再执行这个构造器主体。

7.静态域的初始化:可以使用静态的初始化块static(),在类第一次加载的时候,将会进行静态域的初始化。

 

六.包

1.包将类组织起来。一个类可以使用所属包中的所有类,和其他包中的公有类。

2.如何访问另一个包中的公有类:方式(1).在每个类名之前添加完整的包名;方式(2).使用import语句。注意:只能使用星号(*)导入一个包,而不能使用import java.*或import java.*.*导入以java为前缀的所有包。

3.import语句不仅可以导入类,还可以导入静态方法和静态域。

4.若要将一个类放入包中,就必须将包的名字放在源文件的开头,定义类的代码之前。若没有以上操作,则这个类就被放置在一个默认包中。

5.类路径必须与包名匹配。类存储在文件系统的子目录中,也可以存储在JAR(Java归档)文件中。

 

类设计的技巧:

(1)要保证数据私有。不能破坏封装性。

(2)要对数据初始化。

(3)不要在类中使用过多的基本类型。可以用其他类来代替多个基本类型的使用。

(4)并不是所有的域都需要独立的域访问器和域更改器。

(5)可以将职责过多的类进行分解。

(6)类名和方法名要能体现它们的职责。

posted @ 2021-05-06 11:16  Xiarsu  阅读(83)  评论(0)    收藏  举报