`
ihyperwin
  • 浏览: 426544 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

继承中的构造方法及覆盖与隐藏

 
阅读更多
继承中的构造方法
一、无参构造函数(默认构造函数)与有参构造函数
子类的所有构造方法都必须调用父类的一个构造方法,如果不显示指定调用父类的哪个构造方法,就默认调用父类的无参构造方法.
class A
{
   //A() { System.out.println("A()");}
   A(int i) { System.out.println("A(i)");}
}
class B extends A
{
    B()  { }
    public  static void  main(String []a)
   {  B b=new B(); }
}
编译时显示:
B.java:8: 找不到符号
符号: 构造函数 A()
位置: 类 A
    B(  )  { }
           ^
1 错误
即:创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),
假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,
因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。我们假设A是B的父类,B是A的子类。
1、如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不再提供默认的无参数构造函数。
2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。
3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter)
二、成员继承中的隐藏和覆盖
首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则
1.父类的实例变量和静态变量能被子类的同名变量隐藏
2.父类的静态方法被子类的同名静态方法隐藏
3.父类的实例方法被子类的同名实例方法覆盖

还有几点需要注意的是
1.不能用子类的静态方法隐藏 父类中同样标识(也就是返回值 名字 参数都一样)的实例方法
2.不能用子类的实例方法覆盖 父类中同样标识的静态方法
3.这点儿请注意,就是变量只会被隐藏不会被覆盖,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏父类的实例变量,子类的实例变量可以隐藏 父类的静态变量
总结:
1.同名的实例方法被覆盖 ,同名的静态方法被隐藏,
2.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法。(类的多态性)
3.如果需要访问父类被隐藏 的实例变量,加上super就好了。
4.如果需要访问父类被覆盖的方法,加上super就好了。
例1:变量隐藏:子类拥有了两个相同名字的变量,一个来自父类,一个是自己定义;当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自己的变量,而把继承自父类的变量“隐藏”起来了。
class A
{
  protected int  a;
  A(int a) {setA(a+10);}
  public void setA(int x)   {  a=x;  }
  public void showA() {System.out.println("A:showA(): a="+a);}
  public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
   protected int a,b;
   B2(int x1, int y1)   { super(x1);   setB(x1+100, y1+100);   }
   public void setB(int x1, int y1)  {    a=x1;    b=y1;  }
   public void show()
   {
       //super.show();
    System.out.println("B:show():a="+a+" B:b="+b);
}
    public  static void  main(String []a)
{
    B2 b1;
    b1=new B2(1,2);
    b1.show();
    b1.showA();
}
}
----------运行 ----------
B:show():a=101 B:b=102
A:showA(): a=11

例2:部分覆盖:super.原父类方法名+其它语句

class A
{
  protected int  a;
  A(int a) {setA(a+10);}
  public void setA(int x)   {  a=x;  }
  public void showA() {System.out.println("A:showA(): a="+a);}
  public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
   protected int a,b;
   B2(int x1, int y1)   { super(x1);   setB(x1+100, y1+100);   }
   public void setB(int x1, int y1)  {    a=x1;    b=y1;  }
   public void show()
   {
          super.show();
    System.out.println("B:show():a="+a+" B:b="+b);
}
    public  static void  main(String []a)
{
    B2 b1;
    b1=new B2(1,2);
    b1.show();
    //b1.showA();
}
}
----------运行 ----------
A:show() :a=11
B:show():a=101 B:b=102

例3:show是实例方法被覆盖,转化为父类对象时,由于是子类对象所以调用本身类的方法,如果是父类对象,则调用父类的方法。showA是父类的方法而子类中无该方法,所以调用父类的方法,访问父类的成员。
class A
{
   protected  static int  a;
  A(int a) {setA(a+10);}
  public  static void setA(int x)   {  a=x;  }
  public static void showA() {System.out.println("A:showA(): a="+a);}
  public   void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
   protected static int a,b;
   B2(int x1, int y1)   { super(x1);   setB(x1+100, y1+100);   }
   public static void setB(int x1, int y1)  {    a=x1;    b=y1;  }
   public    void show()
   {
      //super.show();
    System.out.println("B:show():a="+a+" B:b="+b);
}
    public  static void  main(String []a)
{
    A a1=new A(1);
    B2 b1;
    a1.show();
    b1=new B2(1,2);
    a1=b1;
    a1.show(); 
    a1.showA();
}
}
----------运行 ----------
A:show() :a=11
B:show():a=101 B:b=102
A:showA(): a=11

例4:a是静态变量,在子类用有同名变量,所以在子类中a被隐藏。在子类中如果要访问来自父类的a成员需要使用super。
class A
{
   protected  static int  a;
  A(int a) {setA(a+10);}
  public  static void setA(int x)   {  a=x;  }
  public static void showA() {System.out.println("A:showA(): a="+a);}
  public   void show() {System.out.println("A:show() :a="+a);}
}
class B3 extends A
{
   protected static int a,b;
   B3(int x1, int y1)   { super(x1);   setB(x1+100, y1+100);   }
   public static void setB(int x1, int y1)  {    a=x1;    b=y1;  }
   public  void show()
   {
          System.out.println("B:show():a="+a+" B:b="+b+" B:super.a="+super.a);
}
    public  static void  main(String []a)
{
  B3 b1;
    b1=new B3(1,2);
    b1.show();
}
}
结果:
B:show():a=101 B:b=102 B:super.a=11

例5:show是静态方法,属于类的,而不属于某一个对象,所以用a1对象调用show()方法相当于A.show()调用,跟a是那一个父类对象,或者跟子类对象没有任何的关系。
class A
{
   protected  static int  a;
  A(int a) {setA(a+10);}
  public  static void setA(int x)   {  a=x;  }
  public static void showA() {System.out.println("A:showA(): a="+a);}
  public  static void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
   protected static int a,b;
   B2(int x1, int y1)   { super(x1);   setB(x1+100, y1+100);   }
   public static void setB(int x1, int y1)  {    a=x1;    b=y1;  }
   public   static void show()
   {
      //super.show();
    System.out.println("B:show():a="+a+" B:b="+b);
}
    public  static void  main(String []a)
{
    A a1=new A(1);
    B2 b1;
    a1.show();
    b1=new B2(1,2);
    a1=b1;
    b1.show();
    a1.show(); 
    a1.showA();
}
} ----------运行 ----------
A:show() :a=11
A:show() :a=11
A:showA(): a=11
分享到:
评论

相关推荐

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    Elevenyxy.zip

    要有至少两个构造方法(一个构造方法只有一个参数id并调用父类无参的构造方法,另一个构造方法有多个属性值做参数并调用父类有参的构造方法); 要体现出this和super的用法; 要覆盖play()方法,并在play...

    继承与接口的含义以及其子类相关的含义

    继承与接口含义,子类的继承性的访问控制,子类对象的构造过程,子类的内存分布,子类对象的成员初始化,成员变量的隐藏,方法的重载与方法的覆盖,this关键字。。。。。。

    java初学者必看

    8.2 super构造方法调用 8.3 封装和继承 8.4 使用继承 8.4.1 Object类 8.4.2 定义equals方法 8.5 关于设计好继承的几点建议 8.6 实例:一卡通类的继承 8.6.1 构造方法 8.6.2 setter方法 8.6.3 getter方法 ...

    10个java主题

    什么时候被覆盖的方法并非真的被覆盖了 Item 2: String.equals()方法与== 运算符的用法比较 Item 3: Java 是强类型语言本 Item 4: 那是构造函数吗 Item 5: 不能访问被覆盖的方法...

    Java入门教程(微学苑)-part1

    4.5 继承中的方法的覆盖和重载 65 4.6 多态和动态绑定 66 4.7 动态绑定 69 4.8 instanceof 运算符 70 4.9 多态对象的类型转换 71 4.10 Java static关键字以及Java静态变量和静态方法 72 4.11 static 的内存分配 73 ...

    java基础教学ppt

    java基础教学ppt,共15...* 继承时候的构造方法 * 隐藏和覆盖 * 重载、覆盖和重载的区别 * Object类 * 终结类、终结方法 * 抽象类、抽象方法 * 接口 其它不在这里一一说明.如果有感趣的可以自己下载看.

    Java开发技术大全 电子版

    4.4构造方法的继承154 4.5super的使用156 4.5.1用super引用父类的成员156 4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8重载159 4.8.1普通方法的重载160 4.8.2构造...

    net学习笔记及其他代码应用

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    Java开发技术大全(500个源代码).

    showDiff.java 演示隐藏与覆盖之间的区别 showSomething.java 测试运行时多态 stupid.java 试图覆盖最终方法的类,它有错误 Sub.java 一个简单的子类 Super.java 一个基类 testOverload.java 测试方法的重载...

    VC学习大纲 VC学习讲义

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

    【04-面向对象(上)】

    •构造器的重载和方法的重载一样,都是方法名相同,形参列表不相同。 •在构造器中可通过this来调用另外一个重载的构造器。 继承的特点 •Java通过关键字extends来实现,实现继承的类称为子类,被继承的...

    corejava培训文档

    6.7. 构造方法 6.8. 数据和方法的隐藏―――封装 6.9. 方法的重载 7. 六 高级语言特性 7.1. 封装 (encapsulation) 7.2. 继承 (inherit) 7.2.1. JAVA继承特点 7.2.2. 父类(SuperClass)和 子类(SubClass)的...

    Delphi7.完美经典

    7-6-4 覆盖(Overriding)与隐藏(Hiding)的差别 7-6-5 Override与OVerload的差别 7-7 Abstract成员函数与多态(Polymorphic) 7-7-1 一般纯虚函数的多态实现概念 7-7-2 纯虚函数的定义语法及实现 7-8 Self、AS、is...

    计算机(专升本)Java程序设计复习资料.doc

    接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法, 而接口中不能定义构造器而且其中的方法全部都是抽象方法。 抽象类中的成员可以是private、默认、protected、public的,而接口中的...

    C# 基础教程

    5.3.1方法覆盖 53 5.3.2多态性 54 5.4 静态方法 58 5.5 本章小结 59 5.6 实战演练 59 第六章 属性、数组和索引器 60 6.1 属性——智能字段 60 6.1.1定义和使用属性 61 6.1.2编译器的工作原理 62 6.1.3 只读属性 63 ...

    C#基础知识之new关键字介绍

    在子类中用 new 关键字修饰定义的与父类中同名的方法,叫覆盖。覆盖不会改变父类方法的功能。 当子类创建父类时,代码中A c = new B(),覆盖不会改变父类的功能。依然还是调用父类的功能。 三、new 约束 用于在泛型...

    二十三种设计模式【PDF版】

    使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用...

Global site tag (gtag.js) - Google Analytics