`

在抽象方法中访问实例变量的陷阱

    博客分类:
  • Java
阅读更多

在Java设计模式中,模板方法是很常用的一种模式,它的宗旨就是把子类相同的部分提取到父类,不同的部分通过声明抽象方法在父类中调用,在子类中实现。

但是如果在抽象方法中访问实例变量,可能会有一个让你意外的陷阱:

 

public class Test {
    public static void main(String[] args) {
        new ChildClass();
    }
}

abstract class SuperClass {
    private int i = 0;

    SuperClass() {
        foo();
    }

    abstract void foo();
}

class ChildClass extends SuperClass {
    private int i = 5;

    void foo() {
        System.out.println("i = " + i);
    }
}

 

父类中的foo()方法调用的确实是子类中实现的foo方法。

 

在子类中,我们期望变量i象我们初始化的那样,值为5,但是实际上它的值不是子类中赋予的5,而是父类中赋予的0。

实际上子类的初始化过程如下:

 

1)初始化父类的实例变量

2)调用父类的构造器

3)调用子类的foo()方法

4)初始化子类的实例变量

5)调用子类的构造器

 

因此,如果我们在父类的构造器中调用抽象函数,而该函数又要访问实例变量的值的时候,就要特别注意到这种情况。

分享到:
评论

相关推荐

    C#类、接口、虚方法和抽象方法-抽象类和接口的相同点和区别

    (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也...

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例

    C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例 C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例

    JAVA类的方法调用和变量

    JAVA类的方法调用和变量 一、类的分类: 1、普通类 2、抽象类(含有抽象方法的类) 3、静态类(不需要实例化,就可以使用的类) 二、方法的分类: 1、私有方法(只有类的内部才可以访问的方法) 2、保护方法(只有...

    1.1:抽象方法与抽象类.pdf

    抽象类与抽象方法由abstract修饰 abstract的使用注意 抽象方法没有方法体 抽象成员只能存在于抽象类中 抽象类可以有非抽象成员(侧重族群的概念) 抽象类的子类必须实现抽象方法体 抽象类you构造函数 抽象类只能...

    C#抽象类与抽象方法

    “抽象类允许(但不... 在一个抽象类里可以不声明抽象方法,这在语法上是没问题的,但实际来说,这样是没有任何意义的。也就是说,你为什么会选择写一个抽象类呢?当然是为了想某个方法能够被OVERRIDE,以实现多态。

    实例7 接口和抽象函数(java实例系列)

    java例之实例7 接口和抽象函数(java实例系列)

    Java实例化一个抽象类对象的方法教程

    大家都知道抽象类无法实例化,就无法创建对象。所以下面这篇文章主要给大家介绍了关于Java实例化一个抽象类对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...

    C#接口抽象类区别实例

    c#中抽象类和接口。 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 ...(9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

    JAVA抽象类和抽象方法(abstract)实例分析

    主要介绍了JAVA抽象类和抽象方法(abstract),结合实例形式分析了java抽象类及抽象方法相关定义、使用技巧与操作注意事项,需要的朋友可以参考下

    使用抽象方法实现多态

    使用抽象方法实现多态使用抽象方法实现多态

    细细品味C#(抽象接口委托反射).pdf

     只允许在抽象类中使用抽象方法声明。  因为抽象方法声明不提供实实现,所以没有方法体;方法声明只是以一个分号结束, 并且在签名后没有大括号 ({ })。例如:  public abstract void MyMethod();  实现...

    抽象工厂模式Demo实例

    抽象工厂模式Demo实例,如有想了解抽象工厂模式,可参考原博文:https://blog.csdn.net/lzb348110175/article/details/89597958,该Demo配套原博文使用

    抽象方法简单工厂

    通过抽象类中的抽象方法实现简单工厂模式。

    Java中抽象类和接口的区别

    1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次...抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。  7.接口中的方法默认都是 public,abstract 类型的。

    抽象工厂模式实例代码

    通过抽象工厂搜提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各种各样的工厂,制造出各种不同的产品。这是与博客《抽象工厂模式--GOF的23个之一》...

    抽象类和抽象方法.pdf

    抽象类和抽象方法.pdf

    抽象工厂实例(mySchool实例)

    经典描述抽象工厂整个动作过程!! 适合学习设计方法人员参考

    实现抽象类求面积方法

    窗体应用程序。一个抽象类几何形状包含抽象求面积方法,三个继承类圆、矩形、三角形实现抽象类求面积方法。

    一个很好的抽象工厂实例

    这是一个抽象工厂的经典实例,内附源码,数据库,用法说明

Global site tag (gtag.js) - Google Analytics