Невозможно вызвать метод суперкласса - PullRequest
0 голосов
/ 25 сентября 2018
  • Это простая демонстрация наследования.Здесь я не могу вызвать метод суперкласса.
  • Я пытаюсь реализовать переопределение метода здесь.

.

class supers {
    int x, y;

    supers(int a, int b) {
        x = a;
        y = b;
    }

    final void volume() {
        System.out.println("area is " + x * y);
    }
}

class sub extends supers {
    int z;

    sub(int a, int b, int c) {
        super(a, b);
        z = c;
    }

    void volume() {
        System.out.println("volume is " + x * y * z);
    }
}

class m{
    public static void main(String args[]) {
        supers obj = new sub(1, 2, 3);
        obj.volume();
    }
}

Ответы [ 5 ]

0 голосов
/ 25 сентября 2018

Просто удалите последнее ключевое слово, так как оно останавливает переопределение.Также используйте имя класса после супер ключевого слова.

0 голосов
/ 25 сентября 2018
class Super {

    final void inherit() {
    // the method states that you cannot inherit this method to you sub-class
    }
}

class SubClass extends Super {

    //This is not allowed as you cannot inherit and get the compile time exception to remove final keyword.

    /*void inherit() {

    }*/
}

следовательно, чтобы вызвать метод тома суперкласса, вам нужно удалить ключевое слово final из метода тома суперкласса.

0 голосов
/ 25 сентября 2018

Напишите void volume() вместо final void volume

Не используйте ключевое слово final.Ваша программа должна выглядеть так:

import java.util.*;

class Supers {
    int x,y; 
    Supers(int a,int b) {
    x = a;
    y = b;
} 
void volume() {
    System.out.println("area is "+ x*y); 
 } 
} 
  class Sub extends Supers {
  int z; 
  Sub(int a,int b,int c) { 
  super(a,b); 
  z = c;
} 
  void volume() { 
  super.volume(); // Call volume() method of Supers class
  System.out.println("volume is "+ x*y*z); 
 }  
}

class M {
   public static void main(String args[]) {
   Sub obj = new Sub(1,2,3);
   obj.volume(); 
 } 
}

Используйте final, если вы хотите, чтобы подклассы не перекрывали членов суперкласса.

В вышеприведенной программе у нас есть метод volume() с тем же именем и тем же параметром в подклассе, как и в родительском классе.Поэтому метод volume(), пока мы наследуем родительский класс, будет переопределен в подклассе.И именно поэтому строка System.out.println("area is "+ x*y); не может быть напечатана, потому что метод volume() подкласса переопределит метод.Таким образом, будет выполнена строка System.out.println("volume is "+ x*y*z);.

Для вызова метода тома класса Supers наиболее эффективным способом является использование super.volume() в методе volume () подкласса, как показано в приведенном выше коде.

Вывод:

area is 2 volume is 6

Или мы можем создать объект в основном методе.Тогда это будет выглядеть так:

class M {
   public static void main(String args[]) {
   Supers obj1 = new Supers(2,4);
   obj1.volume();
   Sub obj = new Sub(1,2,3);
   obj.volume(); 
  } 
}

Или вместо доступа к методу volume () суперкласса, мы можем просто добавить System.out.println("area is "+ x*y); в метод volume () подкласса.

void volume() { 
   System.out.println("area is "+ x*y); 
   System.out.println("volume is "+ x*y*z); 
} 
0 голосов
/ 25 сентября 2018
  • Во-первых, так как метод final, он не может быть переопределен в производном классе.Таким образом, ключевое слово final должно быть удалено.
  • И, во-вторых, вы можете использовать ключевое слово super для вызова метода базового класса.
  • Производный класс можно изменить следующим образом: super.method_name();:

    class sub extends supers {
    
        int z;
    
        sub(int a, int b, int c) {
            super(a, b);
            z = c;
        }
    
        void volume() {
            super.volume();
            System.out.println("volume is " + x * y * z);
        }
    
    }
    
0 голосов
/ 25 сентября 2018

Одна проблема в том, что вы объявили volume() как final в классе supers.Это означает, что переопределение в дочернем классе запрещено компилятором.

Методы могут также должны быть объявлены как public.Это зависит от того, находятся ли классы в одном (именованном) пакете 1 .(Если они есть, методы могут оставаться частными как пакеты. Если нет, то методы, конструкторы и / или сами классы могут нуждаться в public.)


Наконец, вам нужноизучить соглашения об именах Java.Имя класса должно всегда начинаться с заглавной буквы.


1 - это не ясно из фрагментов.Похоже, они показывают один файл без объявления package.Но это не скомпилирует ... потому что исходный файл, содержащий классы в пакете "default", требует, чтобы один из классов был public.Ссылка на закрытый класс пакета в пакете «по умолчанию» затруднена.По сути, использование пакета «default» - плохая идея для практических приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...