首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在父类的arraylist中区分每个子类

在父类的ArrayList中区分每个子类,可以通过以下几种方式实现:

  1. 使用多态:多态是面向对象编程的重要特性之一,它允许将子类的对象赋值给父类的引用变量。在父类的ArrayList中存储不同子类的对象,然后通过类型转换将其还原为子类对象,从而区分每个子类。例如:
代码语言:java
复制
ArrayList<ParentClass> list = new ArrayList<>();
list.add(new ChildClass1());
list.add(new ChildClass2());

for (ParentClass obj : list) {
    if (obj instanceof ChildClass1) {
        ChildClass1 child1 = (ChildClass1) obj;
        // 处理ChildClass1对象
    } else if (obj instanceof ChildClass2) {
        ChildClass2 child2 = (ChildClass2) obj;
        // 处理ChildClass2对象
    }
}
  1. 使用自定义标识属性:在父类中定义一个标识属性,用于区分每个子类。子类可以根据需要重写该属性。然后在父类的ArrayList中存储不同子类的对象,并通过标识属性来区分每个子类。例如:
代码语言:java
复制
class ParentClass {
    protected String type;

    public String getType() {
        return type;
    }
}

class ChildClass1 extends ParentClass {
    public ChildClass1() {
        type = "ChildClass1";
    }
}

class ChildClass2 extends ParentClass {
    public ChildClass2() {
        type = "ChildClass2";
    }
}

ArrayList<ParentClass> list = new ArrayList<>();
list.add(new ChildClass1());
list.add(new ChildClass2());

for (ParentClass obj : list) {
    if (obj.getType().equals("ChildClass1")) {
        // 处理ChildClass1对象
    } else if (obj.getType().equals("ChildClass2")) {
        // 处理ChildClass2对象
    }
}
  1. 使用枚举类型:在父类中定义一个枚举类型,用于表示每个子类。子类可以根据需要重写该枚举类型。然后在父类的ArrayList中存储不同子类的对象,并通过枚举类型来区分每个子类。例如:
代码语言:java
复制
enum ChildType {
    CHILD_CLASS_1,
    CHILD_CLASS_2
}

class ParentClass {
    protected ChildType type;

    public ChildType getType() {
        return type;
    }
}

class ChildClass1 extends ParentClass {
    public ChildClass1() {
        type = ChildType.CHILD_CLASS_1;
    }
}

class ChildClass2 extends ParentClass {
    public ChildClass2() {
        type = ChildType.CHILD_CLASS_2;
    }
}

ArrayList<ParentClass> list = new ArrayList<>();
list.add(new ChildClass1());
list.add(new ChildClass2());

for (ParentClass obj : list) {
    if (obj.getType() == ChildType.CHILD_CLASS_1) {
        // 处理ChildClass1对象
    } else if (obj.getType() == ChildType.CHILD_CLASS_2) {
        // 处理ChildClass2对象
    }
}

以上是几种在父类的ArrayList中区分每个子类的方法,具体选择哪种方式取决于实际需求和设计。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

子类继承,初始化

当然,基础子对象应该正确地初始化,而且只有一种方法能保证这一点:构建器执行初始化,通过调用基础构建器,后者有足够能力和权限来执行对基础初始化。...衍生构建器,Java 会自动插入对基础构建器调用。...除此以外,衍生构建器,对基础构建器调用是必须做第一件事情(如操作失当,编译器会向我们指出)。...个人总结: super关键字必须写在构造方法方法体内非注释代码首行 子类进行初始化,必须调用构造方法,如果所有构造方法都用private修饰了的话,则无法继承,编译报错....衍生构造方法调用构造方法,如果是无参构造方法,那么编译器会为衍生构造方法首行加上super()。 编译器会强迫我们衍生构建器主体首先设置对基础构建器调用。

1.9K30

子类赋值赋值兼容

