Рубрики

Сравнение наследования в C ++ и Java

Цель наследования одинакова в C ++ и Java. Наследование используется на обоих языках для повторного использования кода и / или создания отношений is-a. Существуют следующие различия в том, как оба языка поддерживают наследование.

1) В Java все классы наследуются от класса Object прямо или косвенно. Следовательно, в Java всегда есть одно дерево наследования классов, а класс Object является корнем этого дерева. В Java, если мы создаем класс, который не наследуется ни от какого класса, он автоматически наследуется от класса Object . В C ++ есть лес классов; когда мы создаем класс, который ничего не наследует, мы создаем новое дерево в лесу.

Следующий пример Java показывает, что класс Test автоматически наследуется от класса Object.

class Test { 

    // участники теста

}

class Main {

  public static void main(String[] args) {

    Test t = new Test();    

    System.out.println("t is instanceof Object: " + (t instanceof Object));

  }

}

Выход:

t is instanceof Object: true

2) В Java члены класса grandparent не доступны напрямую. Смотрите этот G-Fact для более подробной информации.

3) Значение спецификатора доступа к защищенному члену несколько отличается в Java. В Java защищенные члены класса «A» доступны в другом классе «B» того же пакета, даже если B не наследуется от A (они оба должны быть в одном пакете). Например, в следующей программе защищенные члены A доступны в B.

// имя файла B.java

class A {

    protected int x = 10, y = 20;

}

   

class B {

    public static void main(String args[]) {

        A a = new A();

        System.out.println(a.x + " " + a.y);

    }

}

4) Java использует ключевое слово extends для наследования. В отличие от C ++, Java не предоставляет спецификатора наследования, такого как public, protected или private. Поэтому мы не можем изменить уровень защиты членов базового класса в Java, если какой-либо элемент данных является общедоступным или защищенным в базовом классе, тогда он остается открытым или защищенным в производном классе. Как и C ++, закрытые члены базового класса недоступны в производном классе.
В отличие от C ++, в Java нам не нужно помнить те правила наследования, которые являются комбинацией спецификатора доступа базового класса и спецификатора наследования.

5) В Java методы являются виртуальными по умолчанию. В C ++ мы явно используем виртуальное ключевое слово. Смотрите этот G-Fact для более подробной информации.

6) Java использует отдельный интерфейс с ключевыми словами для интерфейсов и абстрактное ключевое слово для абстрактных классов и абстрактных функций.

Ниже приведен пример абстрактного класса Java.

// Пример абстрактного класса

abstract class myAbstractClass {

     

   // Абстрактный метод

   abstract void myAbstractFun();

    

   // Нормальный метод

   void fun() { 

      System.out.println("Inside My fun");

   

}

  

public class myClass extends myAbstractClass {

   public void myAbstractFun() {

      System.out.println("Inside My fun");

   }

}

Ниже приведен пример интерфейса Java

// Пример интерфейса

public interface myInterface {

   // myAbstractFun () является публичным и абстрактным, даже если мы не используем эти ключевые слова

   void myAbstractFun();  // аналогично public abstract void myAbstractFun ()

}

  
// Обратите внимание также на ключевое слово Implements.

public class myClass implements myInterface {

   public void myAbstractFun() {

      System.out.println("Inside My fun");

   }

}

7) В отличие от C ++, Java не поддерживает множественное наследование. Класс не может наследоваться от более чем одного класса. Класс может реализовать несколько интерфейсов, хотя.

8) В C ++ конструктор по умолчанию родительского класса вызывается автоматически, но если мы хотим вызвать параметризованный конструктор родительского класса, мы должны использовать список Initializer . Как и C ++, конструктор по умолчанию родительского класса автоматически вызывается в Java, но если мы хотим вызвать параметризованный конструктор, то мы должны использовать super для вызова родительского конструктора. Смотрите следующий пример Java.

package main;

   

class Base {

    private int b;

    Base(int x) {

        b = x;

        System.out.println("Base constructor called");

    }                

}

   

class Derived extends Base {

    private int d;

    Derived(int x, int y) {

        // Вызов параметризованного конструктора родительского класса

        // Вызов родительского конструктора должен быть первой строкой в производном классе

        super(x);

        d = y;

        System.out.println("Derived constructor called");

    }                    

}

   

class Main{

    public static void main(String[] args) {

      Derived obj = new Derived(1, 2);

    }

}

Выход:

Base constructor called
Derived constructor called

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Сравнение наследования в C ++ и Java

0.00 (0%) 0 votes