tij学习笔记(通过代码话多态)

    多态的一般形式Father f = new Son()。通过以下这个例子来说明多态的各个知识点,如果能完全弄明白,就掌握的差不多了。

    一,向上转型的对象有以下特点,看以下代码

 

 

 


public   class  PolyTest {
    
public   static   void  main(String[] args) {
        
//  TODO Auto-generated method stub
         Poly p  =   new  Son( 1 );
         p.s 
=   0 ;
         p.p3();
         p.p2();
//        p.s1 = 0;子类的新增变量不可用
    }

}

class  Poly{
    
int  s;
    
void  p1(){
        p3();
    }
    
static   void  p2(){
        System.out.println(
" Poly " );
    }
    
    
void  p3(){
        System.out.println(
" Poly " );
    }
    
    Poly(
int  i){
        
    }
    
}
class  Son  extends  Poly{
    
int  s1;
    Son(
int  i) {
        
super (i);
    }
//     Son(int i) {
//     }必须要super继承父类
    
//     Son(){}父类没有的构造方法不能写

    
static   void  p2(){
        System.out.println(
" Son " );
    }
    
    
void  p3(){
        System.out.println(
" Son " );
    }
    
//     void p2(){
//         System.out.println("Son");
//     }static类型也要一致
   
    
}
/** Output
  *Son
  *Poly
  
*/  

 

    1,向上转型的对象不能操作子类的新增成员变量,不能使用子类的新增方法。 

    2,可以操作子类继承或者隐藏的成员变量,也可以使用子类继承或重写的方法。

    3,一定是调用重写的方法。

    二,子类覆盖的方法权限一定不能比基类小

    权限按大小排列为:public  protected friendly(默认) private。

    如果基类是final型(private默认是final型)方法,则子类重写的方法为新方法,与父类为两个方法。

    三,域与static方法

    当对象向上转型为引用时,域不存在多态。一般情况域都用private,所以这条没什么意义。

    static型方法也不具有多态性。

    四,初始化问题

   

class  Poly2{
    
void  draw(){
        System.out.println(
" Polydraw " );
    }
    Poly2(){
        System.out.println(
" Poly before draw " );
        draw();
        System.out.println(
" Poly after draw " );
    }
}
class  Son2  extends  Poly2{
    
private   int  r  =   1 ;
    
void  draw(){
        System.out.println(
" Sondraw.r =  "   +  r);
    }
    Son2(
int  r){
        
this .r  =  r;
        System.out.println(
" Son.r =  " +  r);

    }
}
public   class  PolyTest2 {
    
public   static   void  main(String[] args) {
        
//  TODO Auto-generated method stub
       Poly2 s  =   new  Son2( 5 );
//        new Son2();
//        Son2 s2 = new Son2();三种初始化情况都一样
    }

}
/** Output
  *Poly before draw
  *Sondraw.r = 0
  *Poly after draw
  *Son.r = 5
  
*/// ~

 

    由上面的代码可见,初始化过程是这样的

    1,所有域初始化为0(boolean值为false)。

    2,从基类开始调用构造器。在上面的代码中,基类调用被重写的Son2.draw()方法,并且是在Poly2构造前调用,所以r的值是0。

    3,按申明顺序调用成员的初始化方法。

    4,导出构造器的主体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值