Java-黑蝙蝠  
My name is mozart0
外表涩苦但留醇香于舌尖
online
Adult Dating
公告
  • 多一份自信,多一份成功!
    多看一本书,多一份机遇!
    多一次微笑,多一份快乐!
日历
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
统计
  • 随笔 - 10
  • 文章 - 0
  • 评论 - 32
  • 引用 - 0

导航

常用链接

留言簿(6)

随笔分类(10)

随笔档案(10)

相册

天气预报

常去论坛

搜索

  •  

积分与排名

  • 积分 - 37717
  • 排名 - 1193

最新评论

阅读排行榜

评论排行榜

 

        炎热的夏天,玩了大半个月,心里满愧疚的,所以打算不在放纵自己,认真地学习java。
这次复习了java的面向对象机制,主要内容有强制转型(casting)和自动转型(promotion),以及覆盖(override)的2中区别,变量覆盖和方法覆盖。下面看例子啊:

import   static  java.lang.System. * ;

class  Bat {
    
int  wing;
    
private  String color;

    
public  Bat() {
        wing 
=   2  ;
        color 
=   " red " ;
    }


    
public   void  sayHi() {
        System.out.println(
" Hi ,Bat you have " + wing + "  wings " );
    }


    
public   void  sayWhat() {
        System.out.println(
" What will i say? " );
    }


    
public  String getColor() {
        
return  color;
    }


}


class  BlackBat  extends  Bat {
    
    
int  wing; // 遮蔽了超类中的2个变量
     private  String color;

    
public  BlackBat() {
        wing 
=   4 ;
        color 
=   " Black " ;
    }
    
        
    
public   void  sayHi() {
        System.out.println(
" Hi ,Bat you have 4 wings " + wing);
    }
    

    
public   void  getName() {
        System.out.println(
" My Name is BlackBat " );
        
    }


    
//  去掉前面的注释符号 那么就改写了父类的方法 返回的是自己的颜色 即Black
    
// public String getColor(){
    
//     return color;
    
// }

}


public   class  TestAB {
    
public   static   void  main(String[] args)  {
        Bat x 
=   new  Bat();
        BlackBat y 
=   new  BlackBat();
        x.sayHi();
        y.sayHi();

        System.out.println(
" I'm Bat ,my color is  " + x.getColor());
        System.out.println(
" I'm BlackBat ,my color is  " + y.getColor());
        
// 这里调用的依然是父类的方法,返回为red,因为子类中并未改写该方法,虽然它遮蔽了color变量
        
// 如果把BlackBat 中getColor() 的注释去掉 就会显示的是Black
        
        
//  tiger中 实现和c语言类似的输出语句。
        out.printf( " I'm BlackBat , my color is %s .%n " ,y.getColor());

        System.out.println(
" Yes , I am from super " + ((Bat)y).wing + x.getColor());
        
// 和方法不同的是:强制转换可访问父类的变量
        ((Bat)y).sayHi(); // 这里虽然强制转换为父类 但是还是调用的子类的。强制转换也不能访问

        Bat z 
=   new  BlackBat(); // 自动转型 子类转换为超类    
        
// z.getName(); // 子类中虽然有这个方法 但是转型为超类后 超类中并没这个方法 cannot find symbol
    
        ((BlackBat)z).getName();
        
// 这样就对了,强制转换为子类,这种转换通常成为窄转换,即父类向子类的转换。
        
        z.sayHi();
// 因为超类中的方法被改写 所以调用的也是子类的方法
        z.sayWhat(); // 超类中的方法未被改写 所以还是调用超类中的方法
    }

}

总结:子类向父类类型的转换属于 自动类型转换
            父类向子类类型的转换属于 强制类型转换
            覆盖:分为变量覆盖和方法覆盖,如果父类变量被覆盖后,可通过强制转换成父类来访问父类的变量,还可通过super.变量名来访问。而父类的方法被覆盖后,只能通过super.方法名()来访问,不能像变量那样通过强制转换来访问父类的方法。


@ Author 黑蝙蝠 http://www.blogjava.net/blackbat

posted on 2006-07-24 18:31 黑蝙蝠 阅读(655) 评论(1)  编辑  收藏 所属分类: J2SE(基础)
评论:

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 黑蝙蝠 Powered by: 博客园 模板提供:沪江博客