如何在android Java中使用子类(继承)

Posted

技术标签:

【中文标题】如何在android Java中使用子类(继承)【英文标题】:How to use child class in android Java (inheritance) 【发布时间】:2021-04-16 02:40:32 【问题描述】:

我对编码还很陌生,请帮助我了解如何在带有 Java 的 android 中使用继承。让我用一个例子来解释我的问题:

就像有一个名为“Animal”的父类,它包括“name”和“age”,并有两个子类“Dog”和“Cat”。 “Dog”类有“name”、“age”、“food”,“Cat”类有“name”、“age”、“breed”作为属性。

据我了解,最佳做法是:

    具有“name”、“age”属性的动物类+构造函数和getter和setter

public class Animal
    private String name;
    private int age;

    public Animal() 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

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

    public int getAge() 
        return age;
    

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


    Dog 类扩展了 Animal 类的属性为“food”并放置了 getter 和 setter
   private String food;
   

    public String getFood() 
        return food;
    

    public void setFood(String food) 
        this.food = food;
    

    Cat 类扩展了 Animal 类的属性为“breed”并放置了 getter 和 setter
    private String breed;


    public String getBreed() 
        return breed;
    

    public void setBreed(String breed) 
        this.breed = breed;
    


    MainActivity 应该是这样的

public class MainActivity extends AppCompatActivity 

    ArrayList<Animal> mAnimal = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Dog dog = new Dog();
        dog.setName("The Dog");
        dog.setAge(2);
        dog.setFood("Bone");

        Cat cat = new Cat();
        cat.setName("The Cat");
        cat.setAge(1);
        cat.setBreed("Persian");

        mAnimal.add(dog);
        mAnimal.add(cat);

       
    


现在既然有三个类,每个类都有不同的属性,那么如何在Mainactivity中实现listview来显示所有动物及其食物或品种的列表(取决于它们有哪一种)?

非常感谢您提前回答

【问题讨论】:

欢迎堆栈溢出。请阅读this 以获取有关您的问题的帮助。就您目前的问题而言,它的重点不是很集中-您在问各种不同的问题,但到目前为止还没有展示您尝试过的内容 如何为继承类创建表请参考以下链接sqlteam.com/articles/… 感谢您的建议@a_local_nobody,我确实修改了问题 【参考方案1】:

您的问题是指继承,但也涉及多态性。

创建超类和子类

class Animal 
  protected String name;
  protected int age;

 public void animalSound() 
    System.out.print("The animal makes a sound");
  


class Cat extends Animal 

  private boolean isLivesAtHome;

//getters & setters

//override function from super class
  public void animalSound() 
    System.out.print("The Cat says meow");
  


class Dog extends Animal 
private boolean isWasVaccinatedAgainstRabies;

//getters & setters

//override function from super class
  public void animalSound() 
    System.out.print("The dog says bow wow");
  

像这样在 Main 函数上运行它:

class Main 
  public static void main(String[] args) 
    Animal myAnimal = new Animal();  // Create a Animal object - Super Class
    Animal myCat = new Cat();  // Create a Cat object
    Animal myDog = new Dog();  // Create a Dog object

        ArrayList<Animal> arr = new ArrayList<>();
        arr.add(myCat);
        arr.add(myDog);
        arr.add(myAnimal);

        //simple for loop
        for (int i = 0; i < arr.size(); i++)

            //if the object is a Cat instance
            if(arr.get(i) instanceof Cat)

                //change Cat instance variable
                ((Cat)arr.get(i)).setLivesAtHome(true);

                System.out.println("I'm a Cat");
            

            //print animalSound function
            arr.get(i).animalSound();
        
  

此代码打印的:

I'm a Cat
The Cat says meow
The dog says bow wow
The animal makes a sound

这个例子展示了使用单个ArrayList 的多态性和继承概念。

列表是动物。属于超类类型。

dog 也是 animalcat 也是 animal(通过继承),因此您可以将它们添加到 Animal 列表中。

如果你想引用一个特定的对象(比如示例代码中的 Cat),你必须使用 'instance of' 操作符进行 Casting。

有关更多信息,您可以阅读有关 InheritancePolymorphism 的信息。

【讨论】:

谢谢@h.mozrahi,这是一个非常有帮助的解释【参考方案2】:

你可以这样做或类似这样。

型号:

动物:

public class Animal 

Dog dog;
Cat cat;

public Animal(Dog dog, Cat cat) 
    this.dog = dog;
    this.cat = cat;


public Animal() 


public Dog getDog() 
    return dog;


public void setDog(Dog dog) 
    this.dog = dog;


public Cat getCat() 
    return cat;


public void setCat(Cat cat) 
    this.cat = cat;

狗:

public class Dog 
String name;
String age;
String food;

public Dog(String name, String age, String food) 
    this.name = name;
    this.age = age;
    this.food = food;


public String getFood() 
    return food;


public void setFood(String food) 
    this.food = food;

猫:

public class Cat 
String name;
String age;
String breed;

public Cat(String name, String age, String breed) 
    this.name = name;
    this.age = age;
    this.breed = breed;


public String getBreed() 
    return breed;


public void setBreed(String breed) 
    this.breed = breed;

MainActivity.java:

public class TestActivity extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    Animal animal = new Animal();
    animal.setDog(new Dog("tomi", "6","Roti"));

    List<Animal> animals = new ArrayList<>();
    animals.add(animal);

    Log.d("Jay", animals.toString());

【讨论】:

【参考方案3】:

你问的是多态性。这意味着子类继承了它的超类的所有内容。

为了实现你想要的,你会创建你的对象,比如:

Animal dog = new Dog();
((Dog) dog).setBreed("Terrier"); //This is called Casting
...
Animal cat = new Cat();
...

然后在您的 ListView 中显示数据时,您可以检查您的对象是否是特定对象的实例,如下所示:

if(dog instanceof Dog)
   textView.setText(((Dog) dog).getBreed());

【讨论】:

以上是关于如何在android Java中使用子类(继承)的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中子类中父类的对象如何调用父类的方法?

Android 自定义控件

在java中子类若要继承父类,需要使用的关键字是啥

继承和接口

java中一个子类是不是可以继承父类的构造方法

java中子类继承了父类就可以使用父类的方法了,那为啥还要用super?