【问题标题】:Inheritance vs Object Creation in Java [closed]Java中的继承与对象创建[关闭]
【发布时间】:2017-09-12 10:08:49
【问题描述】:

当我们可以创建另一个类的对象并使用它的方法和实例变量时,为什么要使用继承? (反之亦然——为什么我们只能使用继承来创建另一个类的对象?)

这不是作业问题。我在老师教我们继承的时候问了这个问题,他不知道答案。我问了我的补习老师,他也帮不了我。我多次阅读教科书,在互联网上搜索了一个简单的解释,但没有运气。请帮帮我。

【问题讨论】:

  • 这不是编程学习页面!
  • 我不明白...我只是一个新手。请详细说明和帮助。请解释一下我做错了什么。
  • 这是一个非常广泛的问题。您基本上是在要求某人解释继承。尝试阅读 the wikipedia article on inheritance 以帮助您入门。
  • 非常感谢@khelwood。只是当我们在学校问这样的问题时,他们总是避开我们,而我在互联网上找不到任何东西。

标签: java oop inheritance polymorphism


【解决方案1】:

继承和组合都可以交替用于代码重用能力。

为什么组合优先于继承? 最好使用组合而不是继承,因为它服务于代码重用能力的目的,而无需担心更改的涓滴效应。因此,它提供了更松散的耦合,我们不必担心更改某些代码会导致其他一些需要更改的依赖代码。

例如: 考虑我们有以下类:

    class Person
    {
        public String name;
        public int age;

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


    class Student : Person
    {
        public String rollNumber;
        public double cgpa;


        public Student(String rollNumber,double cgpa,String name,int age):base(name,age)
        {
            this.rollNumber = rollNumber;
            this.cgpa = cgpa;
        }
    }

    //and the main which call these as
    static void Main(string[] args)
    {
        Student student = new Student("Roll1234", 3.5, "John Doe", 32);
    }

现在,如果 Person 类要更改并如下所示:

class Person
{
    public String firstName;
    public String lastName;
    public int age;

    public Person(String firstName, String lastName, int age)
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}

如果不更改从 Person 类继承的所有类(在我们的 Student 类中),则无法实现此更改。

现在考虑另一种情况,我们在下面的代码中使用了组合:

class Person
{
    public String name;
    public int age;

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

class Student 
{
    public String rollNumber;
    public double cgpa;

    public Person person;

    public Student(String rollNumber,double cgpa,Person person)
    {
        this.rollNumber = rollNumber;
        this.cgpa = cgpa;
        this.person = person;
    }
}

//and the main
static void Main(string[] args)
{
    Person person = new Person("John Doe", 32);
    Student student = new Student("Roll1234", 3.5, person);
}

现在在这种情况下,如果我们要对 Person 类进行如下更改:

class Person
{
    public String firstName;
    public String lastName;
    public int age;

    public Person(String firstName, String lastName, int age)
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}

我们根本不需要更改 Student 班级。因此,组合使我们的设计在变化时更加灵活。

然而经验法则是,如果存在“is a”关系,则选择继承,而“has a”关系则选择组合。

但请记住,如果您想实现代码重用组合将始终是一个更好的选择。

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 2016-07-02
    • 2013-12-25
    • 2011-12-10
    • 2013-01-19
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多