Chinaunix首页 | 论坛 | 博客
  • 博客访问: 563976
  • 博文数量: 255
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 2811
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-09 13:29
个人简介

IT业行者,行者无疆

文章分类

全部博文(255)

文章存档

2011年(121)

2010年(134)

我的朋友

分类:

2011-01-13 16:34:30

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

2010-05-27 16:30

JAVA的覆盖、继承和多态的详细解说.thissuper的用法
关键字: 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,在编译时aAnimal。编译类型叫"编译时多态",主观。  
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,在编译时aAnimal。编译类型叫"编译时多态",主观。
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);  
                }  
}

 

阅读(5066) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~