1 补充题
1.对象实例化(初始化)的执行顺序。
①为子类对象分配内存空间,对域变量进行默认初始化
②绑定构造方法,将new对象中的参数传递给构造方法的形式参数
③调用this或super语句,二者必居其一,也只有一
④进行实例变量的显式初始化操作
⑤执行当前构造方法体中的程序代码
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;
}
public void fire(){ ……}
public FighterPlane(String _name,int _missileNum){ ……}
class A
{
FighterPlane fp;
public A(FighterPlane fpp){
this.fp = fpp;
fpp.setA(this);//将当前对象传给FighterPlane
}
public void invoke(){
//A中对象发送消息给FighterPlane的对象
fp.fire();
}
}
3.谈谈组合与继承的区别以及两者的使用场景(即什么时候宜用组合?什么时候宜用继承?)。
组合:通过对象内部的属性引用来实现
继承:从已有的类派生出新的类
使用场景:在不具有结构和功能上的相似性时,使用继承;在结构实现不同、功能“可叠加”时,使用组合更好
4.Java中的运行时多态的含义是什么?有什么作用?请举例说明。
运行时多态指的是覆盖,在运行时根据输入参数动态选择不同的 成员方法执行,体现了一个类本身的多态性,使代码具有良好的拓展性。
例如:
class Parent {
public int getScore(){
return 3;
}
public String getCountryName(){
return “China”;
}
}
class Son extends Parent {
public int getScore(){
return 4;
}
}
public class RunSon{
public static void main(String args[]){
Son s = new Son();
System.out.println(s.getScore());
System.out.println(s.getCountryName());
}
}
输出结果:
4
China
5.使用接口改写例6.8中的程序。
interface Shape{
abstract public double getArea();
abstract public double getPerimeter();
abstract public void show();
}
class Rect implements Shape{
private int k, m;
public Rect(int width, int height){
this.k = width;
this.m = height;
}
public double getArea(){
return (k * m);
}
public double getPerimeter(){
return (2 * (k + m));
}
public void show(){
System.out.println("Rect Area:" + getArea());
System.out.println("Rect Perimeter:" + getPerimeter());
}
}
class Triangle implements Shape{
private int x, y, z, m;
public Triangle(int _x, int _y, int _z){
this.x = _x;
this.y = _y;
this.z = _z;
this.m = (x + y + z) / 2;
}
public double getArea(){
return(Math.sqrt(m * ( m - x) * ( m - y ) * (m - z)));
}
public double getPerimeter(){
return (2 * m);
}
public void show(){
System.out.println("Rect Area:" + getArea());
System.out.println("Rect Perimeter:" + getPerimeter());
}
}
class Circle implements Shape{
private int r;
public Circle(int _r){
this.r = _r;
}
public double getArea(){
return(r * r *Math.PI);
}
public double getPerimeter(){
return(2 * Math.PI * r);
}
public void show(){
System.out.println("Rect Area:" + getArea());
System.out.println("Rect Perimeter:" + getPerimeter());
}
}
public class RunShape {
public static void main(String args[]){
Rect rect = new Rect(5, 10);
Triangle triangle = new Triangle(3, 4, 5);
Circle circle = new Circle(6);
rect.show();
triangle.show();
circle.show();
}
}
6.简述运算符instanceof的使用场景。
用以判断它左边的对象是否是它右边的类或子类的实例。