java类与对象题典_计算机等级二级Java考试辅导:“类与对象”单元综合复习

3097f42598f75d56e09fd81e4372e0b6.png

一、Java语言在提供有哪些类型的类?有什么主要的特性?

1、public公有类

由public所修饰的类称为“公有类”,该类中的成员可以被本程序包中或其它程序包中类成员方法所使用。但在一个Java源程序文件中只允许定义出一个public型的程序类;并且此时源程序的文件名应与public类的类名同名,文件扩展名为*.java。

如下示例图中的源程序文件中定义有Circle类和Point类,但只能有一个类被修饰为public类。在示例程序中是将Circle类设计为public类,则此源程序文件的文件名称为Circle.java,而Point类则不能再被设计为public类。

fd3ffb97a278a7a4151cd65e5e188a71.png

public修饰符可以应用在下面的三种方式的类定义中:

(1)方式一

public class 类名{

成员定义;

}

(2)方式二

public class 类名 extends 父类名{

继承与派生形式的成员定义;

}

(3)方式三

public class 类名 extends 父类名 implenents 接口名{

继承与派生并实现某一接口形式的成员定义;

}

2、abstract抽象类

由abstract所修饰的类称为“抽象类”,抽象类是没有具体对象的概念类。包含有抽象方法(只有方法原型定义而没有具体方法体定义的成员方法)的类,它定义了所有子类的共同属性与方法集。

在人类的语言表达中,也经常会出现一种“抽象”或者“泛泛”的概念。对这样的概念在面向对象编程语言中以抽象类的形式来描述和表达。

(1)抽象类的编程要求

1)抽象类定义体中并不是所有的成员方法都是抽象方法,如果所有的成员方法都是抽象方法,则应该将它设计为接口。因此,在Java程序中的接口其实是一种特殊的抽象类,所有方法都为抽象方法;

2)它一般应是父类并且必须被继承和派生,在派生类中应重写上层基类中的抽象方法;

3)抽象类不能实例化其对象实例,而应采用其派生类来实例化(此时执行派生类中定义出的成员方法);

4)抽象类中的抽象方法不能设计为private成员,否则在派生类中将无法重写该抽象方法。

(2)抽象类的应用示例

比如,为什么要将如下示例图所示的代码中的Point类设计为抽象类?因为从几何关系的角度来看,点是最基本的几何元素。在Point类的基础上可能会派生出其它的几何图形(如Circle圆)类,每个几何图形都需要画出,但怎么画?不同的几何图形的外观是不同,在Point类中的draw方法则无法具体功能实现。因此,Point类中的draw方法设计为抽象方法,该Point类则需要设计为抽象类。

144dff65dbbb6cdfd115afdcb5aa4cf3.png

因此,抽象类主要是为它的派生类(或者子类)提供功能实现的模板方法,不同的派生类根据自己的应用需要重新实现抽象方法。

3、final定止类

由final所修饰的类称为“定止类(终极类)”,该类不允许再被继承与派生。但其内的成员方法都可以有方法体的定义,也就是不是抽象方法。

面向对象中的继承为程序的扩展提供了有效的手段,但在某些特殊的应用环境中,某些类可能希望不需要进一步地进行功能扩展,也就是不希望该类被继承。为此,可以将有这样应用要求的类声明为final 类型的类。从而阻止对该类的继承和派生,如JDK系统库中的String类就是一个被final修饰的类,只能应用它但不用继承和扩展它。

(1)为什么要阻止类的进一步继承

类的继承关系会导致某个类产生出多级的子类,并且在子类中可以不断地改写原始基类中的方法,这将可能会导致该方法在继承的过程中会出现“不可预测”的变异或者变味、变形等形式的结果。

如果某个类的设计者自认为本类中的方法是最佳实现、或者基于安全、知识版权等考虑,不希望该类被继承,只需要将该类设计为final类。

(2)final类的应用示例

在如下示例图所示的程序代码中,将封装网络协议的网络通讯类NetCommunicate设计为final类。如果再对NetCommunicate类进行继承以派生出MyNetComm子类,但MyNetComm子类在语法检查时报告出现了错误。错误信息可以参看如下示例图所示的错误提示文字。

fd6fde5ee92a65fdbec2f27f20c01743.png

该程序不能正常地通过编译,是错误的继承方式,因为NetCommunicate类不允许再被继承。之所以要将NetCommunicate类设计为final类,是因为在网络通讯中的各种协议是标准和统一的,是不允许任何的用户可以任意地扩展和修改,否则标准将毫无意义!

