Decode
Decode

Reputation: 160

JAVA: How can I access to members of each classes?

How can I access to members of each classes?

I have class Dog and Cat. They have different member variable of class. I try to create one function "CommUtil.display()" to access many classes (Dog or Cat) and display all members of class.

I try to access from mainClass to access Dog or Cat class. but it can't.

Anyone can help will be appreciated.

I have made an example below:

    class Dog {
        private String name = null;
        private String weight  = null;

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        public String getWeight() {
            return weight;
        }
        public void setWeight(String weight) {
            this.weight = weight;
        }
    }


    class Cat {
        private String name = null;
        private String age = null;

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }

    }


    class commUtil {
        //TODO: output members of class
        public void display (Object obj){
            //Question: How to access members of each classes?
            //code here...






        }

    }


    class mainClass {
        public static void main(String[] args) {

            Dog d = new Dog();
            commUtil.display(d);

            or 

            Cat c = new Cat();
            commUtil.display(c);
        }
    }

In case 1: 
Dog d = new Dog();
d.setName("Lion");
d.setWeight("2Kg");
commUtil.display(d);

It will display Name and Weight of Dog

In case 2: 
Cat c = new Cat();
c.setName("MiMi");
c.setAge("1");
commUtil.display(c);

It will display Name and Age of Cat 

Upvotes: 0

Views: 792

Answers (5)

Popeye
Popeye

Reputation: 12093

This is what inheritance is for, so you would make an abstract super class possibly called Animal in this case and then Dog and Cat would extend that class as subclasses. Here is a fairly simple tutorial about inheritance.

public abstract class Animal {

    /** Common name property for all animals */
    private String name;

    /** Common age property for all animals */
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
         return name;
    }

    public void setAge(int age) {
        this.age= age;
    }

    public int getAge() {
         return age;
    }

    /** 
    * Abstract method that will need to be implemented 
    * by a concrete class that inherits from this abstract class
    */
    public abstract String getInfo();

    public abstract String speak();

    public abstract String getType();
}

public class Dog extends Animal {
    
     /*
     Any Dog specific properties would also go in here
     */       

    private boolean isPedigree = false;

    /** Class Constructor */
    public Dog(String name, int age, boolean isPedigree) {
        super(name, age);
        this.isPedigree = isPedigree;
    }

    public boolean isPedigree() {
        return isPedigree;
    }

    @Override
    public String getInfo() {
        return "I am a Dog named " + name + " and I am " + age + " years old.";
    }

    @Override
    public String speak() {
        return "WOOF";
    }

    @Override
    public String getType() {
        return Dog.class.getSimpleName();
    }
}

public class Cat extends Animal() {
     
     /*
     Any Cat specific properties would also go in here
     */

     /** Class Constructor */
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public String getInfo() {
        return "I am a " + getType() + named " + name + " and I am " + age + " years old.";
    }

    @Override
    public String speak() {
        return "meow";
    }

    @Override
    public String getType() {
        return Cat.class.getSimpleName();
    }
}

public class MyMainClass {
    public static void main(String[] args) {
        /*
         Just creating a random array to show that
         any animal whether Dog or Cat can be placed into
         this array as they inherit from Animal
        */
        List<Animal> animals = new ArrayList<>();

        animals.add(new Dog("James", 5, true));
        animals.add(new Cat("Treacle", 2));

        for (Animal animal : animals) {
            display(animal);
            if (animal instanceof Dog) {
                boolean isPedigree = ((Dog) animal).isPedigree();
                System.out.println("Q: Am I a Pedigree? A: " + String.valueOf(isPedigree));
            }
        }
    }

    private void display(Animal animal) {
        System.out.println("I'm an animal of type " + animal.getType() + " and I can say " + animal.speak());
        System.out.println(animal.getInfo());
    }
}

Our output would be:

I'm an animal of type Dog and I can say WOOF

I am a Dog named James and I am 5 years old.

Q: Am I a Pedigree? A: true

I'm an animal of type Cat and I can say meow

I am a Cat named Treacle and I am 2 years old.

This answer shows simple inheritance and polymorphism. This of the backbone of OOP (Object Orientated Programming) and when learning Java will be the essential basics you will need to learn and understand.

In my example getInfo() could actually just be a method in Animal as there is nothing specific it is doing per subclass. You could also move display into the Animal abstract class if you which, I only placed it here for the example.

There is no need for any CommonUtils class or anything like that here, everything you want can be done by simply learning about inheritance.

What we are saying in this example is Cat and Dog are Animals they inherit all the characteristics of any Animal. What you can't do though is create a random Animal object like Animal animal = new Animal("Paul", 4);, the Animal has to be of some sort of type whether that is of type Dog, Cat or some other Subclass of Animal you create (i.e. Bird, Fish or even Human).

Upvotes: 1

Magdrop
Magdrop

Reputation: 578

If the code can still change, you may be able to use java interface. The idea is that both Dog and Cat implements a common interface for output display. In practice though, it will have the same result as modifying toString() like the other comments already covered. Anyway, here is an example:

public interface AnimalInfo {
    public String getInfo();
}

and then both Dog and Cat classes can implements this interface.

class Dog implements AnimalInfo {
...

public String getInfo() {
    return "name="+name+", weight="+weight;
}

class Cat implements AnimalInfo {
...

public String getInfo() {
    return "name="+name+", age="+age;
}

and then inside commUtil the argument can use the interface type AnimalInfo

public void display (AnimalInfo animal){
    System.out.println("It will display " + 
    animal.getInfo() + " of " + animal.getClass().getSimpleName());
}

Upvotes: 4

pchand
pchand

Reputation: 25

Check if the object is an instance of Cat or Dog using the instanceof operator. Then you must perform a cast to access the object’s getter methods.

if(obj instanceof Cat){
    Cat cat = ((Cat) obj);

    System.out.println(cat.getName());
}

Upvotes: -1

Ryuzaki L
Ryuzaki L

Reputation: 40008

You can use Java reflection to get all fields from object, below is the example, you can achieve this by T parameter method in utility class

public class ArrayMain {

int x=10; String name="anil";
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {

    ArrayMain m = new ArrayMain();
     m1(m);     
     SomeOther o = new SomeOther();
     m1(o);
}   
public int getX() {
    return x;
}
public String getName() {
    return name;
}
static <T> void m1(T type) throws IllegalArgumentException, IllegalAccessException {
    Field[] f=type.getClass().getDeclaredFields();

    for(Field f1:f) {
        System.out.println(f1.getName());
        System.out.println(f1.get(type));
    }
}

 }

Upvotes: 0

YK S
YK S

Reputation: 3440

You can have the CommonUtil class as shown below. Also, make the display method static as you are trying to access it using class name.

class CommUtil {
    //TODO: output members of class
    public static void display (Object obj){
        //Question: How to access members of each classes?
        //code here...

        if(obj instanceof Dog) {

            System.out.println(((Dog) obj).getName());
            System.out.println(((Dog) obj).getWeight());

        }
    }

}

But as mentioned in the comments you can just override toString() method inside every class and display objects for all those classes.

public String toString() {
        return "Cat [name=" + name + ", age=" + age + "]";
    }

Upvotes: 0

Related Questions