C++ ,类型匹配检测是非常严格,但是你会发现一个现象,如果一个继承了另外一个,把子类对象赋值给时候,系统不但不提示错误,而且程序还能顺利编译通过并运行。...这其实就是 C++ 内部提供赋值兼容过程,但是要注意,如果子类数据成员比多,则会出现数据截断。...“; cout << “start (“ << _x << “,” << _y << “)” << endl; } protected: int _x; int _y; }; // 继承 Shape ...cout << “radio r = “ << _r << endl; } private: int _r; }; int main(int argc, char* argv[]) { // 实例化一个对象...Shape s(3, 5); s.draw(); // 实例化一个子类对象 Circle c(1, 2, 4); c.draw(); cout << “————————“ << endl; // 子类对象给变量赋值

17530
  • Java加载机制---子类多态调用

    null 1) 上面程序最大难点,也是最重要地方就是:构造函数调用了虚函数,并且这个函数被子类重载了 2) 继承时候,子类有着同名属性和同名方法,关于同名属性初始化过程也是必须要了解...,对应着前半句意思;如果他生了小孩,那么这个小孩子是一定有父亲 到Java代码这样看,如果我们实例化一个子类,必须先构造这个子类,否则是错误。...也就是说,存储空间分配是子类前面完成;还可以这样说,当执行到子类构造函数时候,首先第一个代码是执行super(),哪怕你没有显示写出来,他也是会去执行实例化,这就是子类如果想完成初始化...Java 中子类加载机制是第三个需要理解地方: 1)相关加载机制还是跟  上面第二点相似,只是子类初始化时候必须先去初始化 2)只有 等Java机制给子类和所有的都分配了内存空间之后...;同名方法是多态,只会去调用子类重载方法, 这个规则说白了,就是当有子类时候,必须都所有的存储空间都分配好了,才能执行  属性初始化,继而是构造函数;同时要明白一点,子类构造函数是构造完成之后才会去执行

    2.7K40

    Python_子类调用方法

    1.方式一 子类调用方法,包含2形式调用。一种形式是内部通过继承方式调用方法,另外一种形式是子类实例化后之后通过继承方式来调用方法。如下图所示: ?...注意一点,子类内部通过继承方式调用属性时,必须要带上self位置参数(self只实例化过程中和在实例调用属性时才能省略(self本来含义就是指向实例自己));而实例通过继承调用属性或方法时...3班") #调用子类本身方法 student.course() #通过子类调用方法--->实例化之后来调用方法 student.eat() #调用子类方法,子类方法调用了子类方法,...使用super好处,一是可以代替父名,这样后期名更改了,我们只需要更改子类名称后面的名即可,子类其他名可以不用更改;二是使用了super后,调用方法时可以不传参数self。..."11届土木3班") #调用子类本身方法 student.course() #通过子类调用方法--->实例化之后来调用方法 student.eat() #调用子类方法,子类方法调用了子类方法

    4.8K20

    返回子类类型函数写法

    不过由于我们这个 Event 类型比较多,因此希望写一个,来一个子类感受下: class DisposableEventBuilder : EventBuilder() { private....build() 我们调用完 retryLimit 方法后,想要设置下 delay,结果发现没有这个方法。 “我 X,这什么玩意儿”,你嘟囔了一句。 因为返回,所以链式调用掉链子了。...this.retryLimit = retryLimit return this as T } abstract fun build(): PollingEvent } 这个泛型给加了一个泛型参数...,这个参数则必须是当前子类,那么这样的话我们就可以返回自身类型位置返回 T 这个类型了。...子类改动就很简单了,只需要给加一个泛型参数为自己类型即可: class DisposableEventBuilder : EventBuilder

    4.7K10

    子类A继承B, A a = new A(); 则B构造函数、B静态代码块、B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行先后顺序是?

    (1)子类A继承B, A a = new A(); 则: B静态代码块->子类A静态代码块->B非静态代码块->B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数显式调用了某构造函数...,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用构造方法,这里通过super(“B”)显示调用了带参构造。...执行带参构造前要先对对象进行初始化,对c成员进行初始化,调用了C无参构造,所以调用顺序为: 先调用C无参构造 再调用A带参构造 最后调用调用子类构造 (3...)JVM调用mian方法之前先用进行静态内容初始化。...顺序为:静态变量, 静态代码块 ,子类静态变量,子类静态代码块。

    2.1K30

    Python 子类调用方法详解(单继承、多层继承、多重继承)

    测试环境: win7 64位 Python版本:Python 3.3.5 代码实践: 1、子类通过“名”调用方法 class FatherA: def __init__(self)...__init__(self) # 子类调用方法:名.方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果: >>> ==...(如SubClassB由FatherA变为FatherD时),必须遍历整个定义,把子类中所有的名全部替换过来 2、子类通过“super”方法调用方法 场景1、单层继承 class...__init__() # 子类调用方法:super().方法名称(参数) if __name__ == '__main__': b = SubClassB() class FatherA...__init__() # 子类调用方法:super(type, obj).方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果

    3.1K30

    Java中子类构造函数?

    参考链接: Java继承和构造函数 这篇文章总结了关于Java构造常见​​问题。  1)为什么创建一个子类对象要也需要调用构造函数? ...如果没有,编译器会插入调用构造语句。这就是为什么创建子类对象时构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。...Java,如果一个没有定义构造函数,编译器会为默认创建一个无参构造函数。如果在定义了构造函数super(String s),在这种情况下,编译器将不会为创建一个无参构造函数。...这是上边Super发生情况。  子类构造函数,无论有参构造还是无参构造,将会调用默认无参构造函数。...3)子类显式调用构造函数  下面的代码是正常:    子类(Sub)构造函数显式地调用(Super)带参构造参数。如果定义了相对应构造函数,那将会被正常良好调用。

    2.2K20

    子类调用同名方法和属性

    Python面向对象,利用子类调用同名方法和属性。...首先我们定义了两个,Master和School # @author: 北山啦 # FileName: 12子类调用同名方法 # @time: 2022/6/5 14:54 #Master...,子类如何来调用呢 在这里,定义Prentice,继承了Master和School,添加了和类同名属性和方法 调用子类属性和方法 如果调用了属性和方法,类属性会自动掩盖子类属性,股灾调用属性前...__init__ print(f'运用{self.kongfu}制作煎饼果子') 调用类属性和方法 如果调用方法,但是为了保障调用到属性,必须在方法前调用初始化...__init__ print(f'运用{self.kongfu}制作煎饼果子') '''调用方法,但是为了保障调用到是弗列属性,必须在方法前调用初始化'''

    1.8K20

    NHibernate单表继承模式下通过Repository查询子类

    表继承) 其中单表继承是我个人比较常用比较推荐做法。...使用单表继承可以不用Join多个表查询效率高,而且Domain Model属性提示到或者下降到子类时,数据库模型不用更改。...NHibernate中经常会遇到通过Repository来查询子类情况,比如现在有一个抽象Employee对象,下面有OfficeUser和Teacher两个具体对象,这两个对象都有其特有的属性...ems = cri.List(); 这里又不一样了,where条件后面跟“Type”是Employee表Discriminator,是一个列名,也就是通过这一列来区分Employee...以上是以最简单了例子说明了如果通过查询具体子类方法,实际项目中肯定比这个查询要复杂,但是只要记住了这三种查询要点,结合其他条件就可以写出NHibernate能够理解查询。

    34220

    ES6 子类方法重写

    子类方法重写概念子类方法重写是指在子类定义与类同名方法,并使用子类实现来替换方法。当子类调用该方法时,将执行子类实现而不是实现。...这允许子类根据自身需求来修改或扩展行为。语法ES6子类方法重写语法非常简单。子类,定义与类同名方法,并提供子类自己实现。当子类调用该方法时,将执行子类实现。...methodName() { // 子类方法实现,替换了方法实现 }}在上述代码,ChildClass继承自ParentClass,并重写了methodName()方法。...CirclecalculateArea()方法,我们使用固定半径值来计算圆面积,并输出结果。...当我们创建Circle实例并调用calculateArea()方法时,将执行子类Circle方法实现,输出圆面积。通过重写方法,子类可以根据自身需求来修改或扩展行为。

    60040

    Java中子类调用关系

    3、每个直接或间接是Object子类,Object只有一个无参构造方法。...4、编译器会在每个构造 讲之前,一些基本知识是应该具备:   1、如果一个没有定义构造器,编译器在编译时会自动加上默认无参构造器:   public ClassName {}   2、this...3、每个直接或间接是Object子类,Object只有一个无参构造方法。   4、编译器会在每个构造方法第一行隐式添加默认无参构造器,即添加super()。   ...Must explicitly invoke another constructo   因为定义了一个带参数构造器,因此编译器不会添加默认无参构造方法,但是因为子类构造器没有显式调用某个构造方法...Teacher() {   super(10);   }   }   这样,子类构造器显式调用了某个构造器,所以编译器不会自动添加super()方法。

    97330

    JAVA静态方法能否被子类重写?

    静态:   在编译时所分配内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间,实例化之前这个方法就已经存在于内存,跟对象没什么关系。...子类如果定义了相同名称静态方法,并不会重写,而应该是在内存又分配了一块给子类静态方法,没有重写这一说,只是单纯名字重复了。..."); } public void method() { System.out.println("子类一般方法"); } } 输出结果是: 静态方法...子类一般方法   当引用指向子类对象,只会调用静态方法,此行为并不具有多态性!...只能说明子类能继承静态方法!静态方法与对象无关!

    2.3K30

    创建子类对象时,构造函数调用被子类重写方法为什么调用子类方法?

    static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候会调用子类方法...但是:创建B对象会调用方法? 答案: 当子类被加载到内存方法区后,会继续加载到内存。...如果,子类重写了方法,子类方法引用会指向子类方法,否则子类方法引用会指向方法引用。 如果子类重载了方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载方法,则方法引用会指向方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,构造方法调用方法参数已经强制转换为符合方法参数了。 上边代码在编译前已经转换为下面这个样子了。

    6.1K10

    __init__设置对象

    1、问题背景Python,可以为对象设置一个,从而实现继承。但是,如果想要在实例化对象时动态地指定,则会出现问题。...,对象只能在定义时指定,不能在实例化对象时动态设置。...第一个解决方案是使用工厂。工厂是一个函数,它可以动态地创建工厂,可以根据传入参数来决定创建哪个。...如果parent是Blue,则创建两个,Circle和Square,它们都是Blue。最后,它返回创建。这样,我们就可以实例化对象时动态地指定对象了。第二个解决方案是使用依赖注入。...依赖注入是一种设计模式,它可以将对象依赖关系从对象本身解耦出来。这样,就可以实例化对象时动态地注入它依赖关系。

    9410

    Python实现子类调用初始化实例

    前言 python中进行面向对象编程,当在子类实例调用属性时,由于子类__init__方法重写了__init__方法,如果在子类这些属性未经过初始化,使用时就会出错。...方法一: 调用未绑定__init__方法 方法定义时,首个参数均为self。当实例化这个时,self就被自动绑定到当前实例。绑定也就意味着这个实例属性,方法都可以通过‘self....所以这里所说未绑定__init__方法 就是指未绑定实例__init__方法。...– 方法一简单直观,但面对多继承问题,只能多次调用每个__init__方法 – 方法二不太直观,但可以解决多继承问题,会一次性执行所有的对应方法 所以实际使用时,按照自己需要选择一个就行了...以上这篇Python实现子类调用初始化实例就是小编分享给大家全部内容了,希望能给大家一个参考。

    2K20

    Java子类之间对象转换(说明继承)

    参考链接: 子类Java具有相同数据成员 使用Java多态机制时,常常使用一个特性便是子类之间对象转换。...从子类转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计思想,需要使用子类对象时候,通过把变量定义为类型,我们可以通过一个变量,使用该类型所有子类型实例...因此,从子类转换不需要什么限制,只需直接将子类实例赋值给变量即可,这也是Java多态实现机制。...这就要考虑到,继承关系,有一些方法是不适合由定义并由子类继承并重写,有些方法是子类特有的,不应该通过继承得到,且子类可能也会有自己特有的成员变量,那么使用多态机制时候,若我们要通过类型变量使用到这些子类特有的方法和属性的话...然而这个方法是这些子类通过实现Comparable接口来实现Number并没有该方法实现,因此若要通过Number类型变量来使用compareTo方法,就要先将Number转换成子类对象

    3.7K20
    领券