什么是向上转换 向下转换
向上转换: 忽略父类没有/不相同的方法,若 子类有重写 (方法名,参数名/数量相同,方法内部不同的叫重写),则按照子类重写的方法来实施.
向下转换:在能实现向上转换所有功能的基础上,还能调用子类非重写的方法. 有风险. 向下转型后的对象和向上转型后的对象是同一个.
三段代码
public class Animal { private int amlSum; String aml; public Animal() { this.amlSum++; } public Animal(String aml) { this.aml = aml; this.amlSum++; } public void bark() { if (aml != null) { if (aml == "dog") { System.out.println("汪汪汪!!!"); }else{ System.out.println("不存在这个动物"); } }else{ System.out.println("动物叫"); } } }
25 25
1 public
class
Animal { 2
private
int
amlSum ; 3
String
aml ; 4 5
public
Animal () { 6
this . amlSum ++ ; 7 } 8 9
public
Animal ( String
aml ) { 10
this . aml
=
aml ; 11
this . amlSum ++ ; 12 } 13 14
public
void
bark () { 15
if ( aml
!=
null ) { 16
if ( aml
==
"dog" ) { 17
System . out . println ( "汪汪汪!!!" ); 18 } else { 19
System . out . println ( "不存在这个动物" ); 20 } 21 } else { 22
System . out . println ( "动物叫" ); 23 } 24 } 25 } public class Cat extends Animal{ //重写方法 public void bark(){//重写. System.out.println("喵喵喵~"); } public void bark(int x){//注意这里的参数发生了改变,所以属于Cat的独有方法. System.out.println(x); } public void touch(){//子类独有方法 System.out.println("喵!!喵喵喵喵!!"); } }
x 16
1 public
class
Cat
extends
Animal { 2
//重写方法 3
public
void
bark (){ //重写. 4
System . out . println ( "喵喵喵~" ); 5 } 6
7
8
public
void
bark ( int
x ){ //注意这里的参数发生了改变,所以属于Cat的独有方法. 9
System . out . println ( x ); 10 } 11 12 13
public
void
touch (){ //子类独有方法 14
System . out . println ( "喵!!喵喵喵喵!!" ); 15 } 16 } public class Test3{ public static void main(String[] args){ Animal test = new Cat();//创建向上转换 test.bark(); //此时直接调用dog方法的touch();或者 // dog方法的 bark(1);都会报错 Cat test2 = (Cat) test;//向下转换 创建一个新的对象 并且强制转换后引用先前创建好的对象 test2.touch(); test2.bark(1); } }
1 public
class
Test3 { 2
public
static
void
main ( String [] args ){ 3
Animal
test
=
new
Cat (); //创建向上转换 4
test . bark (); 5
//此时直接调用dog方法的touch();或者 6
// dog方法的 bark(1);都会报错 7
Cat
test2
= ( Cat ) test ; //向下转换 创建一个新的对象 并且强制转换后引用先前创建好的对象 8
test2 . touch (); 9
test2 . bark ( 1 ); 10 } 11 } 运行结果 喵喵喵~ 喵!!喵喵喵喵!! 1
另外也可以用这种方法访问子类独有方法 ((Cat) test).touch(); ((Cat) test).bark();
2
1 (( Cat ) test ). touch (); 2 (( Cat ) test ). bark ();