Javaの中で父類は必ず強くサブクラスに変えられますか?
1697 ワード
1親タイプ変数はサブタイプのオブジェクトを指しています。強い回転は必要ありません。
Object a=new A();
下記のコードは強く回転できません。父タイプの変数は最初はサブタイプのオブジェクトを指していません。
Object a=new A();
public class SocketTest {
public static void main(String[]args)throws Exception{
Object a=new A();
}
}
class A {
}
2親タイプの変数は、サブタイプに強く転じることができますが、親タイプの変数は、まずこのサブタイプのオブジェクトを指す必要があります。そうでないと、直接に強い転回ができないという前提があります。下記のコードは強く回転できません。父タイプの変数は最初はサブタイプのオブジェクトを指していません。
// 1
public class SocketTest {
public static void main(String[]args)throws Exception{
A a=new A();
B b=(B)a;
}
}
class A {
}
class B extends A{
}
// 2
public class SocketTest {
public static void main(String[]args)throws Exception{
Object obj=new Object();
A a=(A) obj; //
}
}
class A {
}
強回転可能な例:
// 1
public class SocketTest {
public static void main(String[]args)throws Exception{
Object obj=new A();
A a=(A) obj; //
}
}
class A {
}
// 2 , ,
public class SocketTest {
public static void main(String[]args)throws Exception{
A a0=new A();
System.out.println(a0.b.num);
Object obj=a0.clone(); //a.clone() Object , obj
A a1=(A) obj; //
a1.b.num=20;
// A a1=(A) a0.clone();
a1.b = (B) a1.b.clone();
System.out.println(a0.b.num);
System.out.println(a1.b.num);
}
}
class A implements Cloneable {
B b=new B();
public Object clone() throws CloneNotSupportedException{
Object obj=super.clone();
A aNew=(A) obj;
aNew.b=(B)b.clone();
return obj;
}
}
class B implements Cloneable {
public int num=0;
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}