如果从面向对象的角度来看此问题,由各种网络协议所集合而成的网络通讯类是可以通过继承的方式在子类中进行扩展和修改各种网络协议的规则。如何避免出现这样的逻辑问题,final类可以满足这样的应用需求。

(3)final类的编程要求

final不能与abstract组合在一起使用来修饰说明一个类,否则会相互矛盾。

abstractfinalclass Point{

private int pointX;

private int pointY;

public abstract void draw();

}

应用final类的主要目的如下:如果一个类编写得已较丰富,或基于安全性考虑,不希望派生者再对它进行派生以覆盖其特定的成员方法的应用场合。final类其实是固定的标准功能的类。

当然,final类可能有点太“过分”,可以将类中的某些成员方法设计为final方法,从而允许该类被继承扩展,但在扩展中不能重写或者替换某些方法的标准功能实现。

二、简述Java接口和C++中的虚基类的相同和不同处

1、Java语言中的接口及所表现的技术特性

由于Java语言中不允许多重继承,而有可能某个类或对象要使用分布在几个类或对象中的成员方法或成员属性,现有的Java单继承机制就不能满足这样的应用要求,而在C++语言中可以应用多重继承的关系实现。

比如,下面的概念将不能在Java语言中直接应用多重继承的关系定义出——“M籍华人”(假设类名称为Derived)不能直接从“国人基类”(假设类名称为BaseOne)和“M国人基类”(假设类名称为BaseTwo)的两个父类进行继承:

class Derived extends BaseOne , BaseTwo {

}

与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。同时应用接口可以避免C++语言中的多重继承所可能导致的子类出现的虚基类共同祖先的问题。下面的“M籍华人” (假设类名称为Derived)的概念在Java程序中可以采用如下的方式定义——“M籍华人”本质上是国人,因此继承“国人基类” (假设类名称为BaseOne);而行为是M国人的表现行为,因此实现“M国人接口” (假设接口名称为BaseInterface):

class Derived extends BaseOne implements BaseInterface {

}

当一个类实现了接口以后,该类要实现接口中所有定义的方法。并且接口中的成员属性在默认状态下面都是public static、所有方法默认情况下是public形式的。一个类可以实现多个不同的接口。

2、Java中的接口和C++语言中的虚基类的相同和不同之处

C++语言中没有提供接口的概念,而只提供有“虚基类”。Java中的接口和C++语言中的虚基类都能够表达和实现子类对多个不同父类的关联关系,但Java语言中的接口比C++语言中的虚基类在应用方面具有更大的灵活性,从而也导致它们两者之间有本质的差别。

(1)C++语言中的虚基类本质是“类”,只能应用在继承关系中和表达“父子关系”——继承会导致子类紧密耦合父类,并在多重继承关系中,子类会出现虚基类共同祖先的问题。

(2)而Java语言中的接口本质是“接口”而不是“类”,因此某个类可以实现多个不同的接口、子接口也可以继承多个不同的父接口而不会出现共同祖先的问题,还能够表达两个不存在父子关系的类在行为的相似性。

三、请说明抽象类和接口有什么本质的区别?

1、抽象类(AbstractClass)

在类的定义体中包含有抽象方法的类被叫做抽象类,它主要用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中加以具体的实现。

在编程中,不能创建出抽象类的对象实例。但可以采用抽象类进行对象声明定义,也就是定义出抽象类型的对象,并让它指向具体子类的一个实例。参看如下示例图所示的程序代码示例。

6a32e573af7ce93bf09b418f77e5458e.png

不能有抽象构造方法或抽象静态方法。抽象类的子类必须要为它们父类中的所有的抽象方法都提供对应的实现,否则它们也是抽象类(参看如下示例图所示的程序代码示例)。这样的机制可以保证某个问题在某个特定的层次中最终能够被解决(功能实现),这也符合人类对世界的认知的层次性。

6cac4c88bd754f1a75de9c3119ef9cfb.png

2、接口(interface)是抽象类的变体

在接口的定义体内,所有的成员方法都是抽象类型的方法,多继承性可通过实现这样的接口而获得。参看如下示例图所示的程序代码示例。

14055924bb70bbb6a6c900325ecd897e.png

接口中的所有方法都是抽象的,没有一个方法带有程序体(方法功能的具体实现)。参看如下示例图所示的程序代码示例及相关的错误提示信息。

16d75f51c1485739c0d589ad61f62c40.png

