1. 实验:利用IDE的debug功能给例6.4和例6.6的new语句设置断点,使用单步调试(step into/step over)跟踪子类对象实例化(初始化)的执行顺序,并总结该过程。
1.为子类对象分配空间,对域变量默认初始化。
2.绑定构造方法,将new中的参数传递给构造方法的形式参数。
3.调用this或super语句。二者必居其一,不能同时存在。
4.进行实例变量的显式初始化操作如:
public class A{
int value=4; //显式初始化
B b = new B(); //显式初始化,注意b引用了B的一个对象!
}
2. 如何实现两个对象之间互发消息,请举例说明。
class FighterPlane{
private String name;
private int missileNum;
private A a;
public void setA(A __a){
if(__a!=null){a=__a;}
}
public A getA(){
if(__a!=null){return a;}
else return null;
}
}
class A{
FighterPlane fp;
public A (FighterPlane fpp){
this.fp=fpp;//A对象拥有了FighterPlane对象的引用
fpp.setA(this);//this指代了当前的A对象
}
public void invoke(){//A中对象发消息给FighterPlane对象
System.out.println(fp.getName());
}
}
public class Run{
public static void main(String[] args){
FighterPlane ftp=new FighterPlane("su",10);
A a = new A(ftp);//产生A对象,并将ftp对象作为参数传入
a.invoke();//发送消息,产生调用关系
}
}
3. 什么时候宜用组合?什么时候宜用继承?
组合:has-a 关系
继承:is-a关系
组合体现为实现层面,继承主要体现在扩展方面,继承偏重集体,如汽车对于交通工具。组合偏重个体,某个功能对象被宿主对象看成自己的一部分,如轮子对于汽车。
4. Java中的运行时多态的含义是什么?有什么作用?请举例说明。
父类引用指向子类方法。再调用某一父类中的方法时,不同子类会表现出不同结果。
public class A(){
System.out.println("父类");
}
public class A1(){
System.out.println("子类");
}
public class AA{
public static void main(String[] args){
A a =new A1();
a.method();
}
}
5. 使用接口改写例6.8中的程序。
interface Shapes
{ public double getArea();
public double getPerimeter();
}
class Rect implements Shapes
{ private int k;
private int m;
public Rect(int k, int m){
this.k=m;
this.k=m;
}
public double getArea()
{ return(k*m); }
public double getPerimeter()
{ return(2*k+2*m);}
}
class Triangle implements Shapes
{ private int k;
private int x;
private int y;
public Triangle(int k, int x, int y){
this.k=k;
this.x=x;
this.y=y;
}
public double getArea()
{ double m=(x+y+z)/2.0;
return(Math.sqrt(m*( m-k)*( m-x)*(m-y)));}
public double getPerimeter()
{return(k+x+y);}
}
class Circle implements Shapes
{ private int m;
public Circle(int m){
this.m=m;
}
public double getArea()
//Math是java.lang包中的类,PI是静态其属性,其值为Π
{return(m* m *Math.PI);}
public double getPerimeter()
{return(2*Math.PI* m);}
}
public class RunShape extends Applet
{ Rect rect=new Rect(5,15,25,25);
Triangle tri=new Triangle(5,5,8);
Circle cir =new Circle(13,90,25);
public void paint(Graphics g)
{
//绘制矩形,输出矩形的面积和周长
g.drawRect(rect.x,rect.y,rect.k,(int)rect.m);
g.drawString("Rect Area:"+rect.getArea(),50,35);
g.drawString("Rect Perimeter:"+rect.getPerimeter(),50,55);
//输出三角形的面积和周长
g.drawString("Triangle Area:"+tri.getArea(),50,75);
g.drawString("Triangle Perimeter:"+tri.getPerimeter(),50,95);
//绘制圆,输出圆的面积和周长
g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k);
g.drawString("Circle Area:"+cir.getArea(),50,115);
g.drawString("Circle Perimeter:"+cir. getPerimeter(),50,135);
}
}
- 简述运算符instanceof的使用场景
判断对象是否为特定类的实例