面向对象的概念

标签 java oop

美好的一天!

我正在复习 Java OO 概念。 并编写了以下代码:

  public class Main {  
        public static void main(String[] args) {
            Animal dog = new Dog();
            dog.eat();
            dog.sleep();
        }

    }

abstract public class Animal {

    private int age;
    public Animal (){
        age = 1;
    } 
    public Animal (int age){   //How can I call this constructor?
        this.age = age;
    }
    public void eat(){
        System.out.println("Eat");
    }
    abstract public void sleep();
}

abstract public class Canine extends Animal{

    abstract public void roam();

}

public interface Pet {

    public String petName = null;  //i want the pets to have a variable petName.
    public void trick();
    }


public class Dog extends Canine implements Pet{

    public void roam(){
        System.out.println("roam");
    };

    public void sleep(){
        System.out.println("sleep");
    };

    public void eat(){
        System.out.println("Eat Dog");
    };

    public void trick(){
        System.out.println("trick");
    }

}

我有几个问题如下:

  1. 如何调用 Animal Overloaded 构造函数?

  2. 如何在 PET 界面中使用变量 petName?

  3. 我是否正确理解了 OO 的概念?我违反了哪些规则?

提前谢谢你。

最佳答案

  1. 子类将使用 super(...) 作为第一行从它们自己的构造函数中调用 super 构造函数!
  2. 接口(interface)不能有变量或状态 - 只有方法!
  3. 您的概念很好,但您的代码无法编译(由于上述第 2 项)。

一些解决方案:

public interface Pet {
    String getName();
    void trick();
}

现在 Dog 类(或任何实现 Pet 的类)必须实现 Pet.getName()。为 Dog 类提供一个名为“name”的 String 类型的字段,并从 Dog.getName() 返回它。

public abstract class Canine extends Animal {
    public Canine(int age) {
        super(age); // pass the age parameter up to Animal
    }
    ...
}

public class Dog extends Canine implements Pet {
    private final String name;
    public Dog(String name,int age) {
       super(age); // call the age constructor
       this.name=name;
    }
    public String getName() { return name; }
    ... rest of class ...
}

每个子类(尤其是抽象子类)都需要为您要调用的所有 父类构造函数提供匹配的构造函数! (所以我将 age 参数添加到 Canine 构造函数中,以便 Dog 可以将 age 参数传递给它。

关于面向对象的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5576249/

相关文章:

java - 启动 SQLWorkbench/J 时为 "Unable to load Java Runtime Environment"

Java EE -- 初学者的配置问题

java - Log4j 2x 中的 DailyRollingFileAppender 替代方案

java - 正则表达式提取字符串,为什么我的模式不起作用?

java - Android LoaderManager 和 CursorLoader 混淆

MATLAB - 如何比较两个对象是否相同或不同

php - php __set()、__get和简单设置、获取函数的区别

c++ - 将类的属性泄露给它的组件

python - 在 python 类中使用不同类型变量的指南?

php - fatal error : Uncaught Error: Call to a member function select() on null