对某个接口的具体实现类与通过继承派生方式而创建出的派生类在应用方面有相似性,但接口的实现类不能从接口定义中继承对应的方法体,因为接口中无方法的功能实现。这也是面向对象程序设计中的“继承派生”和“接口实现”之间的本质差别,在接口中只可以定义static final类型的成员属性变量,而且需要初始化赋值(如下示例图中所示的程序,由于没有对someOneText成员属性变量初始化赋值,而产生了错误)。

a8cd7d633a88caec688a13a705c65c3f.png

当某个类如果要实现某个特定的接口时,它必须要实现接口中所声明的所有方法,否则将出现语法错误(参看如下示例图所示的程序及错误提示信息)。

be2601a48ab2aac096081151e4c27e37.png

应用instanceof 运算符可以用来决定某对象的类是否实现了某个特定的接口,参看如下示例图所示的程序代码示例。

1c442354ba79fba83de974c8d021f870.png

3、接口和抽象类在应用方面的差别

它们两者在应用方面都能够达到实现代码重用的目的,而抽象类只应用于继承关系中,派生类紧密关联基类从而导致受制于基类和紧密藕合基类;而接口可以应用于接口的实现关系中,实现类与接口不会出现紧密关联,而只是提供有相关方法的功能要求。

因此,在面向对象程序设计中倡导“尽可能应用接口,少用继承”。

8253285e2402a455e757506f972e3c7c.png

由于接口重点在于规范“功能”实现的要求,抽象类重点在于对象的“共性”。因此抽象类主要用于关系密切的对象(存在一定的“父子”血缘关系),而接口最适合为不相关的类提供通用的功能实现要求。

由于接口中的数据成员会自动成为public static final类型,因此,可以应用接口产生常量集(符号常量)。参看如下的接口定义的代码示例,可以直接采用SomeDigit.One方式应用相关的值。

b4d8e24ef7c55fb46a45ac7a6693313a.png

四、接口是否可继承接口? 抽象类是否可实现(implements)接口? 请用具体的代码示例加以说明。

1、接口不仅可以产生继承关系,而且可以形成多重继承关系

在面向对象程序设计方法,继承关系不仅仅只应用于类之间,接口之间如果存在层次性的关系,也可以产生继承关系,即接口可以继承接口;在Java语言中的接口之间的继承关系,与类之间的继承关系的差别在于接口之间可以形成多重继承关系,即一个接口可以继承两个及以上的父接口。参看如下示例图所示的程序代码示例中的someTotalInterface接口定义。

07fce929fef199daf40a0b8dc726c257.png

为什么接口可以产生多重继承关系?因为接口之间的继承只是方法的原型定义的继承,并没有继承任何的方法定义体,相同原型定义的方法只继承其中之一,不会产生方法的二义性问题。此时的接口实现类则必须实现在继承关系链中各个接口中的方法,如果出现遗漏,则会出现语法错误或者自身被设计为抽象类。

在上面的示例图所示的程序代码示例中,someTotalInterface接口分别继承someOneInterface和someTwoInterface两个不同的接口,但由于someOneInterface和someTwoInterface两个不同接口中有相同的原型定义的方法methodOne,自身也新增加一个方法methodTwo。SomeOneImple类实现someTotalInterface接口,但由于在SomeOneImple的实现类中只实现了其中一个methodOne方法,而没有实现另一个methodTwo方法,因此出现语法错误。

2、抽象类也可以实现(implements)某个接口

对接口的实现类可以是普通的类(又称为实体类、具体类,Concrete Class),也可以为抽象类。当接口的实现类为抽象类时,意味着该实现类只是实现了接口中的一部分方法(没有全部实现)或者在该实现类中又新增加了抽象方法。

在如下示例图所示的程序代码示例中,由于SomeOneImple类没有实现someTotalInterface接口中新增加的methodTwo方法,因此必须要将SomeOneImple类设计为抽象类。

bd394c2942860cf521ada5f0ac010afa.png

五、抽象类是否可继承实体类(Concrete Class)? 请用具体的代码示例加以说明。

实体类(具体类,Concrete Class)是指在类的定义体中没有抽象方法定义的功能类,实体类可以创建出对象实例,而抽象类则不能创建对象实例,并且抽象类可以继承于某个实体类。在如下示例图所示的程序代码示例中,抽象类SomeOneAbstractClass 继承于实体类ConcreteClass,在抽象类SomeOneAbstractClass中定义有methodOne抽象方法。

911d8a0a908b860519592eda8afa2262.png

当然,抽象类继承于实体类也必须要遵守继承关系中的要求——基类必须能够被继承,比如在基类中不能定义有private类型的构造方法。参看如下示例图所示的程序代码示例及出现的错误提示信息。

