Javaオブジェクトの変換
実施例1:タイプオブジェクトタイプの概念を明確参照
まず、明確な参照型とオブジェクト型の概念
この場合、オブジェクトの新しいADHeroは、()があるが、また、広告への参照
オブジェクトが入力され、ADHeroされる
参照が入力され、ADHeroは
、一般的に参照型オブジェクトの種類は同じである
を参照し、次の変換を議論すべき問題の種類の参照型とオブジェクト型矛盾の変換の問題
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
}
}
例2:親クラスの回転のサブクラス(アップキャスト)
いわゆる変換は、場合ことを意味参照型とオブジェクト型矛盾は、唯一の変換入力する必要
型変換を時には(型変換の基本的なタイプを参照)失敗、成功します
最後に変換が成功したかどうか?あなたに区別するために非常に簡単な方法を教えるために
使用する権利として、左を、もっともらしく見えません
Hero h = new Hero();
ADHero ad = new ADHero();
h = ad;
右の広告オブジェクトはの種類によって指さ参照物理的な攻撃の英雄は、
時間左参照の型を通常のヒーローされ
、通常の物理的な攻撃の英雄として英雄に、理にかなって言いますか?理にかなって、あなたが変えることができます
すべてのサブクラスの変換親クラスは、もっともらしいです。たとえば、あなたの周りの例
アップルの携帯電話は、通常の携帯電話の使用と電話、アップルの携帯電話を継承
越純水継承された飲料は、飲料としての使用のための越純水
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
Hero h = new Hero();
ADHero ad = new ADHero();
//类型转换指的是把一个引用所指向的对象的类型,转换为另一个引用的类型
//把ad引用所指向的对象的类型是ADHero
//h引用的类型是Hero
//把ADHero当做Hero使用,一定可以
h = ad;
}
}
実施例3:親クラスロータ(ダウンキャスト)
親ロータークラス、時にはOK、時には、それがキャストされなければなりません。
その変換リスク、自分の責任を意味し、キャストします。
ときにラインそれは?
1. Hero h =new Hero();
2. ADHero ad = new ADHero();
3. h = ad;
4. ad = (ADHero) h;
3行目は、親クラスがサブクラスの順番で、できるようになる
4行目、それはロータの親クラスであるので、その回転が強いこと。
オブジェクトへの時間、この基準点はADHeroので、4行目は、それがADHero ADHeroに変換され、あなたが成功した変換することができます。
そうするために変換するとき?
1. Hero h =new Hero();
2. ADHero ad = new ADHero();
3. Support s =new Support();
4. h = s;
5. ad = (ADHero)h;
親クラスはサブクラスターンで、正常に変換することができる行4、
行5は、H、基準オブジェクトである広告ADHero参照のタイプを変換するために、サポートを指摘しました。意味的に、使用するためのサポート英雄として、物理的な攻撃の英雄を話す意味がありませんので、キャストが失敗し、例外がスローされます
以下では、分析の主要ラインの完全なコードです:
14行:ヒーローの使用などの広告は、になり
、変換後のターゲット広告に時間参照
15行:時間基準点可能な広告のターゲットに、オブジェクトをサポートする点があるかもしれない
成功する可能性がある場合に時間AD型への参照は、失敗する可能性があるように
キャストするように、換言すれば、変換結果
最終的に応じて、正常に変換することができない最終的に基準点Hオブジェクトの種類である
ことが可能であるターゲットに、この例では、H広告ポイントのでADHero型に変換すること、
行16:サポート対象として使用されるヒーローは、あろう
物体サポートに時間基準点を、変換後の
17行目:今回は、サポート対象の時間ポイントは、ADHeroタイプに変換、失敗します。
障害の症状は、異常にClassCastException型変換をスローされます
package charactor;
import charactor1.Support;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
Hero h =new Hero();
ADHero ad = new ADHero();
Support s =new Support();
h = ad; //14行
ad = (ADHero) h; //15行
h = s; //16行
ad = (ADHero)h; //17行
}
}
示例 4 : 没有继承关系的两个类,互相转换
没有继承关系的两个类,互相转换,一定会失败
虽然ADHero和APHero都继承了Hero,但是彼此没有互相继承关系
"把魔法英雄当做物理英雄来用",在语义上也是说不通的
没有继承关系的两个类,互相转换
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
APHero ap = new APHero();
// 没有继承关系的类型进行互相转换一定会失败,所以会出现编译错误
ad = (ADHero) ap;
}
}
示例 5 : 实现类转换成接口(向上转型)
引用ad指向的对象是ADHero类型,这个类型实现了AD接口
10行: 把一个ADHero类型转换为AD接口
从语义上来讲,把一个ADHero当做AD来使用,而AD接口只有一个physicAttack方法,这就意味着转换后就有可能要调用physicAttack方法,而ADHero一定是有physicAttack方法的,所以转换是能成功的。
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = ad; //10行
}
}
示例 6 : 接口转换成实现类(向下转型)
10行: ad引用指向ADHero, 而adi引用是接口类型:AD,实现类转换为接口,是向上转型,所以无需强制转换,并且一定能成功
12行: adi实际上是指向一个ADHero的,所以能够转换成功
14行: adi引用所指向的对象是一个ADHero,要转换为ADAPHero就会失败。
假设能够转换成功,那么就可以使用magicAttack方法,而adi引用所指向的对象ADHero是没有magicAttack方法的。
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = ad; //10行
ADHero adHero = (ADHero) adi; //12行
ADAPHero adapHero = (ADAPHero) adi; //14行
adapHero.magicAttack();
}
}
例7:instanceofは
主人公のinstanceofはヒーローのタイプまたはサブクラスヒーローかどうか、基準物体点を決定します
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
APHero ap = new APHero();
Hero h1= ad;
Hero h2= ap;
//判断引用h1指向的对象,是否是ADHero类型
System.out.println(h1 instanceof ADHero);
//判断引用h2指向的对象,是否是APHero类型
System.out.println(h2 instanceof APHero);
//判断引用h1指向的对象,是否是Hero的子类型
System.out.println(h1 instanceof Hero);
}
}
運動:オブジェクト変換
(成功を次のように変換さ?
、何が間違っているためにラインでない場合は?
なぜ間違っています)
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
Hero h = ad;
AD adi = (AD) h;
APHero ap = (APHero) adi; //11行
}
}