第四章 面向对象(上)
1.名词解释
构造方法:
构造方法是一个与类名相同的类方法。每当使用new关键字创建一个对象,为新建对象开辟了内存空间之后,Java系统将自动调用构造方法初始化这个对象。构造方法属于类,而不属于对象。
抽象:
抽象是从被研究对象中舍弃个别的、非本质的或与研究主旨无关的次要特征,而抽取与研究有关的共性内容加以考察,形成对研究问题正确、简明扼要的认识。
2.对象位于内存何处?声明能引用对象的实质是?
1.堆内存中。
2.从栈空间中初始化一个引用,保存对象的地址。
3.对象和基本数据类型作为参数传递时,有什么不同?
基本数据类型作为参数在方法中的传递是值传递,对象是引用传递,当对象作为参数传递时,传递的是对象的地址。
4.在自定义对象中写finalize方法,看看什么情况下finalize被调用:
package 调试;
public class Test {
private int a;
public Test(int b) {
a = b;
}
public void finalize() {
System.out.println("finalize方法被调用");
}
public static void main(String[] args) {
Test test = new Test(666);//test初始对象
System.out.println(test.a);
test = new Test(14);//test指向了别的对象,原先的test变成了垃圾
System.gc();//调用系统函数,回收垃圾
}
}
结果:
666
finalize方法被调用
5.对象在什么条件下成为垃圾?什么情况下释放垃圾对象,如何证明一个对象被释放了?
对象在没有任何引用时成为垃圾。
系统在内存不足时会释放垃圾,或者调用System.gc()函数释放。
6.final修饰符都有什么作用?
①修饰类属性,则该属性为常量
②修饰的方法为最终方法,在子类中不能被覆盖
7.static修饰的属性和方法有什么特点:
static修饰属性或方法后,属性和方法不在属于某个特定的对象,而是所有共享,也可以说是static成员不依赖某个对象,在类加载时就被初始化,且只执行一次初始化。static修饰的属性或方法,可以直接使用类名调用,而不用先实例化对象再调用。
8.Application程序执行时,为什么不能带后缀名?
java命令是执行一个类。
若写 java x.y是代表要运行 package x 中的class y 里面的 main(String[]),所以当你写 java x.class 时, 它会以为要找一个叫x的package里面的一个叫class的class。
9.ADE(声明不分配内存空间的,创建对象时才分配对应的内存空间)
第五章 面向对象(中)
1.面向对象的主要特征是什么:
①封装:是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。
②继承:是子对象可以继承父对象的属性和行为,即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。
③多态性:是指允许不同类的对象对同一消息作出响应。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2.封装是如何实现的:
①修改属性的可见性,限制访问。
②设置属性的读取方法。
③在读取属性的方法中,添加对属性读取的限制。
3.对象之间如何相互作用?作用的条件是什么?
通过封装与组合来设计,具有“高内聚,低耦合”的特点。封装是利用访问控制符来实现的,而组合则通过对象内部的属性引用来实现。
4.protected修饰符有何特点:
访问权限为包内,类内和子类。
在父类中定义的方法和成员变量如果为protected修饰的,同包中任意访问,以及只有父类声明为public时不同包的子类可以访问。
5.Object都有哪些方法:
6.重载的方法之间一般有什么关系?
两个方法的方法名一样,返回值不确定,参数的个数或者类型不一样。可以说重载的方法是一个方法的两种实现。
7.子类覆盖父类方法需要什么条件?子类中定义与父类同名的方法一定是覆盖吗?
①父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为private类型的,那么子类则无法继承,也无法覆盖。
②子类和父类的方法必须是实例方法,如果父类是static方法而子类不是实例方法,或者相反都会报错。
如果父类和子类都是static方法,那么子类重写或者覆盖父类方法。
8.封装、继承与多态在面向对象程序设计中的用途是什么?
封装使得内部实现对用户隐藏,有利于安全操作;继承可以实现对象之间的共性与特性;多态性更贴近人的使用习惯,使程序更方便。
9.设计Src和Dis两个类,Src中有一个被封装的属性,类型为int(要求为非负值),每当通过特定方法更改Src对象中的这个属性后,Dis对象都能得到通知,并向Src发消息获得此属性值。
package 调试;
class Src{
int s;
public Src(int _s){//构造函数,保证s的非负
if(_s>=0) { s = _s; }
else { s=0; }
}
public void change(Dis d){//设计一个特殊的方法来改变s的值,每次改变都会给Dis对象发通知
for(int a=1;a<6;a++) {
d.get();
s=s+a;
}
}
}
class Dis {
Src src;
public Dis(Src s) {
src = s; //this.scr=s; Dis对象中拥有了Src对象的引用
}
public void get() { //用来接收通知
Print(); //this.Print();
}
public void Print(){
System.out.print(src.s+" "); //Dis中对象发送消息给Src的对象
}
}
//main函数
public class Run{
public static void main(String[] args) {
Src src = new Src(1); //产生Src对象
Dis dis = new Dis(src); //产生Dis对象,并将Src对象引用作为参数传入
dis.src.change(dis);//发送消息,产生调用关系
}
}
结果:1 2 4 7 11