4d89bb91741b447d9f1347b192df8789.png

六、什么是对象?如何声明、创建和使用对象实例?请用具体的示例代码加以解释说明。

1、什么是对象

对象是面向对象程序设计方法中用来描述客观事物的一个实体(Object),它是构成面向对象程序系统的一个基本单位,也是类的一个变量。也就是说,对象是类的具体化的实例。

(1)类和对象的比较

类是定义对象的属性和操作并且在设计的时候产生的模板或蓝图,它并不真实地存在;而对象是关于类的运行时的一个具体的实例(模板或蓝图的具体化),它占用内存并且拥有一定的生命周期,它是真实存在的。

如下示例图所示的两幅汽车例图说明了类与对象之间的关系,上图为设计图纸中的汽车,没有具体存在,但它定义了即将生产(对象实例化)的汽车的属性和功能方法。从面向对象程序设计方法的角度来看,设计图纸中的汽车可以看成为汽车类(class Car{ })。

c732f455ce827574fb1c23dfb47be508.png

而上图中的汽车却是实际存在的,可驱动的真正的汽车,是某个汽车企业按照设计图纸中所定义的汽车属性和方法生产出的(创建出、对象实例化)。因此,从面向对象程序设计方法的角度来看,该汽车为汽车类的一个具体对象实例,Car someOneCar = new Car();

(2)类是定义描述、对象是实际存在

由于类只是定义描述,所定义的方法(功能)最终必须要通过某个具体的实例来真正实现。因此,为了能够完成在程序类中定义描述的某种或者某些功能,首先要产生出一个具体的对象实例。然后通过这个实例对象来调用对象内的成员方法来实现相关的功能。

(3)对象所体现出的主要特点

1)它具有特定的属性、行为和事件

2)通过对象的成员变量来维护它的属性特征

3)通过对象的成员方法来实现它的功能行为和对外的服务。

4)通过对象的事件来响应外部环境

2、对象声明的方式

类名 对象名;

如:Person yang;

3、对象的实例化

对象的实例化反映在面向对象编程中,也就是依据某个类创建出该类的一个具体的对象,而Java虚拟机则会为此对象具体地分配出对应的内存空间以存储该对象。

(1)语法规则

创建对象实例,可以有许多不同的实现方式,但最经典和最常用的方式是应用new定义符。如下为创建对象实例的语法规则:

对象名 = new 类名();

如: yang = new Person();

(2)理解使用new创建对象的三个过程

1)为对象实例分配内存空间

2)调用对象所属类中定义的构造方法,完成对对象实例的初始化

3)返回对象实例的引用

4、注意在对象编程中的如下要点

(1)在实际编程中可以将对象的声明与实例化“合二为一”

Teacher yang = new Teacher (); //未定义出构造方法时

Teacher yang = new Teacher ("Yang"); //定义出带有参数的构造方法

(2)Java中的对象只有实例化后,Java虚拟机系统才真正创建出它并为它分配出内存空间(如未实例化对象就使用它,该对象将为空对象)。如下面的示例代码:

Teacher yang;

yang.teach("Java语言程序设计");

此时的对象yang为空对象,在执行时将抛出空指针类型的异常。因为没有对它进行对象的实例化过程,该对象没有存储地址,从而导致无法定位出待调用的目标方法。

5、调用对象中的成员(类中定义的成员属性和方法)

(1)格式

对象名.成员名;(2)代码示例

yang.teach("Java语言程序设计");

6、在对象访问编程时需要注意如下的编程要点

(1)注意封装的规则

由于面向对象程序设计方法中倡导对数据“封装”的特性,成员数据(属性)一般都被设计为隐藏(也就是被设计为private成员)形式;因而不推荐采用直接访问类中的成员数据来改变对象的状态,而是通过其public型的成员方法来访问对象的成员数据。

不推荐采用如下的代码直接修改name属性:yang.name = "杨先生";而是通过方法达到此目的:yang.setName("杨先生");

(2)利用对象不能访问类中的private成员

yang.teacherAge=30; //错误,因为teacherAge在Teacher类中为private类型的成员属性变量

计算机等级二级Java考试辅导:“异常处理”单元综合复习

计算机等级二级Java考试辅导:“面向对象”单元综合复习

《Java语言程序设计》期末考试模拟试题——填空题和编程题

《Java语言程序设计》期末考试模拟试题——判断题和问答题

计算机等级二级考试辅导:“面向对象”单元题解答(第3部分)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值