如何访问每个班级的成员?
我上了“猫和狗”课程。它们具有不同的类成员变量。 我尝试创建一个函数“ 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
答案 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
,然后Dog
和Cat
将该类扩展为子类。 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岁。
此答案显示简单的inheritance和polymorphism。这是OOP(面向对象编程)的基础,学习Java将成为您学习和理解的基本基础。
在我的示例中,getInfo()
实际上可能只是Animal中的一种方法,因为对于每个子类而言,它没有做特定的事情。如果愿意,您也可以将display
移到Animal
抽象类中,我仅将其放在此处作为示例。
这里不需要任何CommonUtils
类或类似的东西,只需了解继承就可以完成您想要的一切。
在此示例中,我们所说的Cat
和Dog
是Animals
,它们继承了任何Animal
的所有特征。但是,您无法做的是创建一个随机的Animal
对象,例如Animal animal = new Animal("Paul", 4);
,无论Animal
的类型为Dog
,{ {1}}或您创建的Cat
的其他某个子类(即Animal
,Bird
甚至是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());
}