Point2D p1; // 親クラスの変数 p1 = new Point3D(1.0,1.0,1.0); // 子クラス(Point3D)のオブジェクトを代入とできるという意味です.その後で,動的メソッド length を呼び出すと
double len=p1.length(); // 変数の型である Point2Dで定義されたlengthではなく, // インスタンスの型である Point3Dで定義された length // が呼ばれる.となります.
後半は,
Point3D p2=(Point3D)new Point2D(1.0,1.0);とすることは可能だけれども,メソッド呼び出しや変数アクセスなどをする と実行時にエラーが出るということを言っています.
class Point2D { public double x,y; public Point2D(double xx,double yy){ x=xx; y=yy; } public double length(){ return Math.sqrt(x*x+y*y); } public double distance2d(Point2D point2){ double dx=(x-point2.x),dy=(y-point2.y); return Math.sqrt(dx*dx+dy*dy); } } class Point3DName extends Point2D { // この部分を埋めなさい. } class ObjectTest8 { public static void main(String[] args){ Point3DName p1,p2,p3; p1=new Point3DName(0.0,0.0,1.0,"Point1"); p2=new Point3DName(1.0,1.0,1.0,"Point2"); p3=new Point3DName(0.0,1.0,0.0,"Point3"); System.out.println("length of "+p1.name+" = "+p1.length()); System.out.println("length of "+p2.name+" = "+p2.length()); System.out.println("length of "+p3.name+" = "+p3.length()); System.out.println("2D distance between "+p1.name+" and " +p2.name+" = "+p1.distance2d(p2)); System.out.println("2D distance between "+p2.name+" and " +p3.name+" = "+p2.distance2d(p3)); System.out.println("2D distance between "+p3.name+" and " +p1.name+" = "+p3.distance2d(p1)); System.out.println("3D distance between "+p1.name+" and " +p2.name+" = "+p1.distance3d(p2)); System.out.println("3D distance between "+p2.name+" and " +p3.name+" = "+p2.distance3d(p3)); System.out.println("3D distance between "+p3.name+" and " +p1.name+" = "+p3.distance3d(p1)); } }
解答例
class Point3DName extends Point2D { // x, yの宣言は不要 // 親クラスにないインスタンス変数zの宣言 public double z; // 親クラスにないインスタンス変数nameの宣言 public String name; // コンストラクタを定義する必要がある. public Point3DName(double xx,double yy,double zz,String nn){ // x=xx; y=yy; でも 可 super(xx,yy); z=zz; name=nn; } public double length(){ // 親クラスの length は z を見ていないので使えない. return Math.sqrt(x*x+y*y+z*z); } // 親クラスにないメソッド distance3d の宣言 public double distance3d(Point3DName p){ double dx=(x-p.x),dy=(y-p.y),dz=(z-p.z); return Math.sqrt(dx*dx+dy*dy+dz*dz); } // distance2dは親クラスの定義をそのまま使えるので宣言は不要 }