1. 面对对象的主要特征是什么?
答:主要有封装、继承、多态;
---------------------------------------------------------------------------------------------------------------------------------
2. 封装是如何实现的?
答:封装就是利用抽象数据类型(类)将数据和基于数据的操作绑定在一起,数据被保存在抽象数据类型内部,系统只有通过被授权的操作方法才能够访问数据。
---------------------------------------------------------------------------------------------------------------------------------
3. 对象之间如何相互作用,作用的条件是什么?
答:两个对象之间是通过方法进行发消息的方式作用的,能否发送消息取决于三个条件:
(1)引用必须真实引用了特定的对象
(2)被访问对象必须定义了相应的属性或方法,否则编译不会通过
(3)被访问的属性或方法必须具有可访问的权限
---------------------------------------------------------------------------------------------------------------------------------
4. Protected修饰符有何特点?
答:当属性和方法的修饰符为protected时,在类定义层面上,访问权限为包中的类和所有的子类,而在对象层面上,则是包中的类。
---------------------------------------------------------------------------------------------------------------------------------
5. Object都有哪些方法?
答:Object是所有类的共同祖先,每个类都默认继承它,即使定义时没有写“extends Object”,也是默认存在的。在Object当中定义了许多方法,这些方法都可以被所有的子类继承。
方法名:
Object clone() :将当前对象克隆;
boolean equals(Object obj):判断两个引用是否指向同一对象,其参数不能为基本数据类型;
void finalize():对象被释放时调用;
Class getClass():获得当前对象的类对象;
int hashCode():得到一个代表对象的hashcode整数,这个整数在应用程序运行时保持不变;
String toString():得到代表这个对象的字符串;
void notify():应用于线程同步通信中唤醒等待线程;
void wait():应用于线程同步通信中的线程等待。
---------------------------------------------------------------------------------------------------------------------------------
6. 重载的方法之间一般有哪些关系?
答:重载是多态的一种表现形式,同一个类中,方法名相同,参数的列表或返回值不同,与返回类型无关。
---------------------------------------------------------------------------------------------------------------------------------
7. 子类覆盖父类方法需要什么条件,子类中定义与父类同名的方法一定是覆盖吗?
答:子类覆盖父类的方法必须满足的条件:
(1).父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为private类型的,那么子类则无法继承,也无法覆盖。
(2).子类和父类的方法必须是实例方法,如果父类是static方法而子类是实例方法,或者相反都会报错。 如果父类和子类都是static方法,那么子类隐藏父类的方法,而不是重写父类方法。
(3).子类和父类的方法必须要具有相同的函数名称、参数列表,并且子类的返回值与父类相同或者是父类返回类型的子类型(jdk1.5之后)。 如果方法名称相同而参数列表不同(返回类型可以相同也可以不同),那么只是方法的重载,而非重写。 如果方法名称和参数列表相同,返回值类型不同,子类返回值类型也不是父类返回值类型的子类,编译器就会报错。
(4).子类方法的访问权限不能小于父类方法的访问权限(可以具有相同的访问权限或者子类的访问权限大于父类)。 访问权限由高到低:public、protected、包访问权限、private。如果子类方法的访问权限低于父类,则编译器会给出错误信息
(5).子类方法不能比父类方法抛出更多的编译时异常(不是运行时异常),即子类方法抛出的编译时异常或者和父类相同或者是父类异常的子类。
子类中定义与父类同名的方法有两种情况:
(1).需要父类的方法中的参数、返回值类型、名称和子类相同。
(2).如果子类定义的方法与父类名称相同(大小写完全匹配),但参数名称不同,不是覆盖,而是重载
---------------------------------------------------------------------------------------------------------------------------------
8. 封装、继承与多态在面对对象程序设计中的用途是什么?
答:封装:使系统保持稳定性的同时,有更好的可扩展性和可维护性。
继承:可以使应用程序代码、框架代码和中间件代码进行融合。
多态:重载可以保留旧的接口方法得以保留以保障原先使用程序的稳定,同时又可增加带参数的新的重载方法以满足扩充需求,并且新增加的重载方法与原先旧方法之间存在功能复用关系;而方法的覆盖与引用替换结合,可使抽象类声明在保证消息发送同意统一性的前提下,具有消息结果执行上的相异性特点。
---------------------------------------------------------------------------------------------------------------------------------
9. 设计Src和Dis两个类,Src中有一个被封装的属性,类型为int(要求为非负值),每当通过特定方法更改Src对象中的这个属性后,Dis对象都能得到通知,并向Src发消息获得此属性值。
答:Src中的值i改变后会发消息给Dis,Dis对象都能得到通知,并向Src发消息获得此属性值。
。
代码如下:
package 第五章;
import java.util.Scanner;
class Src{
int i=0;
Dis fp;
public Src(){}
public Src(int _i,Dis fpp){
i=_i;
this.fp=fpp;
}
public void fangfa(){
if (i>=0){
System.out.println("Src:输入i="+i);
i-=1;
System.out.println("Src:i减去1并通知Dis。");
fp.invoke(this);
}
else{
System.out.println("i为非负值,输入不符合!");
}
}
}
class Dis{
int i;
Src k;
String name="i减去1。";
public void invoke(Src _kk){
System.out.println("Dis从Src得到通知并向Src发消息得到i。");
this.diao(_kk);
}
public void diao(Src _k){
k=_k;
System.out.println("Dis:"+k.i);
}
}
public class di9ti {
public static void main(String[] args){
int n;
Scanner input=new Scanner(System.in);
System.out.print("输入n=");
n=input.nextInt();
Dis ft=new Dis();
Src ftp=new Src(n,ft);
ftp.fangfa();
}
}