JAVA:如何访问每个班级的成员?

时间:2018-08-07 03:11:26

标签: java

如何访问每个班级的成员?

我上了“猫和狗”课程。它们具有不同的类成员变量。 我尝试创建一个函数“ CommUtil.display()”来访问许多类(狗或猫)并显示该类的所有成员。

我尝试从mainClass访问以访问Dog或Cat类。 但是不能。

任何人都可以提供帮助。

我在下面做了一个例子:

    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 

5 个答案:

答案 0 :(得分:4)

如果代码仍然可以更改,则可以使用Java接口。这个想法是Dog和Cat都实现了用于输出显示的通用接口。但是实际上,它与修改toString()一样具有与已介绍的其他注释相同的结果。无论如何,这是一个示例:

db.getCollection("collection")
  .aggregate([
    {
      $project : {
        "groupId":1,
        "applicationId":1,
        "integration":1,
        "Category":1,
        "Action":1,
        "Type":1,
        "Id":1,
        "data":1,
        "timestamp":1,
        "createdAt":1,
        "updatedAt":1,
        "__v":1
        createdDate: { $dateToString: {format: "%G-%m-%d", date: "$createdAt"}},
      }
    },
    {
        $group: { _id: "$createdDate", count: { $sum: 1 } },

    }
  ]);

,然后public interface AnimalInfo { public String getInfo(); } Dog类都可以实现此接口。

Cat

然后在commUtil内部,该参数可以使用接口类型class Dog implements AnimalInfo { ... public String getInfo() { return "name="+name+", weight="+weight; } class Cat implements AnimalInfo { ... public String getInfo() { return "name="+name+", age="+age; }

AnimalInfo

答案 1 :(得分:1)

这就是继承的目的,因此您将创建一个abstract超级类,在这种情况下可能称为Animal,然后DogCat将该类扩展为子类。 Here是有关继承的相当简单的教程。

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());
    }
}

我们的输出将是:

  

我是Dog型动物,可以说是WOOF

     

我是名叫詹姆斯的狗,今年5岁。

     

Q:我是一家谱系吗?答:是的

     

我是猫类型的动物,我可以说喵喵

     

我是一只名叫Treacle的猫,今年2岁。

此答案显示简单的inheritancepolymorphism。这是OOP(面向对象编程)的基础,学习Java将成为您学习和理解的基本基础。

在我的示例中,getInfo()实际上可能只是Animal中的一种方法,因为对于每个子类而言,它没有做特定的事情。如果愿意,您也可以将display移到Animal抽象类中,我仅将其放在此处作为示例。

这里不需要任何CommonUtils类或类似的东西,只需了解继承就可以完成您想要的一切。

在此示例中,我们所说的CatDogAnimals,它们继承了任何Animal的所有特征。但是,您无法做的是创建一个随机的Animal对象,例如Animal animal = new Animal("Paul", 4);,无论Animal的类型为Dog,{ {1}}或您创建的Cat的其他某个子类(即AnimalBird甚至是Fish)。

答案 2 :(得分:0)

您可以使用Java反射从对象获取所有字段,下面是示例,您可以通过实用工具类中的T参数方法来实现此目的

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));
    }
}

 }

答案 3 :(得分:0)

您可以具有CommonUtil类,如下所示。另外,在尝试使用类名访问显示方法时,将其设置为静态。

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());

        }
    }

}

但是正如注释中所述,您可以在每个类中重写toString()方法并显示所有这些类的对象。

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

答案 4 :(得分:-1)

使用Cat运算符检查对象是Dog还是instanceof的实例。然后,必须执行强制转换以访问对象的getter方法。

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

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