/*
 * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


/*
 *
 *   Sample target application
 *
 */

class Animal {
    int category;
    int age;
}

class Pet extends Animal {
    String owner;
    String name;
    String vet;
    String records;
    String address;
    Pet(String name) { this.name = name; }
}

class Dog extends Pet {
    int breed;
    int barks;
    Dog(String name) { super(name); }
}

class Cat extends Pet {
    int breed;
    int claws;
    Cat(String name) { super(name); }
}

public class HeapUser {
    private static Dog dogs[];
    private static Cat cats[];
    public static void main(String args[]) {
        System.out.println("HeapUser start, 101 dogs, 1000 cats");
        dogs = new Dog[101];
        for(int i=0; i<101; i++) {
            dogs[i] = new Dog("fido " + i);
        }
        cats = new Cat[1000];
        for(int i=0; i<1000; i++) {
            cats[i] = new Cat("feefee " + i);
        }
        System.out.println("HeapUser end");
    }
}
