java基础

JAVA的覆盖、继承和多态的详细解说.this和super的用法

2010-05-27 16:30

JAVA的覆盖、继承和多态的详细解说.this和super的用法
关键字: java 覆盖 多态 继承 this super 
Java代码 
1. 继承:   
   (1)子类的构造方法一定会调用父类的构造方法。   
   (2)任何子类构造方法第一行肯定是this();或者super();两个择一。   
   this();调用本类的其它构造方法。(传递相应参数调用相应的方法)   
   super();调用父类的构造方法。   
2. 覆盖:   
    子类覆盖父类前提:   
   (1) 同名,同参数列表,同返回类型。   
   (2) 子类覆盖后的方法的访问权限只能比父类相同或者更宽广。   
   (3) 子类覆盖后的方法抛出的异常不能比父类更宽广。   
   (4) is-a:指继承。   
      has-a:指类实例具有对另一个实例的引用。   
     (5) 对于继承关系:当子类的对象来调用父类中的方法时,则执行的是父类只中原有的方法,   
           这和多态不一样,如果子类覆盖掉父类的这个方法时,则调用的是子类的这个方法。   
3. 多态:   
   (1) 前提:把子类对象当成父类对象来看。   
   (2) 把子类对象当成父类对象来看时:只能调用父类中定义的属性和方法。   
   (3) 把子类对象当成父类对象来看时:如果子类覆盖了父类中的方法,则调用的   
       是子类覆盖后的这个方法。   
       但是如果调用属性时是调用父类的属性而并非子类的,所以尽量不要定义   
           父子类同名的属性。   
   (4) 把父类强制转换成子类时,则调用的是子类中的方法。   
4. 静态方法不能叫"多态". 切记!   
     静态方法不可被覆盖,如果子类和父类有重名的静态方法,虽然编译通过,但并不能实现多态,所以不能   
    叫"覆盖"。例如:Animal a = new Bird(); a.move();如果是"多态"的话应该输出的结果为,子类中的结果,   
    但是实际不是,它是调用的是父类中的方法。所以不能叫"覆盖(多态)"。

1. 继承:
   (1)子类的构造方法一定会调用父类的构造方法。
    (2)任何子类构造方法第一行肯定是this();或者super();两个择一。
   this();调用本类的其它构造方法。(传递相应参数调用相应的方法)
   super();调用父类的构造方法。
2. 覆盖:
    子类覆盖父类前提:
   (1) 同名,同参数列表,同返回类型。
   (2) 子类覆盖后的方法的访问权限只能比父类相同或者更宽广。
   (3) 子类覆盖后的方法抛出的异常不能比父类更宽广。
   (4) is-a:指继承。
      has-a:指类实例具有对另一个实例的引用。
     (5) 对于继承关系:当子类的对象来调用父类中的方法时,则执行的是父类只中原有的方法,
           这和多态不一样,如果子类覆盖掉父类的这个方法时,则调用的是子类的这个方法。
3. 多态:
   (1) 前提:把子类对象当成父类对象来看。
   (2) 把子类对象当成父类对象来看时:只能调用父类中定义的属性和方法。
   (3) 把子类对象当成父类对象来看时:如果子类覆盖了父类中的方法,则调用的
       是子类覆盖后的这个方法。
       但是如果调用属性时是调用父类的属性而并非子类的,所以尽量不要定义
           父子类同名的属性。
   (4) 把父类强制转换成子类时,则调用的是子类中的方法。
4. 静态方法不能叫"多态". 切记!
     静态方法不可被覆盖,如果子类和父类有重名的静态方法,虽然编译通过,但并不能实现多态,所以不能
    叫"覆盖"。例如:Animal a = new Bird(); a.move();如果是"多态"的话应该输出的结果为,子类中的结果,
    但是实际不是,它是调用的是父类中的方法。所以不能叫"覆盖(多态)"。

Java代码 
多态:   
Animal a = new Bird(); a客观是鸟(客观类型)   
Bird b = (Bird)a ;   
其中:Animal a,在编译时a为Animal。编译类型叫"编译时多态",主观。   
new Bird(),叫:"运行时多态",客观。   
Bird b = (Bird)a ;把父类强制转换成子类。   
if(a instanceof Animal) ----> 编译类型   
if(a instanceof Bird) -----> 客观类型   
if(b instanceof Animal) -----> 自动向上兼容

多态:
Animal a = new Bird(); a客观是鸟(客观类型)
Bird b = (Bird)a ;
其中:Animal a,在编译时a为Animal。编译类型叫"编译时多态",主观。
new Bird(),叫:"运行时多态",客观。
Bird b = (Bird)a ;把父类强制转换成子类。
if(a instanceof Animal) ----> 编译类型
if(a instanceof Bird) -----> 客观类型
if(b instanceof Animal) -----> 自动向上兼容

Java代码 
this的用法:   
   this._ (区分局部变量与全局变量,有重名时用)   
   this(参数类表)   
super的用法:   
super._(区分子类与父类同名属性,以后建议不要定义相同的同名属性)   
   super(参数列表)

this的用法:
   this._ (区分局部变量与全局变量,有重名时用)
   this(参数类表)
super的用法:
super._(区分子类与父类同名属性,以后建议不要定义相同的同名属性)
   super(参数列表)

Java代码 
写一个类时,同时顺手的要加上一个无参的构造方法,有其它类继承它时,   
加上super();但父类如果没有无参的构造方法就会报错。

     写一个类时,同时顺手的要加上一个无参的构造方法,有其它类继承它时,
系统会自动加上super();但父类如果没有无参的构造方法就会报错。

Java代码 
覆盖(重写)和重载的区别:   
覆盖:(1) 是父子类之间.   
        (2) 父子类同名,相同的参数列表,相同的返回类型。   
     (3) 子类访问的权限比父类要高。   
     (4) 子类抛出的异常比父类小。   
重载:(1) 多数针对一个类.   
       (2) 方法名相同,参数列表不同,与返回类型无关。   
     (3) 也可能出现在父子类中。   
     (4) 一般会想到构造函数,有无参的构造函数,一个参数的,两个参数的。

覆盖(重写)和重载的区别:
覆盖:(1) 是父子类之间.
        (2) 父子类同名,相同的参数列表,相同的返回类型。
     (3) 子类访问的权限比父类要高。
     (4) 子类抛出的异常比父类小。
重载:(1) 多数针对一个类.
       (2) 方法名相同,参数列表不同,与返回类型无关。
     (3) 也可能出现在父子类中。
     (4) 一般会想到构造函数,有无参的构造函数,一个参数的,两个参数的。

补充:

Java代码 
package com.ctit;   

public class Test {   
    public static void main(String[] args){   
        A a = new B(); 这里是把子类当成父类来看,则只能调用父类中定义的属性和方法。   
        //a.hello(5); 如果子类覆盖了父类中的方法,则调用的是子类覆盖后的那个方法。   
           
        B b = (B)a; 这里是把父类强转成子类,这里千万不能写成A a = new A();这样的话运行时会报错,只能是上面的那个A a = new B();   

        b.hello(4);强转后调用的是子类中的方法(对覆盖来说)   
        b.hello2();强转后也可以调用父类中的方法   
    }   
}   

class A{   
    public void hello(int i){   
        System.out.println("A="+i);   
    }   
       
    public void hello2(){   
        System.out.println("hello2");   
    }   
}   

class B extends A{   
    public void hello(int j){   
        System.out.println("B="+j);   
    }   
                下面的这个方法不是覆盖哦!要看好覆盖的前提哦~!   
                public void hello(long l){   
                                 System.out.println("B2="+l);   
                }   
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值