Подтвердить что ты не робот

Можно ли переопределить частный метод в суперклассе в подклассе?

Можно ли переопределить частные методы в Java? Если нет, то как работает следующий код?

class Base{
      private void func(){
            System.out.println("In Base Class func method !!");         
      };
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("In Derived Class func method"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();
            d.func(); 
      }
}
4b9b3361

Ответ 1

Нет, вы не переопределяете это. Вы можете проверить, поставив отметку с помощью @Override или попытавшись сделать вызов super.func();. Оба не будут работать; они бросают ошибки компилятора.

Кроме того, проверьте это:

class Base {
      private void func(){
            System.out.println("In base func method");         
      };
      public void func2() {
          System.out.println("func2");
          func();
      }
}

class Derived extends Base {
      public void func(){   //  Is this an overriding method?
            System.out.println("In Derived Class func method"); 
      }
}

class InheritDemo {
      public static void main(String [] args) {
            Derived D = new Derived();
            D.func2(); 
      }
}

Он будет печатать:

func2
In base func method

Когда вы меняете func() в Base на общедоступный, тогда это будет переопределение, и выход изменится на:

func2
In Derived Class func method

Ответ 2

Нет, закрытый метод не может быть переопределен, потому что подкласс не наследует своих родительских закрытых членов. Вы объявили новый метод для своего подкласса, который не имеет отношения к методу суперкласса. Один из способов взглянуть на это - спросить себя, было бы законно писать super.func() в классе Derived. Нет никакого способа, которым переопределяющий метод был бы запрещен для доступа к методу, который он переопределяет, но это точно будет иметь место здесь.

Ответ 3

Нет, это не так. Вы можете отметить переопределение, чтобы убедиться в следующем:

@Override
public void func(){
     System.out.println("In Derived Class func method"); 
}

И в этом случае это будет ошибка компилятора.

Ответ 4

Вы не переопределяете. Вы не можете переопределить частных членов, вы просто определяете новый метод в Derived. Derived не имеет знаний Базовая реализация func() с момента ее объявления как закрытого. Вы не получите ошибку компилятора при определении func() в Derived, но это потому, что Derived не знает, что Base имеет реализацию func(). Чтобы быть ясным: было бы неверно сказать, что вы переопределяете базовую реализацию func().

Ответ 5

В дополнение к уже правильному ответу, учтите это:

public class Private {
    static class A {
        public void doStuff() {
            System.out.println(getStuff());
        }

        private String getStuff() {
            return "A";
        }
    }

    static class B extends A {
        public String getStuff() {
            return "B";
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.doStuff();
        a = new B();
        a.doStuff();
        B b = new B();
        b.doStuff();
    }
}

Это напечатает

хотя B "переопределяет" getStuff(). Реализация doStuff() фиксируется на вызов A#getStuff(), не полиморфизм не будет срабатывать.

Ответ 6

Нет, потому что если вы делаете что-то вроде Base b = new Derived();, вы все равно не сможете вызвать b.func(). То, что вы делаете, называется "скрываться".

Ответ 7

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

Ответ 8

Скрытие метода будет происходить здесь вместо того, чтобы переопределять. как то, что происходит в случае статики.

Ответ 9

Собственно, вы не переопределяете. Перед Java5

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

Но Java 5 представила новое средство, называемое возвращаемым типом covariant. Вы можете переопределить метод с той же сигнатурой, но возвращает подкласс возвращаемого объекта. Другими словами, метод в подклассе может возвращать объект, тип которого является подклассом типа, возвращаемого методом с той же сигнатурой в суперклассе. вы можете следить за этой темой: Могут ли переопределенные методы различаться по типу возврата?

Ответ 10

Частный метод никогда не может быть перегружен. Это всегда скрыто.

В вашем примере - класс Derived имеет один закрытый метод родительского класса и имеет свою собственную функцию func. Оба разные, и функция не перегружена. Это отдельная независимая функция.

Если вы создаете новую функцию родительского класса вызова функции родительского класса, родительский функ будет называться, если используются ссылка родительского класса в противоположности в случае метода над избавлением

Примечание. Объект определяет элементы, которые он имеет, а ссылка определяет, к чему он может получить доступ.

//Метод Over Overding Case

class Base{
      public void func(){
            System.out.println("Parent class");         
      };                                                                   
      public void func1(){                                                
            func();                                                             
       }                                                                        
 }

class Derived extends Base{
      public void func(){         
            System.out.println("Derived class"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();                               
            d.func1(); // Prints Derived class                                          

            Base b = new Derived();                                    
            b.func1();                                                         // Prints Derived class - no matter parent reference is calling,as there as method is overridden - Check func1() is in parent class, but id doesn't call parent class func() as the compiler finds a func() method over ridden in derived class    

      }
}

// Method Hidding case - Private and static methods case  

class Base{
      private void func(){
            System.out.println("Parent class");         
      };                                                                   
      public void func1(){                                                
            func()                                                              
      }     
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("Derived class"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived(); 
            d.func1(); // Prints Derived class
            Base b = new Derived();
            b.func1(); 
// Prints Parent class - the reason is we are using the parent class reference, so compiler is looking for func() and it founds that there is one private class method which is available and is not over ridden, so it will call it. Caution - this won't happen if called using derived class reference.

            b.func();
// this prints the Derived class - the compiler is looking func(), as Derived class has only one func() that it is implementing, so it will call that function. 

      }
}

Ответ 11

Закрытый член базового класса не может быть доступен никому за пределами класса и не может быть переопределен. Функция в производном классе является независимой функцией, доступ к которой можно получить из любого места.

Код будет запускать функцию в производном классе

Ответ 12

Вы не можете переопределить что-то невидимое или не существует для подкласса.

Ответ 13

Прочтите комментарии в приведенном ниже фрагменте кода, чтобы найти ответ.

Источники:

  1. Определение ссылки:

  2. Кредиты для примера исходного кода (ссылки) из книги - "Книга OCA Oracle Certified Associate Java SE 8 Programmer Study Exam 1Z0-808" от "Жанны Боярской" и "Скотта Селикоффа".

     public class Deer {
            public Deer() { System.out.print("Deer"); }
            public Deer(int age) { System.out.print("DeerAge"); }
            private boolean hasHorns() {  return false; }
            public static void main(String[] args) {
                Deer deer = new Reindeer(5);
                System.out.println(","+deer.hasHorns());// false is printed.
            }
        }
        class Reindeer extends Deer {
            public Reindeer(int age) { System.out.print("Reindeer"); }
            private boolean hasHorns() { return true; } // Overriding possible, but is of no use in the below context.
            // Below code is added by me for illustration purpose
            public static void main(String[] args) {
                Deer deer = new Reindeer(5);
                //Below line gives compilation error.
                //System.out.println(","+deer.hasHorns());
            }
        }