对JAVA的继承,方法的覆盖,重载的认识 以及对象访问方面的探讨

来源:互联网 发布:淘宝手机详情批量修改 编辑:程序博客网 时间:2024/05/29 11:38

     最近又开始学JAVA拉,现在将自己的学习体会写下来,希望能对大家有点帮助,当然有分析不妥当的地方请大家指正哦!

继承:子类能获得父类所有的成员(除了父类中为private的成员,因为private的成员是类内访问权限.)

override(覆盖) 的要求:

1.限定词只能越来越开放

2.覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果

3.覆盖方法的返回值必须和被覆盖方法的返回值一致

4.子类不能覆盖父类的private方法,及时定义一个和父类一样的 如父类中是 private go() 子类中也定义了个private go() 那只是在子类中新定义了一个方法,并不是覆盖了父类中的go()方法

5.父类中的静态方法也能被覆盖,但是用eclipse这样覆盖后 并没发现eclipse有提示该方法 是覆盖的方法.

6.凡是子类中和和父类中方法名(非private方法)一样的,且参数一样的方法,必须实现覆盖,否则会编译不通过.既要有一样的返回值,且访问权限不能比父类的小.

   凡是子类中和和父类中方法名(非private方法)一样的,且参数不一样的方法,可以看做了进行了重载

overload (重载) 的要求:

1.方法重载要求参数必须不一致

2.对返回类型无限制

另外:

超类的引用变量可以被任何从该类的派生子类的引用赋值 即 我们假设Father 为父类 Son为继承Father的子类,那么我们可以进行这样的赋值 Father f=new Son(); 但是此时f就只能访问Father中定义了的成员部分(当然这些成员必须是在访问许可的权限内 ,譬如private成员就不能访问(当Father f=new Son(); 语句是在子类中的时候)).如果f访问的方法已经被子类覆盖了的话,那么f访问的将是子类Son中相应的方法,(而由于上面我们提到了static的方法是可以覆盖的,但是覆盖后eclipse并没有提示说是覆盖的方法,偶想肯定是有原因的 至于什么原因,偶还不知道 知道的告诉下偶拉. )偶在测试的时候发现 f访问的静态方法还是父类Father中定义的方法,子类中做了覆盖的方法并没有被调用.大家可以测试下:

public class Son extends Father {
    
static int a=1;
    
int b=2;    
    
private int c=3;
    
protected int d=4;
     
int e=5;
    
static  void doIt(){
          System.out.println(
"子类方法");
      }

   
void go(){
        System.out.println(
"子类go方法");
    }

  String gg()
{
        System.out.println(
"子类gg方法");
        
return "";
    }

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        Father f
=new Son();
        Son s
=new Son();
            
        f.doIt();
        s.doIt();

        }


}

class Father{
    
static int a=11;
    
int b=22;    
    
private int c=33;
    
protected int d=44;
     
int h=55;
     
private int g=66;
    
static void doIt(){
        System.out.println(
"父亲方法");
            }

     
void go(){
        System.out.println(
"父亲go方法");
    }

    
private void gg(){
            System.out.println(
"父亲gg方法");
        }

}

其执行的结果大家可以发现打印出来的是:

父亲方法
子类方法

如果用f去访问变量 譬如在代码中加上 System.out.println(f.a); 你会发现打印出来的是 11而不是子类中的1,打印其他的变量 System.out.println(f.b); ( System.out.println(f.c) 会提示出错,因为其为private;)  System.out.println(f.d); 

System.out.println(f.h); 你会发现 全部都打印出来的是 父类中变量相应的值. 而当你打印System.out.println(f.e); 会发现提示错误.因为上面我们说了 f 只能访问父类Father定义了的成员.

引用一个网友blog中写到的结论:超类的引用变量可以被任何从该超类派生的子类的引用赋值,反之,编译错误提示:incompatible types但是,只能访问超类定义了的成员部分。如果出现方法覆盖:引用变量的类型决定了调用谁的成员变量;被引用对象的类型决定了调用谁的成员方法。也就是说,同名方法调用子类的,同名变量调用超类的。这叫超类引用变量引用子类对象。

但是我们要注意的是 对静态static 方法进行覆盖后的调用情况.

综合以上,我们要特别注意static 型的 覆盖方法 ,父类中声明为private的成员,以及在把子类的实例赋给父类的变量的时候 (Father f=new Son();) 注意该父类变量访问方法和变量的不同,访问的范围(父类中定义了的成员),相信大家把关键点掌握了,对继承,覆盖,重载就会有个很好的了解了 :)

欢迎大家讨论,指出以上分析有误的地方.

 

原创粉丝点击